Hex Artifact Content

Artifact d656aab33592a4a95933c544d22d0eb44d9afd4617b0e8a8965af98f6d990e85:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 22 74 6c 73 55 75 69 64 2e  nclude "tlsUuid.
0390: 68 22 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 2f 2a 0a 20 2a 20  ".#endif../*. * 
0450: 45 78 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f  External functio
0460: 6e 73 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f  ns. */../*. * Fo
0470: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
0480: 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20  ns. */..#define 
0490: 46 32 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a  F2N(key, dsp) \.
04a0: 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c  .(((key) == NULL
04b0: 29 20 3f 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  ) ? (char *)NULL
04c0: 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73   : \...Tcl_Trans
04d0: 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74  lateFileName(int
04e0: 65 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70  erp, (key), (dsp
04f0: 29 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f  )))..static SSL_
0500: 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 74  CTX *CTX_Init(St
0510: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69  ate *statePtr, i
0520: 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74  nt isServer, int
0530: 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65   proto, char *ke
0540: 79 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 66  y,...char *certf
0550: 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
0560: 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e  ar *key_asn1, un
0570: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
0580: 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65  t_asn1,...int ke
0590: 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20  y_asn1_len, int 
05a0: 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63  cert_asn1_len, c
05b0: 68 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61  har *CApath, cha
05c0: 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61  r *CAfile,...cha
05d0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
05e0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
05f0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
0600: 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61  *DHparams);..sta
0610: 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e  tic int.TlsLibIn
0620: 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
0630: 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54  ize);..#define T
0640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30  LS_PROTO_SSL2..0
0650: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x01.#define TLS_
0660: 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32  PROTO_SSL3..0x02
0670: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0680: 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64  TO_TLS1..0x04.#d
0690: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
06a0: 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66  TLS1_1.0x08.#def
06b0: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
06c0: 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e  S1_2.0x10.#defin
06d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
06e0: 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20  _3.0x20.#define 
06f0: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61  ENABLED(flag, ma
0700: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28  sk).(((flag) & (
0710: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29  mask)) == (mask)
0720: 29 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45  )..#define SSLKE
0730: 59 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45  YLOGFILE.."SSLKE
0740: 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a  YLOGFILE"../*. *
0750: 20 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53   Thread-Safe TLS
0760: 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65   Code. */..#ifde
0770: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64  f TCL_THREADS.#d
0780: 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48  efine OPENSSL_TH
0790: 52 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e  READ_DEFINES.#in
07a0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f  clude <openssl/o
07b0: 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23  pensslconf.h>..#
07c0: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48  ifdef OPENSSL_TH
07d0: 52 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c  READS.#include <
07e0: 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68  openssl/crypto.h
07f0: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0800: 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20  ssl/ssl.h>../*. 
0810: 2a 20 54 68 72 65 61 64 65 64 20 6f 70 65 72 61  * Threaded opera
0820: 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f  tion requires lo
0830: 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a  cking callbacks.
0840: 20 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63   * Based from /c
0850: 72 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63  rypto/cryptlib.c
0860: 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20   of OpenSSL and 
0870: 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a  NSOpenSSL.. */..
0880: 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78  static Tcl_Mutex
0890: 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a   *locks = NULL;.
08a0: 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73  static int locks
08b0: 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69  Count = 0;.stati
08c0: 63 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74  c Tcl_Mutex init
08d0: 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  _mx;.#endif /* O
08e0: 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a  PENSSL_THREADS *
08f0: 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f  /.#endif /* TCL_
0900: 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a  THREADS */..../*
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0920: 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b  ***/./* Callback
0930: 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a  s        */./***
0940: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0950: 2a 2f 0a 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
09a0: 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b   * Eval Callback
09b0: 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20   Command --. *. 
09c0: 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  *.Eval callback 
09d0: 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63  command and catc
09e0: 68 20 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a  h any errors. *.
09f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30   * Results:. *.0
0a00: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72   = Command retur
0a10: 6e 65 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c  ned fail or eval
0a20: 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52   returned TCL_ER
0a30: 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61  ROR. *.1 = Comma
0a40: 6e 64 20 72 65 74 75 72 6e 65 64 20 73 75 63 63  nd returned succ
0a50: 65 73 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75  ess or eval retu
0a60: 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20  rned TCL_OK. *. 
0a70: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
0a80: 20 2a 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c   *.Evaluates cal
0a90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a  lback command. *
0aa0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ae0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
0af0: 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61  c int.EvalCallba
0b00: 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ck(Tcl_Interp *i
0b10: 6e 74 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74  nterp, State *st
0b20: 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20  atePtr, Tcl_Obj 
0b30: 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69  *cmdPtr) {.    i
0b40: 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b  nt code, ok = 0;
0b50: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
0b60: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63  alled");..    Tc
0b70: 6c 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69 64  l_Preserve((void
0b80: 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20   *) interp);.   
0b90: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76   Tcl_Preserve((v
0ba0: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
0bb0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
0bc0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63  allback with suc
0bd0: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72  cess for ok or r
0be0: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66  eturn value 1, f
0bf0: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72  ail for error or
0c00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20   return value 0 
0c10: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
0c20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0c30: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
0c40: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
0c50: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
0c60: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64  L_GLOBAL);.    d
0c70: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c  printf("EvalCall
0c80: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29  back: %d", code)
0c90: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ;.    if (code =
0ca0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20  = TCL_OK) {../* 
0cb0: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72  Check result for
0cc0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
0cd0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0ce0: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
0cf0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  sult(interp);..i
0d00: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c  f (result == NUL
0d10: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46  L || Tcl_GetIntF
0d20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
0d30: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54  esult, &ok) != T
0d40: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b  CL_OK) {..    ok
0d50: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74   = 1;..}..dprint
0d60: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20  f("Result: %d", 
0d70: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ok);.    } else 
0d80: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65  {../* Error - re
0d90: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69  ject the certifi
0da0: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66  cate */..dprintf
0db0: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ("Tcl_Background
0dc0: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43  Error");.#if (TC
0dd0: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0de0: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0df0: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0e00: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0e10: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0e20: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0e30: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0e40: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0e50: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64  cl_Release((void
0e70: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20   *) statePtr);. 
0e80: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
0e90: 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b  void *) interp);
0ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a  .    return ok;.
0eb0: 7d 0a 0c 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0f00: 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20   * InfoCallback 
0f10: 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72  --. *. *.Monitor
0f20: 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e  s SSL connection
0f30: 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52   process. *. * R
0f40: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
0f50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
0f60: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
0f70: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
0f80: 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d). *. *--------
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 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f  static void.Info
0fe0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
0ff0: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65  SL *ssl, int whe
1000: 72 65 2c 20 69 6e 74 20 72 65 74 29 0a 7b 0a 20  re, int ret).{. 
1010: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
1020: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr = (State*)SSL
1030: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53  _get_app_data((S
1040: 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54  SL *)ssl);.    T
1050: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1060: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
1070: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
1080: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63  j *cmdPtr;.    c
1090: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61 6a 6f 72  onst char *major
10a0: 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64  , *minor;..    d
10b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
10c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
10d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
10e0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
10f0: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ..return;..    i
1100: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1110: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
1120: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
1130: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
1140: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
1150: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
1160: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
1170: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
1180: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
1190: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
11a0: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
11b0: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
11c0: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
11d0: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
11e0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
11f0: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
1200: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
1210: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1220: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
1230: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
1240: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
1250: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
1260: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
1270: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
1280: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
1290: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12a0: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
12b0: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
12c0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
12d0: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
12e0: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
12f0: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1300: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
1310: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
1320: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
1330: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
1340: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
1350: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
1360: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
1370: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c  n, major, minor,
1380: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79   message, and ty
1390: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  pe args */.    c
13a0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
13b0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
13c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
13d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
13e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
13f0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1400: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1410: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
1420: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1430: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1440: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
1450: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
1460: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
1470: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
1480: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1490: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
14a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
14b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
14c0: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29  gObj(major, -1))
14d0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
14e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14f0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1500: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1510: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  minor, -1));..  
1520: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
1530: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54  L_CB_ALERT) {..T
1540: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1550: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1560: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
1570: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1580: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1590: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d  ing_long(ret), -
15a0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
15b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
15c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
15d0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
15e0: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74  gObj(SSL_alert_t
15f0: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ype_string_long(
1600: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ret), -1));.    
1610: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
1620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1640: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1650: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61  tringObj(SSL_sta
1660: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
1670: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  sl), -1));..Tcl_
1680: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1690: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
16a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
16b0: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
16c0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
16d0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
16e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
16f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1700: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
1710: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
1720: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
1730: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
1740: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
1750: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
17a0: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c   *. * MessageCal
17b0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
17c0: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74  onitors SSL prot
17d0: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a  ocol messages. *
17e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
17f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
1800: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
1810: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
1820: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d  efined). *. *---
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  . */.#ifndef OPE
1880: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
1890: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65  E.static void.Me
18a0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e  ssageCallback(in
18b0: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76  t write_p, int v
18c0: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74  ersion, int cont
18d0: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ent_type, const 
18e0: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f  void *buf, size_
18f0: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c  t len, SSL *ssl,
1900: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
1910: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
1920: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
1930: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
1940: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
1950: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
1960: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
1970: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20  .    char *ver, 
1980: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a  *type;.    BIO *
1990: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75  bio;.    char bu
19a0: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20  ffer[15000];.   
19b0: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a   buffer[0] = 0;.
19c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
19d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
19e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
19f0: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1a00: 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a  )NULL)..return;.
1a10: 0a 20 20 20 20 73 77 69 74 63 68 28 76 65 72 73  .    switch(vers
1a20: 69 6f 6e 29 20 7b 0a 23 69 66 20 21 64 65 66 69  ion) {.#if !defi
1a30: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
1a40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
1a50: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61  _NO_SSL3).    ca
1a60: 73 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a  se SSL3_VERSION:
1a70: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b  ..ver = "SSLv3";
1a80: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1a90: 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45      case TLS1_VE
1aa0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1ab0: 4c 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  LSv1";..break;. 
1ac0: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56     case TLS1_1_V
1ad0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1ae0: 54 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b  TLSv1.1";..break
1af0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f  ;.    case TLS1_
1b00: 32 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  2_VERSION:..ver 
1b10: 3d 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72  = "TLSv1.2";..br
1b20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c  eak;.    case TL
1b30: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  S1_3_VERSION:..v
1b40: 65 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a  er = "TLSv1.3";.
1b50: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1b60: 20 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65   0:..ver = "none
1b70: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64  ";..break;.    d
1b80: 65 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22  efault:..ver = "
1b90: 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b  unknown";..break
1ba0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
1bb0: 74 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70  tch (content_typ
1bc0: 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53  e) {.    case SS
1bd0: 4c 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74  L3_RT_HEADER:..t
1be0: 79 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a  ype = "Header";.
1bf0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1c00: 20 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43   SSL3_RT_INNER_C
1c10: 4f 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79  ONTENT_TYPE:..ty
1c20: 70 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74  pe = "Inner Cont
1c30: 65 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61  ent Type";..brea
1c40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1c50: 5f 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45  _RT_CHANGE_CIPHE
1c60: 52 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20  R_SPEC:..type = 
1c70: 22 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b  "Change Cipher";
1c80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1c90: 65 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a  e SSL3_RT_ALERT:
1ca0: 0a 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22  ..type = "Alert"
1cb0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1cc0: 73 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53  se SSL3_RT_HANDS
1cd0: 48 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48  HAKE:..type = "H
1ce0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61  andshake";..brea
1cf0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1d00: 5f 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f  _RT_APPLICATION_
1d10: 44 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41  DATA:..type = "A
1d20: 70 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b  pp Data";..break
1d30: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
1d40: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
1d50: 78 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63  x30000000L.    c
1d60: 61 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41  ase DTLS1_RT_HEA
1d70: 52 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20  RTBEAT:..type = 
1d80: 22 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72  "Heartbeat";..br
1d90: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
1da0: 64 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d  default:..type =
1db0: 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20   "unknown";.    
1dc0: 7d 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20  }..    /* Needs 
1dd0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74  compile time opt
1de0: 69 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d  ion "enable-ssl-
1df0: 74 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69  trace". */.    i
1e00: 66 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65  f ((bio = BIO_ne
1e10: 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20  w(BIO_s_mem())) 
1e20: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20  != NULL) {..int 
1e30: 6e 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72  n;..SSL_trace(wr
1e40: 69 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20  ite_p, version, 
1e50: 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75  content_type, bu
1e60: 66 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f  f, len, ssl, (vo
1e70: 69 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20  id *)bio);..n = 
1e80: 42 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75  BIO_read(bio, bu
1e90: 66 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e  ffer, BIO_pendin
1ea0: 67 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f  g(bio) < 15000 ?
1eb0: 20 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f   BIO_pending(bio
1ec0: 29 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d  ) : 14999);..n =
1ed0: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a   (n<0) ? 0 : n;.
1ee0: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a  .buffer[n] = 0;.
1ef0: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68  .(void)BIO_flush
1f00: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  (bio);..BIO_free
1f10: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20  (bio);.   }..   
1f20: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1f30: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
1f40: 66 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74  fn, chan, direct
1f50: 69 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79  ion, version, ty
1f60: 70 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20  pe, and message 
1f70: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
1f80: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
1f90: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
1fa0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54  callback);.    T
1fb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1fc0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1fd0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1fe0: 74 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67  tringObj("messag
1ff0: 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  e", -1));.    Tc
2000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2020: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
2030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
2040: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
2050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
2060: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
20a0: 67 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22  gObj(write_p ? "
20b0: 53 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65  Sent" : "Receive
20c0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
20d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
20e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
20f0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2100: 72 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29  ringObj(ver, -1)
2110: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2120: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2130: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2140: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2150: 28 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20  (type, -1));.   
2160: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2170: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2180: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2190: 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
21a0: 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a  r, -1));..    /*
21b0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
21c0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
21d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
21e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
21f0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
2200: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
2210: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
2220: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2230: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a  ;.}.#endif.../*.
2240: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69  -----. *. * Veri
2290: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  fyCallback --. *
22a0: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.Monitors SSL
22b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
22c0: 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e  idation process.
22d0: 20 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c   Used to control
22e0: 20 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72   the. *.behavior
22f0: 20 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45   when the SSL_VE
2300: 52 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69  RIFY_PEER flag i
2310: 73 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63  s set. This is c
2320: 61 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65  alled. *.wheneve
2330: 72 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20  r a certificate 
2340: 69 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20  is inspected or 
2350: 64 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e  decided invalid.
2360: 20 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65   Called for. *.e
2370: 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20  ach certificate 
2380: 69 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69  in the cert chai
2390: 6e 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a  n.. *. * Checks:
23a0: 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20  . *.certificate 
23b0: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64  chain is checked
23c0: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
23d0: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69  he deepest nesti
23e0: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74  ng level. *.  (t
23f0: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69  he root CA certi
2400: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b  ficate) and work
2410: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65  ed upward to the
2420: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63   peer's certific
2430: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e  ate.. *.All sign
2440: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64  atures are valid
2450: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69  , current time i
2460: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61  s within first a
2470: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79  nd last validity
2480: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20   time.. *.Check 
2490: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69  that the certifi
24a0: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62  cate is issued b
24b0: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72  y the issuer cer
24c0: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e  tificate issuer.
24d0: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65  . *.Check the re
24e0: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20  vocation status 
24f0: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69  for each certifi
2500: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74  cate.. *.Check t
2510: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74  he validity of t
2520: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64  he given CRL and
2530: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61   the cert revoca
2540: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09  tion status.. *.
2550: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69  Check the polici
2560: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65  es of all the ce
2570: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a  rtificates. *. *
2580: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69   Args. *.preveri
2590: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20  fy_ok indicates 
25a0: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74  whether the cert
25b0: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61  ificate verifica
25c0: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20  tion passed (1) 
25d0: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a  or not (0). *. *
25e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63   Results:. *.A c
25f0: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f  allback bound to
2600: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20   the socket may 
2610: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20  return one of:. 
2620: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20  *.    0...- the 
2630: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
2640: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73  eemed invalid, s
2650: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e  end verification
2660: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65  . *....  failure
2670: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20   alert to peer, 
2680: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61  and terminate ha
2690: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20  ndshake.. *.    
26a0: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
26b0: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
26c0: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20  valid, continue 
26d0: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a  with handshake..
26e0: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72   *.    empty str
26f0: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20  ing.- no change 
2700: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76  to certificate v
2710: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  alidation. *. * 
2720: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2730: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
2740: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
2750: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
2760: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
2770: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2780: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2790: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
27a0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
27f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
2800: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74  rifyCallback(int
2810: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f   ok, X509_STORE_
2820: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20  CTX *ctx) {.    
2830: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
2840: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09  .    SSL   *ssl.
2850: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54  .= (SSL*)X509_ST
2860: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64  ORE_CTX_get_ex_d
2870: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74  ata(ctx, SSL_get
2880: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54  _ex_data_X509_ST
2890: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a  ORE_CTX_idx());.
28a0: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
28b0: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
28c0: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
28d0: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
28e0: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
28f0: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
2900: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
2910: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2920: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
2930: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  >interp;.    int
2940: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
2950: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
2960: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
2970: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
2980: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2990: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
29a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
29b0: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  d");.    dprintf
29c0: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
29d0: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
29e0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
29f0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
2a00: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65  )NULL) {../* Use
2a10: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72   ok value if ver
2a20: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71  ification is req
2a30: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74  uired */..if (st
2a40: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
2a50: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
2a60: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
2a70: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
2a80: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
2a90: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
2aa0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
2ab0: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  ert == NULL || s
2ac0: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
2ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
2ae0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2af0: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61  ifyCallback: eva
2b00: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20  l callback");.. 
2b10: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
2b20: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
2b30: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74  h fn, chan, dept
2b40: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73  h, cert info lis
2b50: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65  t, status, and e
2b60: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20  rror args */.   
2b70: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2b80: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2b90: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
2ba0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2bb0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2bc0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bd0: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
2be0: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
2bf0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2c00: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2c10: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2c20: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2c30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2c40: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2c50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2c60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c80: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
2c90: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
2ca0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2cb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2cc0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
2cd0: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
2ce0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2cf0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2d00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2d10: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
2d20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2d30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2d40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2d50: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2d60: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76  bj((char*)X509_v
2d70: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
2d80: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
2d90: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76  ));..    /* Prev
2da0: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61  ent I/O while ca
2db0: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f  llback is in pro
2dc0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20  gress */.    /* 
2dd0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2de0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42  |= TLS_TCL_CALLB
2df0: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ACK; */..    /* 
2e00: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2e10: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2e20: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2e30: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  dPtr);.    ok = 
2e40: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2e50: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2e60: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2e70: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2e80: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Ptr);..    dprin
2e90: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61  tf("VerifyCallba
2ea0: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75  ck: command resu
2eb0: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  lt = %d", ok);..
2ec0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2ed0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2ee0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2ef0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2f00: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2f10: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2f20: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2f30: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2f80: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2f90: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2fa0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2fb0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2fc0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2fd0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2fe0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2ff0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
3000: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
3010: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
3020: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
3030: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
3040: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
30a0: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
30b0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
30c0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
30d0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
30e0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
30f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
3100: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
3110: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3120: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3130: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3140: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3150: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3160: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3170: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
3180: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
3190: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
31a0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
31b0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d 65  fn, chan, and me
31c0: 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20  ssage args */.  
31d0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
31e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
31f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
3200: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3210: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3220: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3230: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3240: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3270: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3280: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3290: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
32a0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
32b0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
32c0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
32d0: 7b 0a 09 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 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3300: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3310: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3320: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
3330: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3340: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3350: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 54  sult(interp), (T
3360: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29  cl_Size *) NULL)
3370: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) != NULL) {..Tc
3380: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3390: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
33a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
33b0: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
33c0: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  );..    } else {
33d0: 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f  ..listPtr = Tcl_
33e0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
33f0: 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72  LL);..while ((er
3400: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
3410: 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20  r()) != 0) {..  
3420: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3430: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3440: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f  p, listPtr, Tcl_
3450: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52  NewStringObj(ERR
3460: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
3470: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
3480: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ..}..Tcl_ListObj
3490: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
34a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69  terp, cmdPtr, li
34b0: 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  stPtr);.    }.. 
34c0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
34d0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
34e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
34f0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
3500: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
3510: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
3520: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
3530: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3540: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  dPtr);.}.../*. *
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67  ---. *. * KeyLog
35a0: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
35b0: 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64  *.Write received
35c0: 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67   key data to log
35d0: 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64   file.. *. * Sid
35e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
35f0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3640: 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  void KeyLogCallb
3650: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
3660: 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  sl, const char *
3670: 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72  line) {.    char
3680: 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53   *str = getenv(S
3690: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20  SLKEYLOGFILE);. 
36a0: 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20     FILE *fd;..  
36b0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
36c0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
36d0: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e  r) {..fd = fopen
36e0: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72  (str, "a");..fpr
36f0: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c  intf(fd, "%s\n",
3700: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66  line);..fclose(f
3710: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  d);.    }.}.../*
3720: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73  ------. *. * Pas
3770: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d  sword Callback -
3780: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
3790: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66  hen a password f
37a0: 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79  or a private key
37b0: 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67   loading/storing
37c0: 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66   a PEM. *.certif
37d0: 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79  icate with encry
37e0: 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c  ption. Evals cal
37f0: 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64  lback script and
3800: 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20   returns. *.the 
3810: 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61  result as the pa
3820: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e  ssword string in
3830: 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   buf.. *. * Resu
3840: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
3850: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3860: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3870: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
3880: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3890: 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20  *.Password size 
38a0: 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66  in bytes or -1 f
38b0: 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  or an error.. *.
38c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
38d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3900: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
3910: 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c   int.PasswordCal
3920: 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c  lback(char *buf,
3930: 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72   int size, int r
3940: 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61  wflag, void *uda
3950: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  ta) {.    State 
3960: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
3970: 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20  te *) udata;.   
3980: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3990: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
39a0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
39b0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
39c0: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20   int code;..    
39d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
39e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  );..    /* If no
39f0: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64   callback, use d
3a00: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20  efault callback 
3a10: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
3a20: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d  Ptr->password ==
3a30: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63   NULL) {..if (Tc
3a40: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c  l_EvalEx(interp,
3a50: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
3a60: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
3a70: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b  LOBAL) == TCL_OK
3a80: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72  ) {..    char *r
3a90: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3aa0: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3ab0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20  t(interp);..    
3ac0: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3ad0: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29  , (size_t) size)
3ae0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
3af0: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a  nt)strlen(ret);.
3b00: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
3b10: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20  eturn -1;..}.   
3b20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3b30: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
3b40: 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61  l with fn, rwfla
3b50: 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73  g, and size args
3b60: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
3b70: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
3b80: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
3b90: 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  word);.    Tcl_L
3ba0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3bb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3bc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3bd0: 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c  gObj("password",
3be0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
3bf0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3c00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3c10: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3c20: 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20  j(rwflag));.    
3c30: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3c40: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3c50: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3c60: 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a  IntObj(size));..
3c70: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3c80: 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70  ((void *) interp
3c90: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  );.    Tcl_Prese
3ca0: 72 76 65 28 28 76 6f 69 64 20 2a 29 20 73 74 61  rve((void *) sta
3cb0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3cc0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3cd0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3ce0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3cf0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
3d00: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3d10: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3d20: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3d30: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
3d40: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
3d50: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
3d60: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
3d70: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
3d80: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
3d90: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
3da0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
3db0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
3dc0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
3dd0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3de0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3df0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3e00: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76 6f 69  Tcl_Release((voi
3e10: 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  d *) statePtr);.
3e20: 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65  .    /* If succe
3e30: 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b  ssful, pass back
3e40: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3e50: 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66   and truncate if
3e60: 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20   too long */.   
3e70: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c   if (code == TCL
3e80: 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65  _OK) {..Tcl_Size
3e90: 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74   len;..char *ret
3ea0: 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f   = (char *) Tcl_
3eb0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
3ec0: 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c  (Tcl_GetObjResul
3ed0: 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29  t(interp), &len)
3ee0: 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63  ;..if (len > (Tc
3ef0: 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20  l_Size) size-1) 
3f00: 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63  {..    len = (Tc
3f10: 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a  l_Size) size-1;.
3f20: 09 7d 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c  .}..strncpy(buf,
3f30: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c   ret, (size_t) l
3f40: 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d  en);..buf[len] =
3f50: 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65   '\0';..Tcl_Rele
3f60: 61 73 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74  ase((void *) int
3f70: 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28 69  erp);..return((i
3f80: 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a  nt) len);.    }.
3f90: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3fa0: 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29  (void *) interp)
3fb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ;.    return -1;
3fc0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
4010: 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c  . * Session Call
4020: 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73  back for Clients
4030: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
4040: 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73   when a new sess
4050: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20  ion is added to 
4060: 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c  the cache. In TL
4070: 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61  S 1.3. *.this ma
4080: 79 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75  y be received mu
4090: 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74  ltiple times aft
40a0: 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  er the handshake
40b0: 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72  . For. *.earlier
40c0: 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20   versions, this 
40d0: 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64  will be received
40e0: 20 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64   during the hand
40f0: 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69  shake.. *.This i
4100: 73 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20  s the preferred 
4110: 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  way to obtain a 
4120: 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  resumable sessio
4130: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  n.. *. * Results
4140: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
4150: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4160: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
4170: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
4180: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
4190: 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68  . *.0 = error wh
41a0: 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c  ere session will
41b0: 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20   be immediately 
41c0: 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65  removed from the
41d0: 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e   internal cache.
41e0: 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20  . *.1 = success 
41f0: 77 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e  where app retain
4200: 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73  s session in ses
4210: 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20  sion cache, and 
4220: 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45  must call SSL_SE
4230: 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65  SSION_free() whe
4240: 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  n done.. *. *---
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
42a0: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28  SessionCallback(
42b0: 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45  SSL *ssl, SSL_SE
42c0: 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20  SSION *session) 
42d0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
42e0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
42f0: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
4300: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
4310: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4320: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4330: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4340: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4350: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4360: 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20   char *ticket;. 
4370: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
4380: 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f  d char *session_
4390: 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c  id;.    size_t l
43a0: 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  en2;.    unsigne
43b0: 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20  d int ulen;..   
43c0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
43d0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
43e0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
43f0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
4400: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4410: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
4420: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
4430: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
4440: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4450: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
4460: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
4470: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
4480: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
4490: 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65 73 73  session id, sess
44a0: 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64 20  ion ticket, and 
44b0: 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20 2a 2f  lifetime args */
44c0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
44d0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
44e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
44f0: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
4500: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4510: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4520: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4530: 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29  j("session", -1)
4540: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4550: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4560: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4570: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4580: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4590: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
45a0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
45b0: 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
45c0: 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  id */.    sessio
45d0: 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
45e0: 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
45f0: 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54  n, &ulen);.    T
4600: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4610: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4620: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
4630: 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73  yteArrayObj(sess
4640: 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
4650: 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20  e) ulen));..    
4660: 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
4670: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53  t */.    SSL_SES
4680: 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
4690: 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
46a0: 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54  t, &len2);.    T
46b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
46c0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
46d0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
46e0: 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b  yteArrayObj(tick
46f0: 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
4700: 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c  en2));..    /* L
4710: 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72  ifetime - number
4720: 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20   of seconds */. 
4730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4750: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
4760: 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e  _NewLongObj((lon
4770: 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  g) SSL_SESSION_g
4780: 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69  et_ticket_lifeti
4790: 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29  me_hint(session)
47a0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
47b0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
47c0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
47d0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
47e0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
47f0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
4800: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
4810: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
4820: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
4830: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f   return 0;.}.../
4840: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c  -------. *. * AL
4890: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  PN Callback for 
48a0: 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20  Servers and NPN 
48b0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
48c0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65  ents --. *. *.Pe
48d0: 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28  rform protocol (
48e0: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
48f0: 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f  , etc.) selectio
4900: 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63  n for the. *.inc
4910: 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  oming connection
4920: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48  . Called after H
4930: 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20  ello and server 
4940: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68  callbacks.. *.Wh
4950: 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c  ere 'out' is sel
4960: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
4970: 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70  nd 'in' is the p
4980: 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c  eer advertised l
4990: 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ist.. *. * Resul
49a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
49b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
49c0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
49d0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
49e0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
49f0: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
4a00: 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72  _ERR_OK: ALPN pr
4a10: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
4a20: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4a30: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
4a40: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
4a50: 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20  RT_FATAL: There 
4a60: 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62  was no overlap b
4a70: 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e  etween the clien
4a80: 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c  t's. *.    suppl
4a90: 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65  ied list and the
4aa0: 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72   server configur
4ab0: 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ation. The conne
4ac0: 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62  ction will be ab
4ad0: 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c  orted.. *.SSL_TL
4ae0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
4af0: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  ALPN protocol no
4b00: 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e  t selected, e.g.
4b10: 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50  , because no ALP
4b20: 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f  N. *.    protoco
4b30: 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65  ls are configure
4b40: 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65  d for this conne
4b50: 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65  ction. The conne
4b60: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
4b70: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
4bc0: 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c  atic int.ALPNCal
4bd0: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20  lback(SSL *ssl, 
4be0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4bf0: 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67  har **out, unsig
4c00: 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e  ned char *outlen
4c10: 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ,..const unsigne
4c20: 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69  d char *in, unsi
4c30: 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20  gned int inlen, 
4c40: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
4c50: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4c60: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
4c70: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4c80: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4c90: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4ca0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4cb0: 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65      int code, re
4cc0: 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  s;..    dprintf(
4cd0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
4ce0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
4cf0: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
4d00: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4d10: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4d20: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
4d30: 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  lect protocol */
4d40: 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c  .    if (SSL_sel
4d50: 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28  ect_next_proto((
4d60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
4d70: 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73  ) out, outlen, s
4d80: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c  tatePtr->protos,
4d90: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4da0: 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65  s_len,..in, inle
4db0: 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50  n) == OPENSSL_NP
4dc0: 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a  N_NEGOTIATED) {.
4dd0: 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20  ./* Match found 
4de0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4df0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
4e00: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50   } else {../* OP
4e10: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45  ENSSL_NPN_NO_OVE
4e20: 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61  RLAP = No overla
4e30: 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74 20  p, so use first 
4e40: 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74  item from client
4e50: 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a   protocol list *
4e60: 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  /..res = SSL_TLS
4e70: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4e80: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
4e90: 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20  atePtr->vcmd == 
4ea0: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20  (Tcl_Obj*)NULL) 
4eb0: 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20  {..return res;. 
4ec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4ed0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4ee0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
4ef0: 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69  n, depth, cert i
4f00: 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73  nfo list, status
4f10: 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73  , and error args
4f20: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
4f30: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
4f40: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
4f50: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4f60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4f70: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4f80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
4f90: 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20  ("alpn", -1));. 
4fa0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4fb0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4fc0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
4fd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4fe0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
4ff0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
5000: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
5010: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5020: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5030: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5040: 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74  StringObj((const
5050: 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d   char *) *out, -
5060: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5070: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5080: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5090: 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
50a0: 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54  Obj(res == SSL_T
50b0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a  LSEXT_ERR_OK));.
50c0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
50d0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
50e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
50f0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5100: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5110: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5120: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5130: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5140: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5150: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5160: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5170: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5180: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5190: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
51a0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
51b0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
51c0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
51d0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
51e0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
51f0: 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  res;.}.../*. *--
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73  -. *. * Advertis
5250: 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c  e Protocols Call
5260: 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72  back for Next Pr
5270: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
5280: 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76  on (NPN) in Serv
5290: 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a  erHello --. *. *
52a0: 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54  .called when a T
52b0: 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20  LS server needs 
52c0: 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72  a list of suppor
52d0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f  ted protocols fo
52e0: 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63  r Next. *.Protoc
52f0: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a  ol Negotiation..
5300: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5310: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
5320: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a  e effects:. *. *
5330: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
5340: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5350: 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  _OK: NPN protoco
5360: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
5370: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
5380: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
5390: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e  EXT_ERR_NOACK: N
53a0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
53b0: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
53c0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
53d0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5420: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
5430: 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61  static int.NPNCa
5440: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
5450: 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73   *ssl, const uns
5460: 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74  igned char **out
5470: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a  , unsigned int *
5480: 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72  outlen, void *ar
5490: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
54a0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
54b0: 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72  e*)arg;..    dpr
54c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
54d0: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
54e0: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
54f0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5500: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5510: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5520: 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73  /* Set protocols
5530: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20   list */.    if 
5540: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
5550: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f  s != NULL) {..*o
5560: 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70  ut = statePtr->p
5570: 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20  rotos;..*outlen 
5580: 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  = statePtr->prot
5590: 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c  os_len;.    } el
55a0: 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c  se {..*out = NUL
55b0: 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b  L;..*outlen = 0;
55c0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
55d0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
55e0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
55f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5600: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a  K;.}.#endif.../*
5610: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49  ------. *. * SNI
5660: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
5670: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  rvers --. *. *.P
5680: 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69  erform server-si
5690: 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  de SNI hostname 
56a0: 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20  selection after 
56b0: 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78  receiving SNI ex
56c0: 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c  tension. *.in Cl
56d0: 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c  ient Hello. Call
56e0: 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63  ed after hello c
56f0: 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f  allback but befo
5700: 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  re ALPN callback
5710: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5720: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
5730: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
5740: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
5750: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
5760: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
5770: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5780: 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  R_OK: SNI hostna
5790: 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20  me is accepted. 
57a0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
57b0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
57c0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
57d0: 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73  T_FATAL: SNI hos
57e0: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
57f0: 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  epted. The conne
5800: 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20  ction. *.    is 
5810: 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74  aborted. Default
5820: 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53   for alert is SS
5830: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5840: 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54  D_NAME.. *.SSL_T
5850: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5860: 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73  WARNING: SNI hos
5870: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5880: 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61  epted, warning a
5890: 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74  lert. *.    sent
58a0: 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20   (not supported 
58b0: 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65  in TLSv1.3). The
58c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
58d0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
58e0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
58f0: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5900: 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64  not accepted and
5910: 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65   not acknowledge
5920: 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69  d,. *.    e.g. i
5930: 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65  f SNI has not be
5940: 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54  en configured. T
5950: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5960: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
59c0: 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .SNICallback(con
59d0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
59e0: 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61   *alert, void *a
59f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5a00: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5a10: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
5a20: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
5a30: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
5a40: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
5a50: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
5a60: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20   code, res;.    
5a70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76  const char *serv
5a80: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  ername = NULL;..
5a90: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5aa0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
5ab0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
5ac0: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
5ad0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5ae0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5af0: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77  }..    /* Only w
5b00: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32  orks for TLS 1.2
5b10: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a   and earlier */.
5b20: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
5b30: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
5b40: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
5b50: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
5b60: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65  me);.    if (!se
5b70: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76  rvername || serv
5b80: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30  ername[0] == '\0
5b90: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ') {..return SSL
5ba0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5bb0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
5bc0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
5bd0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
5be0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5bf0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5c00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5c10: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
5c20: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
5c30: 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20  han, and server 
5c40: 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  name args */.   
5c50: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
5c60: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
5c70: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
5c80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5c90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5ca0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5cb0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c  StringObj("sni",
5cc0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5cd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5ce0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5cf0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
5d00: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
5d10: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
5d20: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
5d30: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5d40: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5d50: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5d60: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5d70: 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d  j(servername , -
5d80: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
5d90: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
5da0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
5db0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5dc0: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
5dd0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
5de0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
5df0: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
5e00: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5e10: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57  SEXT_ERR_ALERT_W
5e20: 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20  ARNING;..*alert 
5e30: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
5e40: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
5e50: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
5e60: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
5e70: 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d   else if (code =
5e80: 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 1) {..res = SS
5e90: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5ea0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
5eb0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5ec0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b  ERR_ALERT_FATAL;
5ed0: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
5ee0: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5ef0: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
5f00: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
5f10: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63   */.    }.    Tc
5f20: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
5f30: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
5f40: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
5f50: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e  ----. *. * Clien
5fa0: 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65  tHello Handshake
5fb0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
5fc0: 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55  rvers --. *. *.U
5fd0: 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74 6f  sed by server to
5fe0: 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72   examine the ser
5ff0: 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74  ver name indicat
6000: 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73  ion (SNI) extens
6010: 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20  ion. *.provided 
6020: 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e  by the client in
6030: 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74   order to select
6040: 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
6050: 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20  certificate to. 
6060: 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d  *.present, and m
6070: 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67  ake other config
6080: 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65  uration adjustme
6090: 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20  nts relevant to 
60a0: 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e  that server. *.n
60b0: 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66  ame and its conf
60c0: 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  iguration. This 
60d0: 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e  includes swappin
60e0: 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69  g out the associ
60f0: 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20  ated. *.SSL_CTX 
6100: 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69  pointer, modifyi
6110: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
6120: 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65  list of permitte
6130: 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a  d TLS versions,.
6140: 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20   *.changing the 
6150: 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72 20  server's cipher 
6160: 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65  list in response
6170: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73   to the client's
6180: 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74   cipher list, et
6190: 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66  c.. *.Called bef
61a0: 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e  ore SNI and ALPN
61b0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20   callbacks.. *. 
61c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
61d0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
61e0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
61f0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
6200: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
6210: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
6220: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6230: 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65  TRY: suspend the
6240: 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20   handshake, and 
6250: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75  the handshake fu
6260: 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75  nction will retu
6270: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20  rn immediately. 
6280: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
6290: 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72  LO_ERROR: failur
62a0: 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e  e, terminate con
62b0: 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65  nection. Set ale
62c0: 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65  rt to error code
62d0: 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  .. *.SSL_CLIENT_
62e0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73  HELLO_SUCCESS: s
62f0: 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d  uccess. *. *----
6300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
6340: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48   */.static int.H
6350: 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c  elloCallback(SSL
6360: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
6370: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
6380: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
6390: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
63a0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
63b0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
63c0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
63d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
63e0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
63f0: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
6400: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
6410: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
6420: 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20  gned char *p;.  
6430: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65    size_t len, re
6440: 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70  maining;..    dp
6450: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
6460: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
6470: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
6480: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
6490: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
64a0: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a  _HELLO_SUCCESS;.
64b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
64c0: 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c  sl == (const SSL
64d0: 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d   *)NULL || arg =
64e0: 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20  = (void *)NULL) 
64f0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  {..return SSL_CL
6500: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6520: 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  Get names */.   
6530: 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74   if (!SSL_client
6540: 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28  _hello_get0_ext(
6550: 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45  ssl, TLSEXT_TYPE
6560: 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70  _server_name, &p
6570: 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c  , &remaining) ||
6580: 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29   remaining <= 2)
6590: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
65a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
65b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
65c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
65d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
65e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
65f0: 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67  Extract the leng
6600: 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  th of the suppli
6610: 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73  ed list of names
6620: 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28  . */.    len = (
6630: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
6640: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
6650: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
6660: 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b   != remaining) {
6670: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6680: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
6690: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
66a0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
66b0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
66c0: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
66d0: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20  ing = len;..    
66e0: 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70  /* The list in p
66f0: 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73  ractice only has
6700: 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e   a single elemen
6710: 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f  t, so we only co
6720: 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73 74  nsider the first
6730: 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20   one. */.    if 
6740: 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20  (remaining == 0 
6750: 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58  || *p++ != TLSEX
6760: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
6770: 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20  name) {..*alert 
6780: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6790: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
67a0: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
67b0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
67c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  OR;.    }.    re
67d0: 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20  maining--;..    
67e0: 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69  /* Now we can fi
67f0: 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74  nally pull out t
6800: 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77 69  he byte array wi
6810: 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f  th the actual ho
6820: 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69  stname. */.    i
6830: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  f (remaining <= 
6840: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
6850: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6860: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6870: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6880: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6890: 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
68a0: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
68b0: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
68c0: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
68d0: 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20   2 > remaining) 
68e0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
68f0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6900: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
6910: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6920: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6930: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6940: 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72  g = len;.    ser
6950: 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74  vername = (const
6960: 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20   char *)p;..    
6970: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
6980: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
6990: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72  n, chan, and ser
69a0: 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f  ver name args */
69b0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
69c0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
69d0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
69e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
69f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6a00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
6a10: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68  _NewStringObj("h
6a20: 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  ello", -1));.   
6a30: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6a40: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6a50: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
6a60: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6a70: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
6a80: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
6a90: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
6aa0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6ab0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6ac0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6ad0: 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61  ringObj(serverna
6ae0: 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  me, (Tcl_Size) l
6af0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  en));..    /* Ev
6b00: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
6b10: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
6b20: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
6b30: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
6b40: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
6b50: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
6b60: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
6b70: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6b80: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6b90: 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  Y;..*alert = SSL
6ba0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55  _R_TLSV1_ALERT_U
6bb0: 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20  SER_CANCELLED;. 
6bc0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
6bd0: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
6be0: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6bf0: 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20  LO_SUCCESS;.    
6c00: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
6c10: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6c20: 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20  _ERROR;..*alert 
6c30: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6c40: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6c50: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  OR;.    }.    Tc
6c60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
6c70: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
6c80: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  rn res;.}.../***
6c90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ca0: 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20  */./* Commands  
6cb0: 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6cd0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
6d20: 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d   CiphersObjCmd -
6d30: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
6d40: 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54   ciphers. *. *.T
6d50: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
6d60: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
6d70: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69  ess the "tls::ci
6d80: 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  phers" command. 
6d90: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
6da0: 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73  ble ciphers, bas
6db0: 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c  ed upon protocol
6dc0: 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a   selected.. *. *
6dd0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6de0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6df0: 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53  lt list.. *. * S
6e00: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
6e10: 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64  constructs and d
6e20: 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74  estroys SSL cont
6e30: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f  --. */.static co
6e90: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63  nst char *protoc
6ea0: 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 73  ols[] = {.    "s
6eb0: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74  sl2", "ssl3", "t
6ec0: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20  ls1", "tls1.1", 
6ed0: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e  "tls1.2", "tls1.
6ee0: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d  3", NULL.};.enum
6ef0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20   protocol {.    
6f00: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53  TLS_SSL2, TLS_SS
6f10: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c  L3, TLS_TLS1, TL
6f20: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c  S_TLS1_1, TLS_TL
6f30: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33  S1_2, TLS_TLS1_3
6f40: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73  , TLS_NONE.};..s
6f50: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72  tatic int.Cipher
6f60: 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  sObjCmd(.    TCL
6f70: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
6f80: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
6f90: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74  *interp,.    int
6fa0: 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f   objc,.    Tcl_O
6fb0: 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj.*const objv[]
6fc0: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ).{.    Tcl_Obj 
6fd0: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
6fe0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
6ff0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
7000: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
7010: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
7020: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
7030: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a  const char *cp;.
7040: 20 20 20 20 63 68 61 72 20 62 75 66 5b 42 55 46      char buf[BUF
7050: 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e  SIZ];.    int in
7060: 64 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30  dex, verbose = 0
7070: 2c 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20  , use_supported 
7080: 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  = 0;.    const S
7090: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
70a0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
70b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
70c0: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
70d0: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
70e0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
70f0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
7100: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
7110: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
7120: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
7130: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7140: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
7150: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
7160: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
7170: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
7180: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
7190: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
71a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
71b0: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
71c0: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
71d0: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
71e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
71f0: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
7200: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7210: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7220: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7230: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
7240: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7250: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
7260: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
7270: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7280: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7290: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
72a0: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
72b0: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
72c0: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
72d0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53  .    case TLS_SS
72e0: 4c 32 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  L2:..Tcl_AppendR
72f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7300: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7310: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7320: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
7330: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
7340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7350: 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a    case TLS_SSL3:
7360: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7370: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
7380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
7390: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
73a0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
73b0: 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64  HOD)..Tcl_Append
73c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
73d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
73e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
73f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
7400: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7410: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65  ERROR;.#else..me
7420: 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74  thod = SSLv3_met
7430: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7440: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c  ndif.    case TL
7450: 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69  S_TLS1:.#if defi
7460: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
7470: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7480: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
7490: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
74a0: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c  LS1_METHOD)..Tcl
74b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
74c0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
74d0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
74e0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
74f0: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
7500: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7510: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74  RROR;.#else..met
7520: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68  hod = TLSv1_meth
7530: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7540: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4c 53  dif.    case TLS
7550: 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66  _TLS1_1:.#if def
7560: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
7570: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7580: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  SL_NO_TLS1_1) ||
7590: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
75a0: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
75b0: 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  D)..Tcl_AppendRe
75c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
75d0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
75e0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
75f0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7600: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72   *)NULL);..retur
7610: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7620: 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53  se..method = TLS
7630: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62  v1_1_method(); b
7640: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
7650: 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32   case TLS_TLS1_2
7660: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
7670: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7680: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7690: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
76a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
76b0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c  1_2_METHOD)..Tcl
76c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
76d0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
76e0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
76f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7700: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
7710: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7720: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74  RROR;.#else..met
7730: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65  hod = TLSv1_2_me
7740: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7750: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
7760: 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64  LS_TLS1_3:.#if d
7770: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
7780: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7790: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
77a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
77b0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
77c0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
77d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
77e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
77f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7800: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7810: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65  .method = TLS_me
7820: 74 68 6f 64 28 29 3b 0a 09 53 53 4c 5f 43 54 58  thod();..SSL_CTX
7830: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
7840: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
7850: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53  _3_VERSION);..SS
7860: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
7870: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
7880: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
7890: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
78a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 6d  .    default:..m
78b0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
78c0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  od();..break;.  
78d0: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53    }..    ctx = S
78e0: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
78f0: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20  d);.    if (ctx 
7900: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7910: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7920: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7930: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e  SON(), (char *)N
7940: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
7950: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7960: 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65      ssl = SSL_ne
7970: 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28  w(ctx);.    if (
7980: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl == NULL) {..
7990: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
79a0: 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52  (interp, GET_ERR
79b0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
79c0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43   *)NULL);..SSL_C
79d0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
79e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
79f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
7a00: 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65  se list and orde
7a10: 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65  r as would be se
7a20: 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65  nt in a ClientHe
7a30: 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c  llo or all avail
7a40: 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a  able ciphers */.
7a50: 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70      if (use_supp
7a60: 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53  orted) {..sk = S
7a70: 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65  SL_get1_supporte
7a80: 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  d_ciphers(ssl);.
7a90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b      } else {..sk
7aa0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65   = SSL_get_ciphe
7ab0: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a  rs(ssl);.    }..
7ac0: 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55      if (sk != NU
7ad0: 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62  LL) {..if (!verb
7ae0: 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a 50  ose) {..    objP
7af0: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
7b00: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20  Obj(0, NULL);.. 
7b10: 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20     for (int i = 
7b20: 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49  0; i < sk_SSL_CI
7b30: 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b  PHER_num(sk); i+
7b40: 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c  +) {...const SSL
7b50: 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f  _CIPHER *c = sk_
7b60: 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65  SSL_CIPHER_value
7b70: 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63  (sk, i);...if (c
7b80: 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e   == NULL) contin
7b90: 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72  ue;..../* cipher
7ba0: 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20   name or (NONE) 
7bb0: 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49  */...cp = SSL_CI
7bc0: 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29  PHER_get_name(c)
7bd0: 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55  ;...if (cp == NU
7be0: 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c  LL) break;...Tcl
7bf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
7c00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
7c10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
7c20: 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b  ingObj(cp, -1));
7c30: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65  ..    }...} else
7c40: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
7c50: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7c60: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f  j("",0);..    fo
7c70: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
7c80: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
7c90: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
7ca0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
7cb0: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
7cc0: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
7cd0: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
7ce0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
7cf0: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73  ../* textual des
7d00: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
7d10: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28  cipher */...if (
7d20: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
7d30: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73  iption(c, buf, s
7d40: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
7d50: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
7d60: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a  _AppendToObj(obj
7d70: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53  Ptr, buf, (Tcl_S
7d80: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29  ize) strlen(buf)
7d90: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
7da0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
7db0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b  Obj(objPtr, "UNK
7dc0: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d  NOWN\n", 8);...}
7dd0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
7de0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
7df0: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50  ..    sk_SSL_CIP
7e00: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d  HER_free(sk);..}
7e10: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
7e20: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
7e30: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
7e40: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
7e50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
7e60: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
7e70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
7e80: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72  -------. *. * Pr
7ed0: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d  otocolsObjCmd --
7ee0: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
7ef0: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09  protocols. *. *.
7f00: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
7f10: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
7f20: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70  cess the "tls::p
7f30: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e  rotocols" comman
7f40: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
7f50: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
7f60: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
7f70: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
7f80: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
7f90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
7fa0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
7fb0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
8000: 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62   int.ProtocolsOb
8010: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
8020: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
8030: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8040: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
8050: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  jc,.    Tcl_Obj 
8060: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
8080: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  jPtr;..    dprin
8090: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
80a0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31     if (objc != 1
80b0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
80c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
80d0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74   objv, "");..ret
80e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
80f0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
8100: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
8110: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
8120: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
8130: 4c 29 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  L);..#if !define
8140: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
8150: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8160: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8170: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8180: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
8190: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
81a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
81b0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
81c0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
81d0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d  ols[TLS_SSL3], -
81e0: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
81f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8200: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8210: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
8220: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8230: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
8240: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8250: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8260: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8270: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8280: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8290: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  LS1], -1));.#end
82a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
82b0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
82c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
82d0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
82e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
82f0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
8300: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8310: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8320: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8330: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8340: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8350: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _1], -1));.#endi
8360: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8370: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
8380: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8390: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
83a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
83b0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
83c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
83d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
83e0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
83f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8400: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
8410: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  2], -1));.#endif
8420: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8430: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
8440: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8450: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f  TLS1_3).    Tcl_
8460: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8470: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8480: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8490: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
84a0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29  TLS_TLS1_3], -1)
84b0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
84c0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
84d0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
84e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
84f0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8540: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65  . *. * Handshake
8550: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
8560: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
8570: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77  used to verify w
8580: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73  hether the hands
8590: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  hake is complete
85a0: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20  . *.or not.. *. 
85b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
85c0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
85d0: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e  ult. 1 means han
85e0: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c  dshake complete,
85f0: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67   0 means pending
8600: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8610: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72  ects:. *.May for
8620: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  ce SSL negotiati
8630: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65  on to take place
8640: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
8690: 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73  static int Hands
86a0: 68 61 6b 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20  hakeObjCmd(.    
86b0: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20  TCL_UNUSED(void 
86c0: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  *),.    Tcl_Inte
86d0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
86e0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63  int objc,.    Tc
86f0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
8700: 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]).{.    Tcl_C
8710: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20  hannel chan;    
8720: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e      /* The chann
8730: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
8740: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
8750: 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20  e *statePtr;    
8760: 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74      /* client st
8770: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
8780: 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  et */.    const 
8790: 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e  char *errStr = N
87a0: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
87b0: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72   = 1;.    int er
87c0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  r = 0;..    dpri
87d0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
87e0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
87f0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
8800: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
8810: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
8820: 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ");..return(TCL_
8830: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
8840: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
8850: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20  or();..    chan 
8860: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
8870: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
8880: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
8890: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
88a0: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
88b0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
88c0: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
88d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
88e0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
88f0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8900: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8910: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8920: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8930: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
8940: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
8950: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
8960: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
8970: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8980: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
8990: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
89a0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
89b0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
89c0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
89d0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c  ar *)NULL);..Tcl
89e0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
89f0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8a00: 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e  NDSHAKE", "CHANN
8a10: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
8a20: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
8a30: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
8a40: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  );.    }.    sta
8a50: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
8a60: 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
8a70: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
8a80: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
8a90: 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69  "Calling Tls_Wai
8aa0: 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20  tForConnect");. 
8ab0: 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69     ret = Tls_Wai
8ac0: 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74  tForConnect(stat
8ad0: 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a  ePtr, &err, 1);.
8ae0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73      dprintf("Tls
8af0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20  _WaitForConnect 
8b00: 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72  returned: %i", r
8b10: 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65  et);..    if (re
8b20: 74 20 3c 20 30 20 26 26 20 28 28 73 74 61 74 65  t < 0 && ((state
8b30: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53  Ptr->flags & TLS
8b40: 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28  _TCL_ASYNC) && (
8b50: 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29  err == EAGAIN)))
8b60: 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79   {..dprintf("Asy
8b70: 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d  nc set and err =
8b80: 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20   EAGAIN");..ret 
8b90: 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  = 0;.    } else 
8ba0: 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09  if (ret < 0) {..
8bb0: 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72  long result;..er
8bc0: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
8bd0: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
8be0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
8bf0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
8c00: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
8c10: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d  r || (*errStr ==
8c20: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53   0)) {..    errS
8c30: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72  tr = Tcl_PosixEr
8c40: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ror(interp);..}.
8c50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8c60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
8c70: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
8c80: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a   errStr, (char *
8c90: 29 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65  )NULL);..if ((re
8ca0: 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76  sult = SSL_get_v
8cb0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
8cc0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20  tePtr->ssl)) != 
8cd0: 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20  X509_V_OK) {..  
8ce0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8cf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65  lt(interp, " due
8d00: 20 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65   to \"", X509_ve
8d10: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
8d20: 73 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20  string(result), 
8d30: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  "\"", (char *)NU
8d40: 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74  LL);..}..Tcl_Set
8d50: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
8d60: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48  , "TLS", "HANDSH
8d70: 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  AKE", "FAILED", 
8d80: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
8d90: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
8da0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
8db0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
8dc0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
8dd0: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
8de0: 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ROR);.    } else
8df0: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30   {..if (err != 0
8e00: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
8e10: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
8e20: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20  ith a completed 
8e30: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d  handshake: err =
8e40: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09   %i", err);..}..
8e50: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ret = 1;.    }..
8e60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
8e70: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69  urning TCL_OK wi
8e80: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c  th data \"%i\"",
8e90: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53   ret);.    Tcl_S
8ea0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8eb0: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
8ec0: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74  j(ret));.    ret
8ed0: 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 7d 0a 0a  urn(TCL_OK);.}..
8ee0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
8f30: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
8f40: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
8f50: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
8f60: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73  o process the "s
8f70: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20  sl" command. *. 
8f80: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  *.The ssl comman
8f90: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65  d pushes SSL ove
8fa0: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65  r a (newly conne
8fb0: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74  cted) tcp socket
8fc0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
8fd0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
8fe0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
8ff0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
9000: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
9010: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
9020: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
9030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9070: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
9080: 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  int.ImportObjCmd
9090: 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
90a0: 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
90b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
90c0: 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  ,.    int objc,.
90d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
90e0: 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20  st objv[]).{.   
90f0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
9100: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
9110: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
9120: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
9130: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
9140: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
9150: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
9160: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
9170: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9180: 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d  l_Obj *script..=
9190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
91a0: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20  bj *password..= 
91b0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
91c0: 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b  j *vcmd..= NULL;
91d0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
91e0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61   upperChannelTra
91f0: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43  nslation, upperC
9200: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20  hannelBlocking, 
9210: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
9220: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  ding, upperChann
9230: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69  elEOFChar;.    i
9240: 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f  nt idx;.    Tcl_
9250: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  Size len;.    in
9260: 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f  t flags...= TLS_
9270: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e  TCL_INIT;.    in
9280: 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09  t server...= 0;.
9290: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
92a0: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
92b0: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
92c0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e  ar *keyfile..= N
92d0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
92e0: 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b  ertfile..= NULL;
92f0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
9300: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b  ar *key..= NULL;
9310: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65  .    Tcl_Size ke
9320: 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20  y_len..= 0;.    
9330: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
9340: 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ert..= NULL;.   
9350: 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c   Tcl_Size cert_l
9360: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61  en..= 0;.    cha
9370: 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55  r *ciphers..= NU
9380: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  LL;.    char *ci
9390: 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55  phersuites..= NU
93a0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
93b0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
93c0: 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09    char *CApath..
93d0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
93e0: 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55   *DHparams..= NU
93f0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f  LL;.    char *mo
9400: 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  del...= NULL;.  
9410: 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61    char *serverna
9420: 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68  me..= NULL;./* h
9430: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76  ostname for Serv
9440: 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69  er Name Indicati
9450: 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
9460: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
9470: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c  ession_id = NULL
9480: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61  ;.    Tcl_Obj *a
9490: 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  lpn..= NULL;.   
94a0: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73   int ssl2 = 0, s
94b0: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sl3 = 0;.    int
94c0: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f   tls1 = 1, tls1_
94d0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20  1 = 1, tls1_2 = 
94e0: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20  1, tls1_3 = 1;. 
94f0: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30     int proto = 0
9500: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20  , level = -1;.  
9510: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30    int verify = 0
9520: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72  , require = 0, r
9530: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74  equest = 1, post
9540: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a  _handshake = 0;.
9550: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
9560: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66  lled");..#if def
9570: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
9580: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
9590: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c  _NO_TLS1).    tl
95a0: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  s1 = 0;.#endif.#
95b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
95c0: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
95d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
95e0: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d  _1).    tls1_1 =
95f0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9600: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
9610: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9620: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
9630: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a      tls1_2 = 0;.
9640: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9650: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
9660: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
9670: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
9680: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64  tls1_3 = 0;.#end
9690: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  if..    if (objc
96a0: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
96b0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
96c0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
96d0: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b  nel ?options?");
96e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
96f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
9700: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
9710: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  ;..    chan = Tc
9720: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
9730: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
9740: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
9750: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
9760: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
9770: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
9780: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9790: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
97a0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
97b0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
97c0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20  pmost channel.  
97d0: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d     */.    chan =
97e0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
97f0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
9800: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
9810: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
9820: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54  {..char *opt = T
9830: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
9840: 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28 6f  v[idx]);...if (o
9850: 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20  pt[0] != '-').. 
9860: 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f     break;...OPTO
9870: 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e  BJ("-alpn", alpn
9880: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64  );..OPTSTR("-cad
9890: 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09 4f  ir", CApath);..O
98a0: 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c  PTSTR("-cafile",
98b0: 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59   CAfile);..OPTBY
98c0: 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74  TE("-cert", cert
98d0: 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50  , cert_len);..OP
98e0: 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22  TSTR("-certfile"
98f0: 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50  , certfile);..OP
9900: 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20  TSTR("-cipher", 
9910: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54  ciphers);..OPTST
9920: 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69  R("-ciphers", ci
9930: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28  phers);..OPTSTR(
9940: 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c  "-ciphersuites",
9950: 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a   ciphersuites);.
9960: 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e  .OPTOBJ("-comman
9970: 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50  d", script);..OP
9980: 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22  TSTR("-dhparams"
9990: 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50  , DHparams);..OP
99a0: 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65  TBYTE("-key", ke
99b0: 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50  y, key_len);..OP
99c0: 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c  TSTR("-keyfile",
99d0: 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53   keyfile);..OPTS
99e0: 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64  TR("-model", mod
99f0: 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70  el);..OPTOBJ("-p
9a00: 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f  assword", passwo
9a10: 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  rd);..OPTBOOL("-
9a20: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c  post_handshake",
9a30: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
9a40: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71  ;..OPTBOOL("-req
9a50: 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b  uest", request);
9a60: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75  ..OPTBOOL("-requ
9a70: 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a  ire", require);.
9a80: 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69  .OPTINT("-securi
9a90: 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c  ty_level", level
9aa0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65  );..OPTBOOL("-se
9ab0: 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a  rver", server);.
9ac0: 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72  .OPTSTR("-server
9ad0: 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d  name", servernam
9ae0: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65  e);..OPTSTR("-se
9af0: 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
9b00: 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  on_id);..OPTBOOL
9b10: 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b  ("-ssl2", ssl2);
9b20: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33  ..OPTBOOL("-ssl3
9b30: 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f  ", ssl3);..OPTBO
9b40: 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31  OL("-tls1", tls1
9b50: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9b60: 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a  s1.1", tls1_1);.
9b70: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
9b80: 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50  2", tls1_2);..OP
9b90: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c  TBOOL("-tls1.3",
9ba0: 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42   tls1_3);..OPTOB
9bb0: 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d  J("-validatecomm
9bc0: 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50  and", vcmd);..OP
9bd0: 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63  TOBJ("-vcmd", vc
9be0: 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f  md);...OPTBAD("o
9bf0: 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20  ption", "-alpn, 
9c00: 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c  -cadir, -cafile,
9c10: 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c   -cert, -certfil
9c20: 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70  e, -cipher, -cip
9c30: 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d  hersuites, -comm
9c40: 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20  and, -dhparams, 
9c50: 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20  -key, -keyfile, 
9c60: 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72  -model, -passwor
9c70: 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  d, -post_handsha
9c80: 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72  ke, -request, -r
9c90: 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74  equire, -securit
9ca0: 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72  y_level, -server
9cb0: 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d  , -servername, -
9cc0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c  session_id, -ssl
9cd0: 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c  2, -ssl3, -tls1,
9ce0: 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e   -tls1.1, -tls1.
9cf0: 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d  2, -tls1.3, or -
9d00: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
9d10: 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
9d20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
9d30: 20 69 66 20 28 72 65 71 75 65 73 74 29 09 20 20   if (request).  
9d40: 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f    verify |= SSL_
9d50: 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e  VERIFY_CLIENT_ON
9d60: 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f  CE | SSL_VERIFY_
9d70: 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65  PEER;.    if (re
9d80: 71 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65  quest && require
9d90: 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ) verify |= SSL_
9da0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
9db0: 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20  O_PEER_CERT;.   
9dc0: 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20   if (request && 
9dd0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09  post_handshake).
9de0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9df0: 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48  RIFY_POST_HANDSH
9e00: 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72  AKE;.    if (ver
9e10: 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66 79  ify == 0).verify
9e20: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
9e30: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
9e40: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
9e50: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
9e60: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
9e70: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
9e80: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
9e90: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
9ea0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
9eb0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
9ec0: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
9ed0: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
9ee0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
9ef0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
9f00: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
9f10: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
9f20: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
9f30: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
9f40: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
9f50: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
9f60: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
9f70: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
9f80: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
9f90: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
9fa0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
9fb0: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
9fc0: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
9fd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9fe0: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
9ff0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
a000: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
a010: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
a020: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
a030: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
a040: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a050: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
a060: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
a070: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
a080: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
a090: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a  phersuites && !*
a0a0: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69  ciphersuites) ci
a0b0: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20  phersuites    = 
a0c0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
a0d0: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
a0e0: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
a0f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a100: 0a 20 20 20 20 69 66 20 28 43 41 70 61 74 68 20  .    if (CApath 
a110: 26 26 20 21 2a 43 41 70 61 74 68 29 09 20 20 20  && !*CApath).   
a120: 20 20 20 20 20 43 41 70 61 74 68 09 20 20 20 20       CApath.    
a130: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a140: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a150: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a160: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a170: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a180: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a190: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a1a0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a1b0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a1c0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a1d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a1e0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a1f0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a200: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a210: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a220: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a230: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a240: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a250: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a260: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a270: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a280: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a290: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a2a0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a2b0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a2c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a2d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a2e0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a2f0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a300: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a310: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a320: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a330: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a340: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a350: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a360: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a370: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a380: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a390: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a3a0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a3b0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a3c0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a3d0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a3e0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a3f0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a400: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a410: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a420: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a430: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a440: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a450: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a460: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a470: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a480: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a490: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a4a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a4b0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a4c0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a4d0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a4e0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a4f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a500: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a510: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a520: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a530: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a540: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
a550: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a560: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a570: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65  .}.../*.. * Make
a580: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
a590: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
a5a0: 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68  channel.. */..ch
a5b0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
a5c0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69  hannel(chan);..i
a5d0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
a5e0: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
a5f0: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
a600: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
a610: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a620: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
a630: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
a640: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
a650: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54      "\": not a T
a660: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
a670: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
a680: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
a690: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
a6a0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e   "IMPORT", "CHAN
a6b0: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
a6c0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
a6d0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76  .    Tls_Free((v
a6e0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
a6f0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a700: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20  _ERROR;..}..ctx 
a710: 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f  = ((State *)Tcl_
a720: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
a730: 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63  ceData(chan))->c
a740: 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  tx;.    } else {
a750: 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58  ..if ((ctx = CTX
a760: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20  _Init(statePtr, 
a770: 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b  server, proto, k
a780: 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65  eyfile, certfile
a790: 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 69 6e  , key, cert, (in
a7a0: 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20  t) key_len,..   
a7b0: 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c   (int) cert_len,
a7c0: 20 43 41 70 61 74 68 2c 20 43 41 66 69 6c 65 2c   CApath, CAfile,
a7d0: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
a7e0: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44  suites, level, D
a7f0: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c  Hparams)) == NUL
a800: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
a810: 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65  ee((void *)state
a820: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a830: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a840: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
a850: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
a860: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
a870: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
a880: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
a890: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
a8a0: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
a8b0: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
a8c0: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
a8d0: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65  d up)..     * We
a8e0: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64   only want to ad
a8f0: 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69  just the bufferi
a900: 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61  ng in pre-v2 cha
a910: 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20  nnels, where.   
a920: 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c    * each channel
a930: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61   in the stack ma
a940: 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e  intained its own
a950: 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a   buffers..     *
a960: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
a970: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
a980: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
a990: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a9a0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
a9b0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
a9c0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a9d0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
a9e0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
a9f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
aa00: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
aa10: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
aa20: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aa30: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
aa40: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
aa50: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
aa60: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
aa70: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
aa80: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  han, "-encoding"
aa90: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
aaa0: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
aab0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
aac0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
aad0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
aae0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72   &upperChannelTr
aaf0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
ab00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
ab10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
ab20: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
ab30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
ab40: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
ab50: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
ab60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
ab70: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
ab80: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63  binary");.    Tc
ab90: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
aba0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
abb0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74   "-blocking", "t
abc0: 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e  rue");.    dprin
abd0: 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63  tf("Consuming Tc
abe0: 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54  l channel %s", T
abf0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ac00: 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74  e(chan));.    st
ac10: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
ac20: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
ac30: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e  interp, Tls_Chan
ac40: 6e 65 6c 54 79 70 65 28 29 2c 20 73 74 61 74 65  nelType(), state
ac50: 50 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42  Ptr, (TCL_READAB
ac60: 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c  LE | TCL_WRITABL
ac70: 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64  E), chan);.    d
ac80: 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20  printf("Created 
ac90: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73  channel named %s
aca0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
acb0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
acc0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28  self));.    if (
acd0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
ace0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
acf0: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20  NULL) {../*.. * 
ad00: 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76  No use of Tcl_Ev
ad10: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63  entuallyFree bec
ad20: 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65  ause no possible
ad30: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09   Tcl_Preserve...
ad40: 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 76   */..Tls_Free((v
ad50: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
ad60: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ad70: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
ad80: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
ad90: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
ada0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72  ePtr->self, "-tr
adb0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f  anslation", Tcl_
adc0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
add0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
ade0: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c  ation));.    Tcl
adf0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
ae00: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
ae10: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f  tr->self, "-enco
ae20: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  ding", Tcl_DStri
ae30: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
ae40: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b  annelEncoding));
ae50: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ae60: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ae70: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
ae80: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63  , "-eofchar", Tc
ae90: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
aea0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
aeb0: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  har));.    Tcl_S
aec0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
aed0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
aee0: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69  ->self, "-blocki
aef0: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
af00: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
af10: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20  nelBlocking));. 
af20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
af30: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
af40: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
af50: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
af60: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
af70: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
af80: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
af90: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
afa0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
afb0: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
afc0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
afd0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
afe0: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  SSL Initializati
aff0: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  on.     */..    
b000: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
b010: 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72  SSL_new(statePtr
b020: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28  ->ctx);.    if (
b030: 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  !statePtr->ssl) 
b040: 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72  {../* SSL librar
b050: 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f  y error */..Tcl_
b060: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b070: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63  erp, "couldn't c
b080: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73  onstruct ssl ses
b090: 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52  sion: ", GET_ERR
b0a0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b0b0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53   *)NULL);..Tcl_S
b0c0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b0d0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b0e0: 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41  RT", "INIT", "FA
b0f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 4e  ILED", (char *)N
b100: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28  ULL);..Tls_Free(
b110: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
b120: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
b130: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
b140: 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65 72   /* Set host ser
b150: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ver name */.    
b160: 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29 20  if (servername) 
b170: 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20 73  {../* Sets the s
b180: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
b190: 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20 43  ation (SNI) in C
b1a0: 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65 6e  lientHello exten
b1b0: 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72 20  sion */../* Per 
b1c0: 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e 61  RFC 6066, hostna
b1d0: 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65 6e  me is a ASCII en
b1e0: 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74 68  coded string, th
b1f0: 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73 61  ough RFC 4366 sa
b200: 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69 66  ys UTF-8. */..if
b210: 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65 78   (!SSL_set_tlsex
b220: 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61 74  t_host_name(stat
b230: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b240: 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69 72  rname) && requir
b250: 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  e) {..    Tcl_Ap
b260: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b270: 70 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74 65  p, "Set SNI exte
b280: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c  nsion failed: ",
b290: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
b2a0: 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ), (char *)NULL)
b2b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b2c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b2d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b2e0: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22   "SNI", "FAILED"
b2f0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b300: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
b310: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
b320: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b330: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
b340: 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f   Set hostname fo
b350: 72 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61  r peer certifica
b360: 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69  te hostname veri
b370: 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65  fication in clie
b380: 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75  nts...   Don't u
b390: 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74  se SSL_set1_host
b3a0: 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69   since it has li
b3b0: 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69  mitations. */..i
b3c0: 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73  f (!SSL_add1_hos
b3d0: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  t(statePtr->ssl,
b3e0: 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a   servername)) {.
b3f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b400: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
b410: 65 74 20 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20  et DNS hostname 
b420: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b430: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b440: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
b450: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b460: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b470: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54   "IMPORT", "HOST
b480: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c  NAME", "FAILED",
b490: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
b4a0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76  .    Tls_Free((v
b4b0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
b4c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b4d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b4e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b4f0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b500: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b510: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b520: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b530: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b540: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b550: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b560: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b570: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b580: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b590: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
b5a0: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
b5b0: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
b5c0: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
b5d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b5e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b5f0: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66  Resume session f
b600: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b610: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b620: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
b630: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b640: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b650: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49  "IMPORT", "SESSI
b660: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ON", "FAILED", (
b670: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
b680: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69     Tls_Free((voi
b690: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
b6a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b6b0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b6c0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70      /* Enable Ap
b6d0: 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20  plication-Layer 
b6e0: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
b6f0: 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61  tion. Examples a
b700: 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68  re: http/1.0,..h
b710: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c  ttp/1.1, h2, h3,
b720: 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33   ftp, imap, pop3
b730: 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78  , xmpp-client, x
b740: 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74  mpp-server, mqtt
b750: 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20  , irc, etc. */. 
b760: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09     if (alpn) {..
b770: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c  /* Convert a TCL
b780: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f   list into a pro
b790: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69  tocol-list in wi
b7a0: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e  re-format */..un
b7b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
b7c0: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e  tos, *p;..unsign
b7d0: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65  ed int protos_le
b7e0: 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65  n = 0;..Tcl_Size
b7f0: 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b   cnt, i;..int j;
b800: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74  ..Tcl_Obj **list
b810: 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  ;...if (Tcl_List
b820: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
b830: 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e  nterp, alpn, &cn
b840: 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c  t, &list) != TCL
b850: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  _OK) {..    Tls_
b860: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61  Free((void *)sta
b870: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b880: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b890: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
b8a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
b8b0: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
b8c0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
b8d0: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
b8e0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
b8f0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
b900: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
b910: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
b920: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
b930: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b940: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
b950: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c  ocol names too l
b960: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ong", (char *)NU
b970: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
b980: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b990: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b9a0: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
b9b0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
b9c0: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 76 6f  ;...Tls_Free((vo
b9d0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
b9e0: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
b9f0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
ba00: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20  protos_len += 1 
ba10: 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a  + (int) len;..}.
ba20: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63  ../* Build the c
ba30: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c  omplete protocol
ba40: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73  -list */..protos
ba50: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f   = ckalloc(proto
ba60: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74  s_len);../* prot
ba70: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69  ocol-lists consi
ba80: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67  st of 8-bit leng
ba90: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74  th-prefixed, byt
baa0: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f  e strings */..fo
bab0: 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72  r (j = 0, p = pr
bac0: 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a  otos; j < cnt; j
bad0: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  ++) {..    char 
bae0: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  *str = Tcl_GetSt
baf0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
bb00: 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [j], &len);..   
bb10: 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65   *p++ = (unsigne
bb20: 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20  d char) len;..  
bb30: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c    memcpy(p, str,
bb40: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
bb50: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09  .    p += len;..
bb60: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61  }.../* SSL_set_a
bb70: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73  lpn_protos makes
bb80: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
bb90: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
bba0: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
bbb0: 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65  unctions reverse
bbc0: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
bbd0: 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f  ue convention */
bbe0: 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c  ..if (SSL_set_al
bbf0: 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50  pn_protos(stateP
bc00: 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c  tr->ssl, protos,
bc10: 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a   protos_len)) {.
bc20: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
bc30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
bc40: 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  et ALPN protocol
bc50: 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  s failed: ", GET
bc60: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
bc70: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
bc80: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
bc90: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
bca0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
bcb0: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
bcc0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
bcd0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69     Tls_Free((voi
bce0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
bcf0: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f      ckfree(proto
bd00: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  s);..    return 
bd10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
bd20: 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f  /* Store protoco
bd30: 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74  ls list */..stat
bd40: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70  ePtr->protos = p
bd50: 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72  rotos;..statePtr
bd60: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70  ->protos_len = p
bd70: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d  rotos_len;.    }
bd80: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74   else {..statePt
bd90: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c  r->protos = NULL
bda0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
bdb0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  tos_len = 0;.   
bdc0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
bdd0: 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a  * SSL Callbacks.
bde0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f       */.    SSL_
bdf0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61  set_app_data(sta
be00: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69  tePtr->ssl, (voi
be10: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f  d *)statePtr);./
be20: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20  * point back to 
be30: 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  us */.    SSL_se
be40: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74  t_verify(statePt
be50: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20  r->ssl, verify, 
be60: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b  VerifyCallback);
be70: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66  .    SSL_set_inf
be80: 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  o_callback(state
be90: 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61  Ptr->ssl, InfoCa
bea0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a  llback);..    /*
beb0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62   Callback for ob
bec0: 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  serving protocol
bed0: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66   messages */.#if
bee0: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
bef0: 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a  SSL_TRACE.    /*
bf00: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
bf10: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
bf20: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  rg(statePtr->ctx
bf30: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
bf40: 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53  tr);.    void SS
bf50: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
bf60: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
bf70: 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ctx, MessageCal
bf80: 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53  lback); */.    S
bf90: 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  SL_set_msg_callb
bfa0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
bfb0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
bfc0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53  tatePtr);.    SS
bfd0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
bfe0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
bff0: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  , MessageCallbac
c000: 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  k);.#endif..    
c010: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68  /* Create Tcl_Ch
c020: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65  annel BIO Handle
c030: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  r */.    statePt
c040: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e  r->p_bio.= BIO_n
c050: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c  ew_tcl(statePtr,
c060: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20   BIO_NOCLOSE);. 
c070: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f     statePtr->bio
c080: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66  .= BIO_new(BIO_f
c090: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66  _ssl());..    if
c0a0: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20   (server) {../* 
c0b0: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73  Server callbacks
c0c0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
c0d0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
c0e0: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  me_arg(statePtr-
c0f0: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
c100: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54  atePtr);..SSL_CT
c110: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
c120: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b  vername_callback
c130: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c140: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53  SNICallback);..S
c150: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
c160: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65  t_hello_cb(state
c170: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43  Ptr->ctx, HelloC
c180: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c190: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20  )statePtr);..if 
c1a0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c1b0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
c1c0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c    SSL_CTX_set_al
c1d0: 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61  pn_select_cb(sta
c1e0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e  tePtr->ctx, ALPN
c1f0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
c200: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66  *)statePtr);.#if
c210: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20  def USE_NPN..   
c220: 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30   if (tls1_2 == 0
c230: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
c240: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
c250: 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76  _next_protos_adv
c260: 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65  ertised_cb(state
c270: 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c  Ptr->ctx, NPNCal
c280: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c290: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d  tatePtr);..    }
c2a0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20  .#endif..}.../* 
c2b0: 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f  Enable server to
c2c0: 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65   send cert reque
c2d0: 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61  st after handsha
c2e0: 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  ke (TLS 1.3 only
c2f0: 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65  ) */../* A write
c300: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20   operation must 
c310: 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74  take place for t
c320: 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52  he Certificate R
c330: 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20  equest to be..  
c340: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69   sent to the cli
c350: 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65  ent, this can be
c360: 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64   done with SSL_d
c370: 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a  o_handshake(). *
c380: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26  /..if (request &
c390: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
c3a0: 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20   && tls1_3) {.. 
c3b0: 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c     SSL_verify_cl
c3c0: 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  ient_post_handsh
c3d0: 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ake(statePtr->ss
c3e0: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20  l);..}.../* set 
c3f0: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20  automatic curve 
c400: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53  selection */..SS
c410: 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28  L_set_ecdh_auto(
c420: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31  statePtr->ssl, 1
c430: 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76  );.../* Set serv
c440: 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74  er mode */..stat
c450: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
c460: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09  LS_TCL_SERVER;..
c470: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73  SSL_set_accept_s
c480: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
c490: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
c4a0: 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c  {../* Client cal
c4b0: 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66  lbacks */.#ifdef
c4c0: 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74   USE_NPN..if (st
c4d0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
c4e0: 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32  = NULL && tls1_2
c4f0: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
c500: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c  == 0) {..    SSL
c510: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
c520: 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74  oto_select_cb(st
c530: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50  atePtr->ctx, ALP
c540: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
c550: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d   *)statePtr);..}
c560: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73  .#endif.../* Ses
c570: 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a  sion caching */.
c580: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73  .SSL_CTX_set_ses
c590: 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
c5a0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c5b0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
c5c0: 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f  IENT | SSL_SESS_
c5d0: 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41  CACHE_NO_INTERNA
c5e0: 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43  L_STORE);..SSL_C
c5f0: 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f  TX_sess_set_new_
c600: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c610: 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  , SessionCallbac
c620: 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  k);.../* Enable 
c630: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41  post handshake A
c640: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78  uthentication ex
c650: 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33  tension. TLS 1.3
c660: 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f   only, not http/
c670: 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  2. */..if (reque
c680: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
c690: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
c6a0: 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  _set_post_handsh
c6b0: 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74  ake_auth(statePt
c6c0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a  r->ssl, 1);..}..
c6d0: 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d  ./* Set client m
c6e0: 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ode */..SSL_set_
c6f0: 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74  connect_state(st
c700: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
c710: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f    }.    SSL_set_
c720: 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  bio(statePtr->ss
c730: 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  l, statePtr->p_b
c740: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  io, statePtr->p_
c750: 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65  bio);.    BIO_se
c760: 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e  t_ssl(statePtr->
c770: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  bio, statePtr->s
c780: 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  sl, BIO_NOCLOSE)
c790: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
c7a0: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74   End of SSL Init
c7b0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
c7c0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
c7d0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
c7e0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
c7f0: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63  ->self));.    Tc
c800: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
c810: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c  rp, (char *) Tcl
c820: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c830: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
c840: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c850: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
c860: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c8b0: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62   *. * UnimportOb
c8c0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
c8d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
c8e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76  invoked to remov
c8f0: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  e the topmost ch
c900: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a  annel filter.. *
c910: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
c920: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
c930: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
c940: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
c950: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68  y modify the beh
c960: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63  avior of an IO c
c970: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
c980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9c0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
c9d0: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
c9e0: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
c9f0: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
ca00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ca10: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
ca20: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
ca30: 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20  t objv[]).{.    
ca40: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
ca50: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
ca60: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
ca70: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69  on. */..    dpri
ca80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
ca90: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
caa0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
cab0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
cac0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
cad0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
cae0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
caf0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
cb00: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
cb10: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
cb20: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
cb30: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
cb40: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
cb50: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
cb60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cb70: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b     /*.     * Mak
cb80: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
cb90: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
cba0: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f   channel.     */
cbb0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
cbc0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
cbd0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63  an);..    if (Tc
cbe0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
cbf0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
cc00: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
cc10: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cc20: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
cc30: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
cc40: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
cc50: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
cc60: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
cc70: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
cc80: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
cc90: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
cca0: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20  S", "UNIMPORT", 
ccb0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
ccc0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  LID", (char *)NU
ccd0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
cce0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ccf0: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
cd00: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
cd10: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45  , chan) == TCL_E
cd20: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20  RROR) {..return 
cd30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cd40: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
cd50: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cda0: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74  -. *. * CTX_Init
cdb0: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20   -- construct a 
cdc0: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
cdd0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
cde0: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43   *.A valid SSL_C
cdf0: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e  TX instance or N
ce00: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ULL.. *. * Side 
ce10: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
ce20: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65  tructs SSL conte
ce30: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
ce40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce80: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 53 53  -. */..static SS
ce90: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74  L_CTX *.CTX_Init
cea0: 28 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  (.    State *sta
ceb0: 74 65 50 74 72 2c 0a 20 20 20 20 69 6e 74 20 69  tePtr,.    int i
cec0: 73 53 65 72 76 65 72 2c 0a 20 20 20 20 69 6e 74  sServer,.    int
ced0: 20 70 72 6f 74 6f 2c 0a 20 20 20 20 63 68 61 72   proto,.    char
cee0: 20 2a 6b 65 79 66 69 6c 65 2c 0a 20 20 20 20 63   *keyfile,.    c
cef0: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20  har *certfile,. 
cf00: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
cf10: 20 2a 6b 65 79 2c 0a 20 20 20 20 75 6e 73 69 67   *key,.    unsig
cf20: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 0a  ned char *cert,.
cf30: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c      int key_len,
cf40: 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f 6c 65  .    int cert_le
cf50: 6e 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41 70  n,.    char *CAp
cf60: 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 43  ath,.    char *C
cf70: 41 66 69 6c 65 2c 0a 20 20 20 20 63 68 61 72 20  Afile,.    char 
cf80: 2a 63 69 70 68 65 72 73 2c 0a 20 20 20 20 63 68  *ciphers,.    ch
cf90: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
cfa0: 2c 0a 20 20 20 20 69 6e 74 20 6c 65 76 65 6c 2c  ,.    int level,
cfb0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
cfc0: 61 6d 73 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 49  ams).{.    Tcl_I
cfd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20  nterp *interp = 
cfe0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
cff0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
d000: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  tx = NULL;.    T
d010: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20  cl_DString ds;. 
d020: 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20     int off = 0, 
d030: 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 69  abort = 0;.    i
d040: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  nt load_private_
d050: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  key;.    const S
d060: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
d070: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
d080: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
d090: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54  if (!proto) {..T
d0a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d0b0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69  interp, "no vali
d0c0: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  d protocol selec
d0d0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  ted", (char *)NU
d0e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d0f0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
d100: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74   create SSL cont
d110: 65 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 45  ext */.    if (E
d120: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d130: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
d140: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d150: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
d160: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d170: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d180: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
d190: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 69 66   NULL;.    }.#if
d1a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
d1b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d1c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
d1d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
d1e0: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
d1f0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d200: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d210: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL3)) {..Tcl_
d220: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d230: 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f  erp, "SSL3 proto
d240: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d250: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
d260: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d270: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d280: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d290: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
d2a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c  ENSSL_NO_TLS1) |
d2b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d2c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
d2d0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d2e0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d2f0: 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c  TO_TLS1)) {..Tcl
d300: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d310: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70  terp, "TLS 1.0 p
d320: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d330: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d340: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d350: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d360: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d370: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
d380: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d390: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
d3a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d3b0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_1_METHOD).    
d3c0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d3d0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
d3e0: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_1)) {..Tcl_App
d3f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d400: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f  , "TLS 1.1 proto
d410: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d420: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
d430: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d440: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d450: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d460: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
d470: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d480: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
d490: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f  ENSSL_NO_TLS1_2_
d4a0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 69 66 20 28  METHOD).    if (
d4b0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d4c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
d4d0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d4e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d4f0: 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.2 protocol 
d500: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d510: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
d520: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d530: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d540: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
d550: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d560: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  SSL_NO_TLS1_3) |
d570: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d580: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 5f 4d 45 54 48  L_NO_TLS1_3_METH
d590: 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  OD).    if (ENAB
d5a0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d5b0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a  ROTO_TLS1_3)) {.
d5c0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d5d0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
d5e0: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .3 protocol not 
d5f0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
d600: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
d610: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d620: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72  endif.    if (pr
d630: 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20  oto == 0) {../* 
d640: 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a  Use full range *
d650: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  /..SSL_CTX_set_m
d660: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
d670: 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43  (ctx, 0);..SSL_C
d680: 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f  TX_set_max_proto
d690: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
d6a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
d6b0: 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69  tch (proto) {.#i
d6c0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
d6d0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
d6e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
d6f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
d710: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
d720: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d  S_PROTO_SSL3:..m
d730: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
d740: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f   ? SSLv3_server_
d750: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33  method() : SSLv3
d760: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d770: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
d780: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d790: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
d7a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d7b0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
d7c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d7d0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
d7e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
d7f0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d800: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76  ver ? TLSv1_serv
d810: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d820: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Sv1_client_metho
d830: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d840: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d850: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
d860: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d870: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
d880: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d890: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
d8a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d8b0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
d8c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d8d0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f   TLSv1_1_server_
d8e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
d8f0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _1_client_method
d900: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d910: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d920: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
d930: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d940: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
d950: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d960: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
d970: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d980: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68  TO_TLS1_2:..meth
d990: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d9a0: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d  TLSv1_2_server_m
d9b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
d9c0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
d9d0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d9e0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d9f0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
da00: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
da10: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
da20: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
da30: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20  _3:../* Use the 
da40: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61  generic method a
da50: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61  nd constraint ra
da60: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78  nge after contex
da70: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  t is created */.
da80: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
da90: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
daa0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
dab0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
dac0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
dad0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20     default:../* 
dae0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73  Negotiate highes
daf0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f  t available SSL/
db00: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09  TLS version */..
db10: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
db20: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
db30: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
db40: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23  ient_method();.#
db50: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
db60: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
db70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
db80: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
db90: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
dba0: 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45  THOD)..off |= (E
dbb0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dbc0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20  S_PROTO_SSL3)   
dbd0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dbe0: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv3);.#endif.#
dbf0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dc00: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
dc10: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
dc20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dc30: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
dc40: 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45  THOD)..off |= (E
dc50: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dc60: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
dc70: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dc80: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
dc90: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
dca0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
dcb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
dcc0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
dcd0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dce0: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66  1_1_METHOD)..off
dcf0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
dd00: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
dd10: 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_1) ? 0 : SSL_
dd20: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a  OP_NO_TLSv1_1);.
dd30: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
dd40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
dd50: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dd60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
dd70: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dd80: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
dd90: 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  OD)..off |= (ENA
dda0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
ddb0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
ddc0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
ddd0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
dde0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
ddf0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !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 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
de20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
de30: 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66  1_3_METHOD)..off
de40: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
de50: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
de60: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
de70: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
de80: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
de90: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
dea0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
deb0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
dec0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
ded0: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
dee0: 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20  turn(NULL);.    
def0: 7d 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e  }..    if (geten
df00: 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29  v(SSLKEYLOGFILE)
df10: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
df20: 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b  _keylog_callback
df30: 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c  (ctx, KeyLogCall
df40: 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  back);.    }..#i
df50: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
df60: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
df70: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
df80: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f  1_3).    if (pro
df90: 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f  to == TLS_PROTO_
dfa0: 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43  TLS1_3) {..SSL_C
dfb0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
dfc0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c  _version(ctx, TL
dfd0: 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09  S1_3_VERSION);..
dfe0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f  SSL_CTX_set_max_
dff0: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
e000: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
e010: 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  N);.    }.#endif
e020: 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63  ..    /* Force c
e030: 69 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20  ipher selection 
e040: 6f 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20  order by server 
e050: 2a 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65  */.    if (!isSe
e060: 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58  rver) {..SSL_CTX
e070: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
e080: 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f  , SSL_OP_CIPHER_
e090: 53 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43  SERVER_PREFERENC
e0a0: 45 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53  E);.    }..    S
e0b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
e0c0: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
e0d0: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
e0e0: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
e0f0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
e100: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e110: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
e120: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
e130: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
e140: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e150: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
e160: 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49  _OP_NO_COMPRESSI
e170: 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20  ON);./* disable 
e180: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e  compression even
e190: 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   if supported */
e1a0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e1b0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
e1c0: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
e1d0: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
e1e0: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
e1f0: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
e200: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a  size(ctx, 128);.
e210: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72  .    /* Set user
e220: 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73   defined ciphers
e230: 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c  , cipher suites,
e240: 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65   and security le
e250: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  vel */.    if ((
e260: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
e270: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
e280: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
e290: 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54  , ciphers)) {..T
e2a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e2b0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e2c0: 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20  hers failed: No 
e2d0: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20  valid ciphers", 
e2e0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
e2f0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e300: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e310: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
e320: 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d 20  ciphersuites != 
e330: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54  NULL) && !SSL_CT
e340: 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69 74  X_set_ciphersuit
e350: 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73 75  es(ctx, ciphersu
e360: 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ites)) {..Tcl_Ap
e370: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e380: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20 73  p, "Set cipher s
e390: 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f  uites failed: No
e3a0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
e3b0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
e3c0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e3d0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
e3e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e3f0: 53 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76  Set security lev
e400: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65  el */.    if (le
e410: 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65  vel > -1 && leve
e420: 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c  l < 6) {../* SSL
e430: 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _set_security_le
e440: 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  vel */..SSL_CTX_
e450: 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76  set_security_lev
e460: 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a  el(ctx, level);.
e470: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
e480: 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73  t some callbacks
e490: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
e4a0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
e4b0: 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77  wd_cb(ctx, Passw
e4c0: 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ordCallback);.  
e4d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65    SSL_CTX_set_de
e4e0: 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f  fault_passwd_cb_
e4f0: 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28 76  userdata(ctx, (v
e500: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
e510: 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20  ..    /* read a 
e520: 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70  Diffie-Hellman p
e530: 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20  arameters file, 
e540: 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c 74  or use the built
e550: 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65  -in one */.#ifde
e560: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
e570: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
e580: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
e590: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e5a0: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65  terp, "DH parame
e5b0: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20  ter support not 
e5c0: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61  available", (cha
e5d0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  r *)NULL);..SSL_
e5e0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e5f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
e600: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09   }.#else.    {..
e610: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70  DH* dh;..if (DHp
e620: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
e630: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ..    BIO *bio;.
e640: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e  .    bio = BIO_n
e650: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61  ew_file(F2N(DHpa
e660: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29  rams, &ds), "r")
e670: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29  ;..    if (!bio)
e680: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
e690: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c  Free(&ds);...Tcl
e6a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e6b0: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
e6c0: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74   find DH paramet
e6d0: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72  ers file", (char
e6e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f   *)NULL);...SSL_
e6f0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e700: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e710: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20     }...    dh = 
e720: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70  PEM_read_bio_DHp
e730: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c  arams(bio, NULL,
e740: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20   NULL, NULL);.. 
e750: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29     BIO_free(bio)
e760: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
e770: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
e780: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54    if (!dh) {...T
e790: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e7a0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
e7b0: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d  ot read DH param
e7c0: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22  eters from file"
e7d0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
e7e0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
e7f0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
e800: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
e810: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70   SSL_CTX_set_tmp
e820: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20  _dh(ctx, dh);.. 
e830: 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a     DH_free(dh);.
e840: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
e850: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77  /* Use well know
e860: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  n DH parameters 
e870: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d  that have built-
e880: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70  in support in Op
e890: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66  enSSL */..    if
e8a0: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64   (!SSL_CTX_set_d
e8b0: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20  h_auto(ctx, 1)) 
e8c0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
e8d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
e8e0: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73  uld not enable s
e8f0: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47  et DH auto: ", G
e900: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
e910: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
e920: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e930: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
e940: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  LL;..    }..}.  
e950: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
e960: 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69  /* set our certi
e970: 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f  ficate */.    lo
e980: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
e990: 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74   0;.    if (cert
e9a0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
e9b0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
e9c0: 79 20 3d 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c  y = 1;...if (SSL
e9d0: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
e9e0: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46  cate_file(ctx, F
e9f0: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73  2N(certfile, &ds
ea00: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
ea10: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
ea20: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
ea30: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
ea40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ea50: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
ea60: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
ea70: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
ea80: 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20 20 47  e, ": ",...    G
ea90: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
eaa0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
eab0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
eac0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
ead0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63  urn NULL;..}..Tc
eae0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
eaf0: 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  s);..    } else 
eb00: 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c  if (cert != NULL
eb10: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
eb20: 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28  e_key = 1;..if (
eb30: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
eb40: 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78  ificate_ASN1(ctx
eb50: 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74  , cert_len, cert
eb60: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
eb70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
eb80: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
eb90: 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61  to set certifica
eba0: 74 65 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54  te: ",...    GET
ebb0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
ebc0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
ebd0: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
ebe0: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
ebf0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
ec00: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c   else {..certfil
ec10: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f  e = (char*)X509_
ec20: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74  get_default_cert
ec30: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53  _file();...if (S
ec40: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
ec50: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
ec60: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46   certfile, SSL_F
ec70: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
ec80: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20  0) {.#if 0..    
ec90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
eca0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
ecb0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
ecc0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
ecd0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
ece0: 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52   ",...    GET_ER
ecf0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
ed00: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
ed10: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
ed20: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
ed30: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20  ULL;.#endif..}. 
ed40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74     }..    /* set
ed50: 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79   our private key
ed60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64   */.    if (load
ed70: 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a  _private_key) {.
ed80: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20  .if (keyfile == 
ed90: 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e  NULL && key == N
eda0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66  ULL) {..    keyf
edb0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
edc0: 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  .}...if (keyfile
edd0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
ede0: 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76   /* get the priv
edf0: 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  ate key associat
ee00: 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72  ed with this cer
ee10: 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
ee20: 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20   if (keyfile == 
ee30: 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c  NULL) {...keyfil
ee40: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20  e = certfile;.. 
ee50: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53     }...    if (S
ee60: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
ee70: 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20  teKey_file(ctx, 
ee80: 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73  F2N(keyfile, &ds
ee90: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
eea0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  PEM) <= 0) {...T
eeb0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
eec0: 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
eed0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
eee0: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
eef0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
ef00: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
ef10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
ef20: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
ef30: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
ef40: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
ef50: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
ef60: 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66  key file ", keyf
ef70: 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 47 45 54  ile, " ",....GET
ef80: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
ef90: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09  char *)NULL);...
efa0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
efb0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
efc0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
efd0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
efe0: 73 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  s);..} else if (
eff0: 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key != NULL) {..
f000: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
f010: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41  use_PrivateKey_A
f020: 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41  SN1(EVP_PKEY_RSA
f030: 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c  , ctx, key,key_l
f040: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a  en) <= 0) {.../*
f050: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
f060: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
f070: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
f080: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
f090: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
f0a0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
f0b0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
f0c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f0d0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
f0e0: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47  public key: ", G
f0f0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f100: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
f110: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f120: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f130: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f  LL;..    }..}../
f140: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68  * Now we know th
f150: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72  at a key and cer
f160: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  t have been set 
f170: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20  against.. * the 
f180: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  SSL context */..
f190: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65  if (!SSL_CTX_che
f1a0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63  ck_private_key(c
f1b0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  tx)) {..    Tcl_
f1c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f1d0: 65 72 70 2c 0a 09 09 09 20 20 20 20 22 70 72 69  erp,....    "pri
f1e0: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
f1f0: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
f200: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
f210: 65 79 22 2c 0a 09 09 09 20 20 20 20 28 63 68 61  ey",....    (cha
f220: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
f230: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f240: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f250: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
f260: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65     /* Set to use
f270: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
f280: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
f290: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
f2a0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
f2b0: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20  icates. The.    
f2c0: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61   * verify path a
f2d0: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20  nd store can be 
f2e0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
f2f0: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
f300: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69  nv var. The veri
f310: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20  fy file can.    
f320: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e   * be overridden
f330: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f340: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
f350: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
f360: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
f370: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
f380: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20  ) {..abort++;.  
f390: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
f3a0: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41  rides for the CA
f3b0: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
f3c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23   file */.    {.#
f3d0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
f3e0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
f3f0: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70  000000L..if (CAp
f400: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43  ath != NULL || C
f410: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
f420: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f430: 67 20 64 73 31 3b 0a 09 20 20 20 20 69 66 20 28  g ds1;..    if (
f440: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
f450: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
f460: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
f470: 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68  &ds), F2N(CApath
f480: 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62  , &ds1))) {...ab
f490: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
f4a0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f4b0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
f4c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f4d0: 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65  s1);...    /* Se
f4e0: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f  t list of CAs to
f4f0: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20   send to client 
f500: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
f510: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69  a client certifi
f520: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  cate */..    /* 
f530: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f  https://sourcefo
f540: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75  rge.net/p/tls/bu
f550: 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f  gs/57/ */..    /
f560: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20  * XXX:TODO: Let 
f570: 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20  the user supply 
f580: 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74  values here inst
f590: 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67  ead of something
f5a0: 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20   that exists on 
f5b0: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a  the filesystem *
f5c0: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
f5d0: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
f5e0: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
f5f0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
f600: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
f610: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
f620: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
f630: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
f640: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
f650: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
f660: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
f670: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f680: 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28  ..}..#else..if (
f690: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20  CApath != NULL) 
f6a0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
f6b0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
f6c0: 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70  dir(ctx, F2N(CAp
f6d0: 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09  ath, &ds))) {...
f6e0: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
f6f0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
f700: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69  Free(&ds);..}..i
f710: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
f720: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
f730: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
f740: 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  fy_file(ctx, F2N
f750: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20  (CAfile, &ds))) 
f760: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
f770: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
f780: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
f790: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
f7a0: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
f7b0: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
f7c0: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
f7d0: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
f7e0: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
f7f0: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
f800: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
f810: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
f820: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
f830: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
f840: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
f850: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
f860: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
f870: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
f880: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
f890: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
f8a0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ..}.#endif.    }
f8b0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78  ..    return ctx
f8c0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
f8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
f910: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d  *. * StatusObjCm
f920: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74  d -- return cert
f930: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e  ificate for conn
f940: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20  ected peer.. *. 
f950: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
f960: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
f970: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
f980: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
f990: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
f9e0: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73  tatic int.Status
f9f0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
fa00: 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
fa10: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
fa20: 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20  interp,.    int 
fa30: 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62  objc,.    Tcl_Ob
fa40: 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j.*const objv[])
fa50: 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
fa60: 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39  atePtr;.    X509
fa70: 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f   *peer;.    Tcl_
fa80: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20  Obj *objPtr;.   
fa90: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
faa0: 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61  n;.    char *cha
fab0: 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65  nnelName, *ciphe
fac0: 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65  rs;.    int mode
fad0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
fae0: 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
faf0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69  ;.    unsigned i
fb00: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  nt len;.    int 
fb10: 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64  nid, res;..    d
fb20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
fb30: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
fb40: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20  < 2 || objc > 3 
fb50: 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26  || (objc == 3 &&
fb60: 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   !strcmp(Tcl_Get
fb70: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
fb80: 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09   "-local"))) {..
fb90: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
fba0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
fbb0: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
fbc0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
fbd0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
fbe0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
fbf0: 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
fc00: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
fc10: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
fc20: 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32  (objv[(objc == 2
fc30: 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 6c   ? 1 : 2)], (Tcl
fc40: 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a  _Size *) NULL);.
fc50: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
fc60: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
fc70: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26  , channelName, &
fc80: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
fc90: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
fca0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
fcb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fcc0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
fcd0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
fce0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
fcf0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
fd00: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
fd10: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
fd20: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
fd30: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
fd40: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
fd50: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
fd60: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
fd70: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
fd80: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
fd90: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
fda0: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
fdb0: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
fdc0: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  ;..Tcl_SetErrorC
fdd0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
fde0: 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48  ", "STATUS", "CH
fdf0: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
fe00: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
fe10: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
fe20: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
fe30: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
fe40: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
fe50: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
fe60: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  han);..    /* Ge
fe70: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
fe80: 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a  r peer or self *
fe90: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
fea0: 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53  = 2) {..peer = S
feb0: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74  SL_get_peer_cert
fec0: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
fed0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
fee0: 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  se {..peer = SSL
fef0: 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65  _get_certificate
ff00: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
ff10: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65  .    }.    /* Ge
ff20: 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  t X509 certifica
ff30: 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  te info */.    i
ff40: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
ff50: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
ff60: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
ff70: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
ff80: 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66  2) {..    X509_f
ff90: 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20  ree(peer);..    
ffa0: 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  peer = NULL;..}.
ffb0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62      } else {..ob
ffc0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
ffd0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
ffe0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65      }..    /* Pe
fff0: 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c  er name */.    L
10000 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10010 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72  p, objPtr, "peer
10020 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f  name", SSL_get0_
10030 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74  peername(statePt
10040 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20  r->ssl), -1);.  
10050 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
10060 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10070 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63  bits", SSL_get_c
10080 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65  ipher_bits(state
10090 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29  Ptr->ssl, NULL))
100a0 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d  ;..    ciphers =
100b0 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f   (char*)SSL_get_
100c0 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
100d0 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45  >ssl);.    LAPPE
100e0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
100f0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c  bjPtr, "cipher",
10100 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a   ciphers, -1);..
10110 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
10120 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  e X509 certifica
10130 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20  te presented by 
10140 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20  the peer */.    
10150 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10160 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
10170 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30  ifyResult",..X50
10180 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
10190 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67  ror_string(SSL_g
101a0 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
101b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
101c0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
101d0 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20  erify mode */.  
101e0 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74    mode = SSL_get
101f0 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61  _verify_mode(sta
10200 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
10210 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c   if (mode && SSL
10220 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a  _VERIFY_NONE) {.
10230 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
10250 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65  rifyMode", "none
10260 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c  ", -1);.    } el
10270 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c  se {..Tcl_Obj *l
10280 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  istObjPtr = Tcl_
10290 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
102a0 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26  LL);..if (mode &
102b0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  & SSL_VERIFY_PEE
102c0 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  R) {..    Tcl_Li
102d0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
102e0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
102f0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10300 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20  ringObj("peer", 
10310 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
10320 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
10330 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
10340 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63  _CERT) {..    Tc
10350 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10360 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10370 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10380 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69  ewStringObj("fai
10390 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72  l if no peer cer
103a0 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
103b0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
103c0 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
103d0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
103e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
103f0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
10400 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10410 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f  ingObj("client o
10420 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  nce", -1));..}..
10430 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10440 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
10450 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63  SHAKE) {..    Tc
10460 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10470 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
10480 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
10490 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73  ewStringObj("pos
104a0 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31  t handshake", -1
104b0 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  ));..}..LAPPEND_
104c0 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OBJ(interp, objP
104d0 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
104e0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20  , listObjPtr).  
104f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69    }..    /* Veri
10500 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f  fy mode depth */
10510 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10520 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10530 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20   "verifyDepth", 
10540 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64  SSL_get_verify_d
10550 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73  epth(statePtr->s
10560 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  sl));..    /* Re
10570 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
10580 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
10590 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
105a0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
105b0 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
105c0 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
105d0 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
105e0 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
105f0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10600 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
10610 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63  har *)proto, (Tc
10620 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20  l_Size) len);.  
10630 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10640 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10650 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
10660 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
10670 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  tr->ssl), -1);..
10680 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72      /* Valid for
10690 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75   non-RSA signatu
106a0 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a  re and TLS 1.3 *
106b0 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
106c0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
106d0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
106e0 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
106f0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10700 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
10710 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
10720 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
10730 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10740 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65     }.    if (!re
10750 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20  s) {nid = 0;}.  
10760 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10770 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10780 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f  ignatureHashAlgo
10790 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32  rithm", OBJ_nid2
107a0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20  ln(nid), -1);.. 
107b0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
107c0 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  ) {..res = SSL_g
107d0 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72  et_peer_signatur
107e0 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
107f0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10800 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
10810 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67  es = SSL_get_sig
10820 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
10830 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10840 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nid);.    }.    
10850 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d  if (!res) {nid =
10860 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44   0;}.    LAPPEND
10870 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10880 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54  Ptr, "signatureT
10890 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  ype", OBJ_nid2ln
108a0 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  (nid), -1);..   
108b0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
108c0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
108d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
108e0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74  --. *. * Connect
10940 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d  ionInfoObjCmd --
10950 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69   return connecti
10960 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65  on info from Ope
10970 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
10980 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f  lts:. *.A list o
10990 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  f connection inf
109a0 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  o.  *. *--------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
109f0 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e  .static int Conn
10a00 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10a10 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44  (.    TCL_UNUSED
10a20 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63  (void *),.    Tc
10a30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10a40 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  ,.    int objc,.
10a50 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
10a60 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20  st objv[]).{.   
10a70 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
10a80 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
10a90 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
10aa0 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65   on */.    State
10ab0 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
10ac0 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
10ad0 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
10ae0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
10af0 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20  tr, *listPtr;.  
10b00 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c    const SSL *ssl
10b10 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
10b20 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a  CIPHER *cipher;.
10b30 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45      const SSL_SE
10b40 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a  SSION *session;.
10b50 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44      const EVP_MD
10b60 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f   *md;..    if (o
10b70 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
10b80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10b90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10ba0 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
10bb0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
10bc0 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
10bd0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
10be0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10bf0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10c00 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20  v[1], (Tcl_Size 
10c10 2a 29 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  *)NULL), NULL);.
10c20 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
10c30 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
10c40 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43  LL) {..return(TC
10c50 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
10c60 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
10c70 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
10c80 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
10c90 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
10ca0 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
10cb0 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
10cc0 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
10cd0 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
10ce0 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
10cf0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
10d00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
10d10 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
10d20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
10d30 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22  me(chan),..    "
10d40 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
10d50 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
10d60 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
10d70 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
10d80 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43  "CONNECTION", "C
10d90 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
10da0 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
10db0 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
10dc0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
10dd0 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
10de0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
10df0 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
10e00 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
10e10 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
10e20 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
10e30 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
10e40 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
10e50 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
10e60 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
10e70 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
10e80 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
10e90 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10ea0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10eb0 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65  tate", SSL_state
10ec0 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
10ed0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
10ee0 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
10ef0 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c  erver name */..L
10f00 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10f10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76  p, objPtr, "serv
10f20 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74  ername", SSL_get
10f30 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
10f40 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
10f50 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29  _host_name), -1)
10f60 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
10f70 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
10f80 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10f90 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
10fa0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
10fb0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
10fc0 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
10fd0 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
10fe0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10ff0 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
11000 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
11010 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
11020 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
11030 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c  port((SSL *) ssl
11040 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63  ));.../* Get sec
11050 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09  urity level */..
11060 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11070 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
11080 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53  urity_level", SS
11090 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_get_security_l
110a0 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  evel(ssl));.../*
110b0 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
110c0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
110d0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
110e0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c  session_reused",
110f0 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75   SSL_session_reu
11100 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  sed(ssl));.../* 
11110 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a  Is server info *
11120 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11130 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11140 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c  "is_server", SSL
11150 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29  _is_server(ssl))
11160 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a  ;.../* Is DTLS *
11170 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11180 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11190 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69  "is_dtls", SSL_i
111a0 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20  s_dtls(ssl));.  
111b0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68    }..    /* Ciph
111c0 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63  er info */.    c
111d0 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  ipher = SSL_get_
111e0 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73  current_cipher(s
111f0 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70  sl);.    if (cip
11200 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  her != NULL) {..
11210 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
11220 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74   = {0};..int bit
11230 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f  s, alg_bits;.../
11240 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f  * Cipher name */
11250 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11260 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11270 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48  ipher", SSL_CIPH
11280 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68  ER_get_name(ciph
11290 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52  er), -1);.../* R
112a0 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  FC name of ciphe
112b0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
112c0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
112d0 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  , "standard_name
112e0 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74  ", SSL_CIPHER_st
112f0 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68  andard_name(ciph
11300 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f  er), -1);.../* O
11310 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63  penSSL name of c
11320 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
11330 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11340 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e  jPtr, "openssl_n
11350 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69  ame", OPENSSL_ci
11360 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49  pher_name(SSL_CI
11370 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
11380 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  me(cipher)), -1)
11390 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66  ;.../* number of
113a0 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65   secret bits use
113b0 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a  d for cipher */.
113c0 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48  .bits = SSL_CIPH
113d0 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68  ER_get_bits(ciph
113e0 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a  er, &alg_bits);.
113f0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
11400 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11410 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73  cret_bits", bits
11420 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  );..LAPPEND_INT(
11430 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11440 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22  "algorithm_bits"
11450 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a  , alg_bits);../*
11460 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74   alg_bits is act
11470 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62  ual key secret b
11480 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73  its. If use bits
11490 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67   and secret (alg
114a0 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66  orithm) bits dif
114b0 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73  fer,..   the res
114c0 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72  t of the bits ar
114d0 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f  e fixed, i.e. fo
114e0 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74  r limited export
114f0 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c   ciphers (bits <
11500 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64   56) */.../* Ind
11510 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c  icates which SSL
11520 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65  /TLS protocol ve
11530 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69  rsion first defi
11540 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a  ned the cipher *
11550 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11560 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11570 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53  min_version", SS
11580 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72  L_CIPHER_get_ver
11590 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31  sion(cipher), -1
115a0 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e  );.../* Cipher N
115b0 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  ID */..LAPPEND_S
115c0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
115d0 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20  r, "cipherNID", 
115e0 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
115f0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
11600 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70  t_cipher_nid(cip
11610 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
11620 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11630 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74   objPtr, "digest
11640 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
11650 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
11660 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e  HER_get_digest_n
11670 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
11680 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11690 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
116a0 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c  keyExchangeNID",
116b0 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
116c0 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
116d0 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72  et_kx_nid(cipher
116e0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
116f0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11700 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63  jPtr, "authentic
11710 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72  ationNID", (char
11720 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
11730 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74  L_CIPHER_get_aut
11740 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  h_nid(cipher)), 
11750 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67  -1);.../* messag
11760 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
11770 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69   code - Cipher i
11780 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d  s AEAD (e.g. GCM
11790 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c   or ChaCha20/Pol
117a0 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f  y1305) or not */
117b0 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74  ../* Authenticat
117c0 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69  ed Encryption wi
117d0 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  th associated da
117e0 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20  ta (AEAD) check 
117f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11800 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11810 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64   "cipher_is_aead
11820 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73  ", SSL_CIPHER_is
11830 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a  _aead(cipher));.
11840 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64  ../* Digest used
11850 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f   during the SSL/
11860 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68  TLS handshake wh
11870 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69 70  en using the cip
11880 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53  her. */..md = SS
11890 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e  L_CIPHER_get_han
118a0 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69  dshake_digest(ci
118b0 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  pher);..LAPPEND_
118c0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
118d0 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64  tr, "handshake_d
118e0 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29  igest", (char *)
118f0 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c  EVP_MD_name(md),
11900 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f   -1);.../* Get O
11910 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20  penSSL-specific 
11920 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20  ID, not IANA ID 
11930 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  */..LAPPEND_INT(
11940 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11950 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e  "cipher_id", (in
11960 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
11970 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a  t_id(cipher));..
11980 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20  ./* Two-byte ID 
11990 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20  used in the TLS 
119a0 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20  protocol of the 
119b0 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a  given cipher */.
119c0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
119d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
119e0 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74  otocol_id", (int
119f0 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  ) SSL_CIPHER_get
11a00 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70  _protocol_id(cip
11a10 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74  her));.../* Text
11a20 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
11a30 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
11a40 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52  ..if (SSL_CIPHER
11a50 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70  _description(cip
11a60 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  her, buf, sizeof
11a70 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
11a80 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  {..    LAPPEND_S
11a90 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11aa0 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22  r, "description"
11ab0 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20  , buf, -1);..}. 
11ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73     }..    /* Ses
11ad0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
11ae0 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67   session = SSL_g
11af0 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b  et_session(ssl);
11b00 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e  .    if (session
11b10 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e   != NULL) {..con
11b20 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11b30 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f   *ticket;..size_
11b40 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65  t len2;..unsigne
11b50 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e  d int ulen;..con
11b60 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
11b70 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70   *session_id, *p
11b80 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20  roto;..unsigned 
11b90 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f  char buffer[SSL_
11ba0 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
11bb0 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70  ENGTH];.../* Rep
11bc0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
11bd0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
11be0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50  esult of the ALP
11bf0 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
11c00 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
11c10 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
11c20 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f  (session, &proto
11c30 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
11c40 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11c50 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28  bjPtr, "alpn", (
11c60 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
11c70 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
11c80 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
11c90 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11ca0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11cb0 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69  f the NPN negoti
11cc0 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20  ation */.#ifdef 
11cd0 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74  USE_NPN..SSL_get
11ce0 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67  0_next_proto_neg
11cf0 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72  otiated(ssl, &pr
11d00 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  oto, &ulen);..LA
11d10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11d20 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c  , objPtr, "npn",
11d30 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c   (char *) proto,
11d40 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e   (Tcl_Size) ulen
11d50 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52  );.#endif.../* R
11d60 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e  esumable session
11d70 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11d80 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11d90 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53  , "resumable", S
11da0 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65  SL_SESSION_is_re
11db0 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29  sumable(session)
11dc0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
11dd0 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f  start time (seco
11de0 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29  nds since epoch)
11df0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
11e00 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
11e10 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20  , "start_time", 
11e20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
11e30 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a  time(session));.
11e40 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c  ../* Timeout val
11e50 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74  ue - SSL_CTX_get
11e60 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63  _timeout (in sec
11e70 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e  onds) */..LAPPEN
11e80 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f  D_LONG(interp, o
11e90 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22  bjPtr, "timeout"
11ea0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
11eb0 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f  t_timeout(sessio
11ec0 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
11ed0 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61  n id - TLSv1.2 a
11ee0 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f  nd below only */
11ef0 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
11f00 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
11f10 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
11f20 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
11f30 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
11f40 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c  r, "session_id",
11f50 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63   session_id, (Tc
11f60 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
11f70 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74  ./* Session cont
11f80 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f  ext */..session_
11f90 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
11fa0 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74  _get0_id_context
11fb0 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
11fc0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
11fd0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
11fe0 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65  , "session_conte
11ff0 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  xt", session_id,
12000 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e   (Tcl_Size) ulen
12010 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12020 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20  ticket - client 
12030 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  only */..SSL_SES
12040 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74  SION_get0_ticket
12050 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
12060 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  t, &len2);..LAPP
12070 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12080 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
12090 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63  ion_ticket", tic
120a0 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
120b0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  len2);.../* Sess
120c0 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74  ion ticket lifet
120d0 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63  ime hint (in sec
120e0 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e  onds) */..LAPPEN
120f0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f  D_LONG(interp, o
12100 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65  bjPtr, "lifetime
12110 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
12120 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69  et_ticket_lifeti
12130 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29  me_hint(session)
12140 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61  );.../* Ticket a
12150 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f  pp data */.#if O
12160 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
12170 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
12180 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e  00L..SSL_SESSION
12190 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70  _get0_ticket_app
121a0 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f  data((SSL_SESSIO
121b0 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74  N *) session, &t
121c0 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09  icket, &len2);..
121d0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
121e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
121f0 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22  ticket_app_data"
12200 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53  , ticket, (Tcl_S
12210 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64  ize) len2);.#end
12220 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74  if.../* Get mast
12230 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20  er key */..len2 
12240 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
12250 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73  t_master_key(ses
12260 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53  sion, buffer, SS
12270 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
12280 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45  _LENGTH);..LAPPE
12290 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
122a0 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65  , objPtr, "maste
122b0 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20  r_key", buffer, 
122c0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
122d0 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69  ;.../* Compressi
122e0 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e  on id */..unsign
122f0 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f  ed int id = SSL_
12300 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70  SESSION_get_comp
12310 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29  ress_id(session)
12320 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12330 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12340 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c  compression_id",
12350 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62   id == 1 ? "zlib
12360 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  " : "none", -1);
12370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
12380 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20  ompression info 
12390 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  */.    if (ssl !
123a0 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66  = NULL) {.#ifdef
123b0 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45   HAVE_SSL_COMPRE
123c0 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d  SSION..const COM
123d0 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20  P_METHOD *comp, 
123e0 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53  *expn;..comp = S
123f0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
12400 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b  ompression(ssl);
12410 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74  ..expn = SSL_get
12420 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69  _current_expansi
12430 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45  on(ssl);...LAPPE
12440 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
12450 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73  bjPtr, "compress
12460 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c  ion", comp ? SSL
12470 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63  _COMP_get_name(c
12480 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d  omp) : "none", -
12490 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
124a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
124b0 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78   "expansion", ex
124c0 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  pn ? SSL_COMP_ge
124d0 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22  t_name(expn) : "
124e0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73  none", -1);.#els
124f0 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  e..LAPPEND_STR(i
12500 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12510 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e  compression", "n
12520 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
12530 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12540 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
12550 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
12560 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
12570 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e      /* Server in
12580 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e  fo */.    {..lon
12590 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58  g mode = SSL_CTX
125a0 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _get_session_cac
125b0 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
125c0 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d  ->ctx);..char *m
125d0 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26  sg;...if (mode &
125e0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
125f0 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  OFF) {..    msg 
12600 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65  = "off";..} else
12610 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
12620 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
12630 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  T) {..    msg = 
12640 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73  "client";..} els
12650 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
12660 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56  _SESS_CACHE_SERV
12670 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  ER) {..    msg =
12680 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c   "server";..} el
12690 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
126a0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54  L_SESS_CACHE_BOT
126b0 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  H) {..    msg = 
126c0 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20  "both";..} else 
126d0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e  {..    msg = "un
126e0 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50  known";..}..LAPP
126f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12700 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
12710 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73  _cache_mode", ms
12720 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  g, -1);.    }.. 
12730 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f     /* CA List */
12740 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61  .    /* IF not a
12750 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73   server, same as
12760 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43   SSL_get0_peer_C
12770 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65  A_list. If serve
12780 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54  r same as SSL_CT
12790 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_get_client_CA_
127a0 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74  list */.    list
127b0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
127c0 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
127d0 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39     STACK_OF(X509
127e0 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b  _NAME) *ca_list;
127f0 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73  .    if ((ca_lis
12800 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65  t = SSL_get_clie
12810 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29  nt_CA_list(ssl))
12820 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61   != NULL) {..cha
12830 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d  r buffer[BUFSIZ]
12840 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20  ;..for (int i = 
12850 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e  0; i < sk_X509_N
12860 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29  AME_num(ca_list)
12870 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35  ; i++) {..    X5
12880 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20  09_NAME *name = 
12890 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c  sk_X509_NAME_val
128a0 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a  ue(ca_list, i);.
128b0 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b  .    if (name) {
128c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65  ...X509_NAME_one
128d0 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65  line(name, buffe
128e0 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63  r, BUFSIZ);...Tc
128f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12900 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
12910 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
12920 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c  tringObj(buffer,
12930 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d   -1));..    }..}
12940 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
12950 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
12960 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c  bjPtr, "caList",
12970 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c   listPtr);.    L
12980 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12990 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69  p, objPtr, "caLi
129a0 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30  stCount", sk_X50
129b0 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69  9_NAME_num(ca_li
129c0 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  st));..    Tcl_S
129d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
129e0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
129f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12a00 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
12a50 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64   * VersionObjCmd
12a60 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69   -- return versi
12a70 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f  on string from O
12a80 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
12a90 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
12aa0 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
12ab0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
12ac0 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
12ad0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b10 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
12b20 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a  c int.VersionObj
12b30 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55  Cmd(.    TCL_UNU
12b40 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20  SED(void *),.   
12b50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
12b60 65 72 70 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55  erp,.    TCL_UNU
12b70 53 45 44 28 69 6e 74 29 20 2f 2a 20 6f 62 6a 63  SED(int) /* objc
12b80 20 2a 2f 2c 0a 20 20 20 20 54 43 4c 5f 55 4e 55   */,.    TCL_UNU
12b90 53 45 44 28 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  SED(Tcl_Obj *con
12ba0 73 74 20 2a 29 20 2f 2a 20 6f 62 6a 76 20 2a 2f  st *) /* objv */
12bb0 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ).{.    Tcl_Obj 
12bc0 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70  *objPtr;..    dp
12bd0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
12be0 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
12bf0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12c00 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12c10 54 45 58 54 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  TEXT, -1);..    
12c20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12c30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
12c40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12c50 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ca0 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43  -. *. * MiscObjC
12cb0 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61  md -- misc comma
12cc0 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nds. *. * Result
12cd0 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
12ce0 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
12cf0 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12d00 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d50 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
12d60 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 0a 20 20  t.MiscObjCmd(.  
12d70 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
12d80 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
12d90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12da0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
12db0 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f  Tcl_Obj.*const o
12dc0 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 73 74 61  bjv[]).{.    sta
12dd0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
12de0 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20  commands [] = { 
12df0 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c  "req", "strreq",
12e00 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75   NULL };.    enu
12e10 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45  m command { C_RE
12e20 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44  Q, C_STRREQ, C_D
12e30 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f  UMMY };.    Tcl_
12e40 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e  Size cmd;.    in
12e50 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  t isStr;.    cha
12e60 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
12e70 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
12e80 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
12e90 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
12ea0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12eb0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
12ec0 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72   "subcommand ?ar
12ed0 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  gs?");..return T
12ee0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
12ef0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
12f00 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
12f10 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d  rp, objv[1], com
12f20 6d 61 6e 64 73 2c 0a 09 20 20 20 20 22 63 6f 6d  mands,..    "com
12f30 6d 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21  mand", 0,&cmd) !
12f40 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
12f50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12f60 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
12f70 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
12f80 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d    isStr = (cmd =
12f90 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20  = C_STRREQ);.   
12fa0 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63   switch ((enum c
12fb0 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09  ommand) cmd) {..
12fc0 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73  case C_REQ:..cas
12fd0 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20  e C_STRREQ: {.. 
12fe0 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65     EVP_PKEY *pke
12ff0 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  y=NULL;..    X50
13000 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20  9 *cert=NULL;.. 
13010 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61     X509_NAME *na
13020 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63  me=NULL;..    Tc
13030 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09  l_Obj **listv;..
13040 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73      Tcl_Size lis
13050 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  tc,i;...    BIO 
13060 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
13070 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f 43   const char *k_C
13080 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f  ="",*k_ST="",*k_
13090 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f  L="",*k_O="",*k_
130a0 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a  OU="",*k_CN="",*
130b0 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20  k_Email="";..   
130c0 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70   char *keyout,*p
130d0 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20  emout,*str;..   
130e0 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72   int keysize,ser
130f0 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a  ial=0,days=365;.
13100 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
13110 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
13120 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42  30000000L..    B
13130 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c  IGNUM *bne = NUL
13140 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61  L;..    RSA *rsa
13150 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09   = NULL;.#else..
13160 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58      EVP_PKEY_CTX
13170 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65   *ctx = NULL;.#e
13180 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28  ndif...    if ((
13190 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63  objc<5) || (objc
131a0 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f  >6)) {...Tcl_Wro
131b0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
131c0 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73  , 2, objv, "keys
131d0 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74  ize keyfile cert
131e0 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09  file ?info?");..
131f0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13200 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  R;..    }...    
13210 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
13220 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13230 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29  jv[2], &keysize)
13240 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
13250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13260 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65  ;..    }..    ke
13270 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  yout=Tcl_GetStri
13280 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20  ng(objv[3]);..  
13290 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74    pemout=Tcl_Get
132a0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
132b0 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29  ..    if (isStr)
132c0 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28   {...Tcl_SetVar(
132d0 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22  interp,keyout,""
132e0 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61  ,0);...Tcl_SetVa
132f0 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
13300 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  "",0);..    }...
13310 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29      if (objc>=6)
13320 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73   {...if (Tcl_Lis
13330 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
13340 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c  interp, objv[5],
13350 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29   &listc, &listv)
13360 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
13370 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13380 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
13390 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29  ((listc%2) != 0)
133a0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
133b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49  Result(interp,"I
133c0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20  nformation list 
133d0 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e  must have even n
133e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
133f0 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ts",NULL);...   
13400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13410 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d  R;...}...for (i=
13420 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32  0; i<listc; i+=2
13430 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63  ) {...    str=Tc
13440 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13450 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20  v[i]);...    if 
13460 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79  (strcmp(str,"day
13470 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20  s")==0) {....if 
13480 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
13490 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b  bj(interp,listv[
134a0 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c  i+1],&days)!=TCL
134b0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
134c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
134d0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
134e0 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61  trcmp(str,"seria
134f0 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20  l")==0) {....if 
13500 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f  (Tcl_GetIntFromO
13510 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b  bj(interp,listv[
13520 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54  i+1],&serial)!=T
13530 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
13540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13550 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13560 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29  (strcmp(str,"C")
13570 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63  ==0) {....k_C=Tc
13580 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13590 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
135a0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
135b0 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b  (str,"ST")==0) {
135c0 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74  ....k_ST=Tcl_Get
135d0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
135e0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
135f0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13600 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "L")==0) {....k_
13610 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  L=Tcl_GetString(
13620 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13630 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13640 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30  rcmp(str,"O")==0
13650 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47  ) {....k_O=Tcl_G
13660 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13670 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13680 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13690 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"OU")==0) {...
136a0 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72  .k_OU=Tcl_GetStr
136b0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
136c0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
136d0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e   (strcmp(str,"CN
136e0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e  ")==0) {....k_CN
136f0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
13700 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
13710 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13720 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29  cmp(str,"Email")
13730 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69  ==0) {....k_Emai
13740 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  l=Tcl_GetString(
13750 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13760 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54     } else {....T
13770 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
13780 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72  erp,"Unknown par
13790 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09  ameter",NULL);..
137a0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
137b0 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a  OR;...    }...}.
137c0 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e  .    }..#if OPEN
137d0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
137e0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
137f0 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e  ..    bne = BN_n
13800 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d  ew();..    rsa =
13810 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20   RSA_new();..   
13820 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59   pkey = EVP_PKEY
13830 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20  _new();..    if 
13840 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (bne == NULL || 
13850 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70  rsa == NULL || p
13860 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  key == NULL || !
13870 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c  BN_set_word(bne,
13880 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53  RSA_F4) ||...!RS
13890 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65  A_generate_key_e
138a0 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20  x(rsa, keysize, 
138b0 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45  bne, NULL) || !E
138c0 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52  VP_PKEY_assign_R
138d0 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b  SA(pkey, rsa)) {
138e0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
138f0 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41  (pkey);.../* RSA
13900 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65  _free(rsa); free
13910 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72  d by EVP_PKEY_fr
13920 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28  ee */...BN_free(
13930 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20  bne);.#else..   
13940 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f   pkey = EVP_RSA_
13950 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  gen((unsigned in
13960 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20  t) keysize);..  
13970 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59    ctx = EVP_PKEY
13980 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55  _CTX_new(pkey,NU
13990 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b  LL);..    if (pk
139a0 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74  ey == NULL || ct
139b0 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56  x == NULL || !EV
139c0 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e  P_PKEY_keygen_in
139d0 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56  it(ctx) ||...!EV
139e0 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72  P_PKEY_CTX_set_r
139f0 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63  sa_keygen_bits(c
13a00 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20  tx, keysize) || 
13a10 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e  !EVP_PKEY_keygen
13a20 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a  (ctx, &pkey)) {.
13a30 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
13a40 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45  pkey);...EVP_PKE
13a50 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  Y_CTX_free(ctx);
13a60 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65  .#endif...Tcl_Se
13a70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
13a80 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  Error generating
13a90 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55   private key",NU
13aa0 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
13ab0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20  L_ERROR;..    } 
13ac0 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53  else {...if (isS
13ad0 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
13ae0 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
13af0 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
13b00 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74  write_bio_Privat
13b10 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55  eKey(out,pkey,NU
13b20 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e  LL,NULL,0,NULL,N
13b30 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ULL);...    i=BI
13b40 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
13b50 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
13b60 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
13b70 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
13b80 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
13b90 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
13ba0 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74  ar(interp,keyout
13bb0 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
13bc0 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
13bd0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
13be0 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
13bf0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
13c00 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
13c10 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
13c20 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
13c30 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  keyout);...    P
13c40 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69  EM_write_bio_Pri
13c50 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79  vateKey(out,pkey
13c60 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c  ,NULL,NULL,0,NUL
13c70 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f  L,NULL);...    /
13c80 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f  * PEM_write_bio_
13c90 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75  RSAPrivateKey(ou
13ca0 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55  t, rsa, NULL, NU
13cb0 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  LL, 0, NULL, NUL
13cc0 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f  L); */...    BIO
13cd0 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a  _free_all(out);.
13ce0 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72  . .}....if ((cer
13cf0 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e  t=X509_new())==N
13d00 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
13d10 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
13d20 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74  p,"Error generat
13d30 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20  ing certificate 
13d40 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a  request",NULL);.
13d50 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
13d60 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
13d70 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13d80 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13d90 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
13da0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
13db0 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f  .    return(TCL_
13dc0 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58  ERROR);...}....X
13dd0 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28  509_set_version(
13de0 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f  cert,2);...ASN1_
13df0 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39  INTEGER_set(X509
13e00 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65  _get_serialNumbe
13e10 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b  r(cert),serial);
13e20 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
13e30 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
13e40 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
13e50 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
13e60 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
13e70 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e  After(cert),(lon
13e80 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29  g)60*60*24*days)
13e90 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62  ;...X509_set_pub
13ea0 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a  key(cert,pkey);.
13eb0 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74  ...name=X509_get
13ec0 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
13ed0 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d  rt);....X509_NAM
13ee0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13ef0 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53  xt(name,"C", MBS
13f00 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69  TRING_ASC, (unsi
13f10 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
13f20 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13f30 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13f40 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13f50 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
13f60 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68  SC, (unsigned ch
13f70 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20  ar *) k_ST, -1, 
13f80 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
13f90 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13fa0 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d  _txt(name,"L", M
13fb0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75 6e  BSTRING_ASC, (un
13fc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13fd0 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _L, -1, -1, 0);.
13fe0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13ff0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14000 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"O", MBSTRING_
14010 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ASC, (unsigned c
14020 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20  har *) k_O, -1, 
14030 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
14040 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
14050 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20  _txt(name,"OU", 
14060 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 75  MBSTRING_ASC, (u
14070 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14080 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
14090 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
140a0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
140b0 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
140c0 4e 47 5f 41 53 43 2c 20 28 75 6e 73 69 67 6e 65  NG_ASC, (unsigne
140d0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20  d char *) k_CN, 
140e0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
140f0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14100 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45  y_by_txt(name,"E
14110 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  mail", MBSTRING_
14120 41 53 43 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  ASC, (unsigned c
14130 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20  har *) k_Email, 
14140 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58  -1, -1, 0);....X
14150 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f  509_set_subject_
14160 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b  name(cert,name);
14170 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69  ....if (!X509_si
14180 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50  gn(cert,pkey,EVP
14190 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09  _sha256())) {...
141a0 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65      X509_free(ce
141b0 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  rt);...    EVP_P
141c0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
141d0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
141e0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
141f0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
14200 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
14210 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  dif...    Tcl_Se
14220 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
14230 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65  Error signing ce
14240 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29  rtificate",NULL)
14250 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
14260 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
14270 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09  .if (isStr) {...
14280 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
14290 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09  BIO_s_mem());...
142a0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
142b0 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
142c0 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
142d0 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
142e0 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
142f0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
14300 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
14310 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
14320 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
14330 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66  nterp,pemout,buf
14340 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
14350 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
14360 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
14370 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
14380 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
14390 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
143a0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
143b0 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f  ilename(out,pemo
143c0 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
143d0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
143e0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42  t,cert);...    B
143f0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
14400 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72  ;...}....X509_fr
14410 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f  ee(cert);...EVP_
14420 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
14430 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
14440 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
14450 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66  30000000L...BN_f
14460 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
14470 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
14480 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
14490 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20  .break;.    }.  
144a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
144b0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14500 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a  . * Tls_Free --.
14510 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
14520 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
14530 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
14540 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
14550 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
14560 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
14570 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
14580 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  1. *. * Results:
14590 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
145a0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
145b0 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
145c0 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
14610 0a 76 6f 69 64 0a 23 69 66 20 54 43 4c 5f 4d 41  .void.#if TCL_MA
14620 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a  JOR_VERSION > 8.
14630 54 6c 73 5f 46 72 65 65 28 20 76 6f 69 64 20 2a  Tls_Free( void *
14640 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6c 73 65  blockPtr ).#else
14650 0a 54 6c 73 5f 46 72 65 65 28 20 63 68 61 72 20  .Tls_Free( char 
14660 2a 62 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6e 64  *blockPtr ).#end
14670 69 66 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  if.{.    State *
14680 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
14690 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20  e *)blockPtr;.. 
146a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
146b0 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43  ed");..    Tls_C
146c0 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a  lean(statePtr);.
146d0 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b      ckfree(block
146e0 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
146f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14730 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65  --. *. * Tls_Cle
14740 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  an --. *. *.This
14750 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
14760 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
14770 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
14780 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
14790 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
147a0 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
147b0 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73  below 1.  This s
147c0 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c  hould. *.be call
147d0 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79  ed synchronously
147e0 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f   by the ClosePro
147f0 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a  c, not in the. *
14800 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  .EventuallyFree 
14810 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
14820 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
14830 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
14840 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
14850 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
14860 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148a0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c  ----. */.void Tl
148b0 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73  s_Clean(State *s
148c0 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64  tatePtr) {.    d
148d0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
148e0 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
148f0 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
14900 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20  here that we're 
14910 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
14920 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
14930 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
14940 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
14950 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
14960 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
14970 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
14980 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
14990 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20  >timer = NULL;. 
149a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
149b0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20  atePtr->protos) 
149c0 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50  {..ckfree(stateP
149d0 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74  tr->protos);..st
149e0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
149f0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14a00 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62   if (statePtr->b
14a10 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77  io) {../* This w
14a20 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75  ill call SSL_shu
14a30 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30  tdown. Bug 14140
14a40 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22  45 */..dprintf("
14a50 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29  BIO_free_all(%p)
14a60 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ", statePtr->bio
14a70 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  );..BIO_free_all
14a80 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b  (statePtr->bio);
14a90 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20  ..statePtr->bio 
14aa0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14ab0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14ac0 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  ssl) {..dprintf(
14ad0 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20  "SSL_free(%p)", 
14ae0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
14af0 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50  .SSL_free(stateP
14b00 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65  tr->ssl);..state
14b10 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b  Ptr->ssl = NULL;
14b20 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14b30 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a  tatePtr->ctx) {.
14b40 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74  .SSL_CTX_free(st
14b50 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73  atePtr->ctx);..s
14b60 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e  tatePtr->ctx = N
14b70 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14b80 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
14b90 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65  lback) {..Tcl_De
14ba0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
14bb0 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
14bc0 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  .statePtr->callb
14bd0 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ack = NULL;.    
14be0 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14bf0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a  tr->password) {.
14c00 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
14c10 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
14c20 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72  word);..statePtr
14c30 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c  ->password = NUL
14c40 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14c50 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
14c60 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
14c70 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
14c80 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  cmd);..statePtr-
14c90 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  >vcmd = NULL;.  
14ca0 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
14cb0 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d  ("Returning");.}
14cc0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
14cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
14d10 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a  * Tls_Init --. *
14d20 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61  . *.This is a pa
14d30 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61  ckage initializa
14d40 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20  tion procedure, 
14d50 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a  which is called.
14d60 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74   *.by Tcl when t
14d70 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74  his package is t
14d80 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e  o be added to an
14d90 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a   interpreter.. *
14da0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73  . * Results:  Ss
14db0 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64  l configured and
14dc0 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69   loaded. *. * Si
14dd0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20  de effects:. *. 
14de0 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63  create the ssl c
14df0 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69  ommand, initiali
14e00 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20  ze ssl context. 
14e10 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e50 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66  -------. */..#if
14e60 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23  ndef STRINGIFY.#
14e70 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49    define STRINGI
14e80 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31  FY(x) STRINGIFY1
14e90 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54  (x).#  define ST
14ea0 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23  RINGIFY1(x) #x.#
14eb0 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f  endif..static co
14ec0 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
14ed0 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
14ee0 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
14ef0 6c 2e 68 22 0a 20 20 20 20 30 78 30 30 0a 7d 3b  l.h".    0x00.};
14f00 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  ..DLLEXPORT int 
14f10 54 6c 73 5f 49 6e 69 74 28 0a 20 20 20 20 54 63  Tls_Init(.    Tc
14f20 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14f30 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49  ).{.    Tcl_CmdI
14f40 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 64  nfo info;..    d
14f50 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14f60 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49  ;..    if (Tcl_I
14f70 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
14f80 20 22 38 2e 36 2d 22 2c 20 30 29 20 3d 3d 20 4e   "8.6-", 0) == N
14f90 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
14fa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14fb0 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
14fc0 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
14fd0 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
14fe0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
14ff0 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
15000 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
15010 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
15020 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
15030 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
15040 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15050 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15060 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68  ::ciphers", Ciph
15070 65 72 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c  ersObjCmd, NULL,
15080 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65   0);.    Tcl_Cre
15090 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
150a0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e  terp, "tls::conn
150b0 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74  ection", Connect
150c0 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 4e  ionInfoObjCmd, N
150d0 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ULL, 0);.    Tcl
150e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
150f0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15100 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
15110 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 4e 55 4c  shakeObjCmd, NUL
15120 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43  L, 0);.    Tcl_C
15130 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15140 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d  interp, "tls::im
15150 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
15160 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20  Cmd, NULL, 0);. 
15170 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15180 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15190 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c  "tls::unimport",
151a0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c   UnimportObjCmd,
151b0 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54   NULL, 0);.    T
151c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
151d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
151e0 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75  ::status", Statu
151f0 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30  sObjCmd, NULL, 0
15200 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
15210 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15220 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73 69 6f  rp, "tls::versio
15230 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  n", VersionObjCm
15240 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  d, NULL, 0);.   
15250 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15260 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15270 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
15280 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b  bjCmd, NULL, 0);
15290 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
152a0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
152b0 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c  , "tls::protocol
152c0 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  s", ProtocolsObj
152d0 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  Cmd, NULL, 0);..
152e0 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20      if (interp) 
152f0 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 28  {..if (Tcl_Eval(
15300 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e  interp, tlsTclIn
15310 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c  itScript) != TCL
15320 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75  _OK) {..    retu
15330 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
15340 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
15350 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
15360 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 63  fo(interp, "::tc
15370 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20  l::build-info", 
15380 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f 43  &info)) {..Tcl_C
15390 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
153a0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
153b0 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 0a 09 09 69  build-info",...i
153c0 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f  nfo.objProc, (vo
153d0 69 64 20 2a 29 28 0a 09 09 20 20 20 20 50 41 43  id *)(...    PAC
153e0 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22  KAGE_VERSION "+"
153f0 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56   STRINGIFY(TLS_V
15400 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 09 09 09  ERSION_UUID)....
15410 20 20 20 20 22 2e 62 6f 68 61 67 61 6e 22 0a 23      ".bohagan".#
15420 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  if defined(__cla
15430 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ng__) && defined
15440 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f  (__clang_major__
15450 29 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67  )....    ".clang
15460 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63  -" STRINGIFY(__c
15470 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69  lang_major__).#i
15480 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f  f __clang_minor_
15490 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30  _ < 10....    "0
154a0 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20  ".#endif....    
154b0 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e  STRINGIFY(__clan
154c0 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69  g_minor__).#endi
154d0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
154e0 63 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64  cplusplus) && !d
154f0 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29  efined(__OBJC__)
15500 0a 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70  ....    ".cplusp
15510 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  lus".#endif.#ifn
15520 64 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20  def NDEBUG....  
15530 20 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69    ".debug".#endi
15540 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  f.#if !defined(_
15550 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65  _clang__) && !de
15560 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f  fined(__INTEL_CO
15570 4d 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e  MPILER) && defin
15580 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09  ed(__GNUC__)....
15590 20 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49      ".gcc-" STRI
155a0 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a  NGIFY(__GNUC__).
155b0 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52  #if __GNUC_MINOR
155c0 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22  __ < 10....    "
155d0 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20  0".#endif....   
155e0 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55   STRINGIFY(__GNU
155f0 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69  C_MINOR__).#endi
15600 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c  f.#ifdef __INTEL
15610 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20  _COMPILER....   
15620 20 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49   ".icc-" STRINGI
15630 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  FY(__INTEL_COMPI
15640 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  LER).#endif.#ifd
15650 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47  ef TCL_MEM_DEBUG
15660 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62  ....    ".memdeb
15670 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ug".#endif.#if d
15680 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
15690 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22  ....    ".msvc-"
156a0 20 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f   STRINGIFY(_MSC_
156b0 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  VER).#endif.#ifd
156c0 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09  ef USE_NMAKE....
156d0 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e      ".nmake".#en
156e0 64 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f  dif.#ifndef TCL_
156f0 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09  CFG_OPTIMIZED...
15700 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69  .    ".no-optimi
15710 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ze".#endif.#ifde
15720 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20  f __OBJC__....  
15730 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22    ".objective-c"
15740 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63  .#if defined(__c
15750 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20  plusplus)....   
15760 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64   "plusplus".#end
15770 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
15780 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45   TCL_CFG_PROFILE
15790 44 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69  D....    ".profi
157a0 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  le".#endif.#ifde
157b0 66 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20  f PURIFY....    
157c0 22 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66  ".purify".#endif
157d0 0a 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42  .#ifdef STATIC_B
157e0 55 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74  UILD....    ".st
157f0 61 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29  atic".#endif...)
15800 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a  , NULL);.    }..
15810 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
15820 6b 67 50 72 6f 76 69 64 65 45 78 28 69 6e 74 65  kgProvideEx(inte
15830 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45  rp, PACKAGE_NAME
15840 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
15850 4e 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a  N, NULL);.}../*.
15860 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
158a0 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a  Tls_SafeInit --.
158b0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158e0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64  ------*. *.Stand
158f0 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65  ard procedure re
15900 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27  quired by 'load'
15910 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  .. *.Initializes
15920 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20   this extension 
15930 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72  for a safe inter
15940 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d  preter.. *.-----
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15980 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
15990 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f  . *..As of 'Tls_
159a0 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75  Init'. *. *.Resu
159b0 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61  lt:. *..A standa
159c0 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64  rd Tcl error cod
159d0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15a10 20 2a 2f 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69   */..DLLEXPORT i
15a20 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28  nt Tls_SafeInit(
15a30 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15a40 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  rp) {.    dprint
15a50 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
15a60 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74   return(Tls_Init
15a70 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a  (interp));.}../*
15a80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15ac0 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20  .TlsLibInit --. 
15ad0 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b00 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61  -----*. *.Initia
15b10 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
15b20 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
15b30 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  cation. *.------
15b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
15b70 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  *.Side effects:.
15b80 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20   *..initializes 
15b90 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
15ba0 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f  *.Result:. *..no
15bb0 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15bf0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
15c00 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
15c10 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20  initialize) {.  
15c20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69    static int ini
15c30 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20  tialized = 0;.  
15c40 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54    int status = T
15c50 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  CL_OK;.#if defin
15c60 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15c70 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15c80 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15c90 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73  size_t num_locks
15ca0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
15cb0 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20   (uninitialize) 
15cc0 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69  {..if (!initiali
15cd0 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69  zed) {..    dpri
15ce0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
15cf0 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20  initialize, but 
15d00 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69  we are not initi
15d10 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20  alized");...    
15d20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
15d30 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73  .}...dprintf("As
15d40 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15d50 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  ize");..#if defi
15d60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15d70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15d80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
15d90 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
15da0 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63  t_mx);...if (loc
15db0 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28  ks) {..    free(
15dc0 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63  locks);..    loc
15dd0 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ks = NULL;..    
15de0 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
15df0 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69  .}.#endif..initi
15e00 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66  alized = 0;..#if
15e10 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15e20 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15e30 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15e40 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
15e50 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
15e60 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43  ndif...return(TC
15e70 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  L_OK);.    }..  
15e80 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
15e90 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
15ea0 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
15eb0 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
15ec0 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29  ..return(status)
15ed0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15ee0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
15ef0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15f00 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15f10 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15f20 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
15f30 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
15f40 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e  );.#endif.    in
15f50 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
15f60 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15f70 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15f80 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15f90 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63  ADS).    num_loc
15fa0 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  ks = 1;.    lock
15fb0 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e  sCount = (int) n
15fc0 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f  um_locks;.    lo
15fd0 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  cks = malloc(siz
15fe0 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
15ff0 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65  m_locks);.    me
16000 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73  mset(locks, 0, s
16010 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
16020 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64  num_locks);.#end
16030 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  if..    /* Initi
16040 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72  alize BOTH libcr
16050 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e  ypto and libssl.
16060 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f   */.    OPENSSL_
16070 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c  init_ssl(OPENSSL
16080 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53  _INIT_LOAD_SSL_S
16090 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c  TRINGS | OPENSSL
160a0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54  _INIT_LOAD_CRYPT
160b0 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45  O_STRINGS..| OPE
160c0 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
160d0 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e  L_CIPHERS | OPEN
160e0 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
160f0 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b  _DIGESTS, NULL);
16100 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63  ..    BIO_new_tc
16110 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66  l(NULL, 0);..#if
16120 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16130 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16140 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16150 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55  ).    Tcl_MutexU
16160 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  nlock(&init_mx);
16170 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74  .#endif..    ret
16180 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a     urn(status);.}.