Hex Artifact Content

Artifact e096bf52533f86de17f3f62d6964b0131641db88dcb650ad7feb8849da642006:


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 0a 2f 2a 0a 20 2a  ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29  ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e   \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 4e  ULL) ? (char *)N
04a0: 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72  ULL : \...Tcl_Tr
04b0: 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28  anslateFileName(
04c0: 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28  interp, (key), (
04d0: 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20 53  dsp)))..static S
04e0: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74  SL_CTX *CTX_Init
04f0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
0500: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
0510: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
0520: 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65  *key,...char *ce
0530: 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  rtfile, unsigned
0540: 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c   char *key_asn1,
0550: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0560: 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74  cert_asn1,...int
0570: 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69   key_asn1_len, i
0580: 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e  nt cert_asn1_len
0590: 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 20  , char *CApath, 
05a0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09  char *CAfile,...
05b0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
05c0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
05d0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
05e0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
05f0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69  static int.TlsLi
0600: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
0610: 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e  ialize);..#defin
0620: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
0630: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54  ..0x01.#define T
0640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30  LS_PROTO_SSL3..0
0650: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x02.#define TLS_
0660: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34  PROTO_TLS1..0x04
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 5f 31 09 30 78 30 38 0a 23  TO_TLS1_1.0x08.#
0690: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
06a0: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65  _TLS1_2.0x10.#de
06b0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
06c0: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69  LS1_3.0x20.#defi
06d0: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c  ne ENABLED(flag,
06e0: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20   mask).(((flag) 
06f0: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61  & (mask)) == (ma
0700: 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 53  sk))..#define SS
0710: 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 53  LKEYLOGFILE.."SS
0720: 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a  LKEYLOGFILE"../*
0730: 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65 20  . * Thread-Safe 
0740: 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69  TLS Code. */..#i
0750: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53  fdef TCL_THREADS
0760: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c  .#define OPENSSL
0770: 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53 0a  _THREAD_DEFINES.
0780: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0790: 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e  l/opensslconf.h>
07a0: 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  ..#ifdef OPENSSL
07b0: 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75 64  _THREADS.#includ
07c0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74  e <openssl/crypt
07d0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  o.h>.#include <o
07e0: 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f  penssl/ssl.h>../
07f0: 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70  *. * Threaded op
0800: 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73  eration requires
0810: 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63   locking callbac
0820: 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d  ks. * Based from
0830: 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69   /crypto/cryptli
0840: 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61  b.c of OpenSSL a
0850: 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a  nd NSOpenSSL.. *
0860: 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75  /..static Tcl_Mu
0870: 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c  tex *locks = NUL
0880: 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  L;.static int lo
0890: 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74  cksCount = 0;.st
08a0: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 69  atic Tcl_Mutex i
08b0: 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 2f  nit_mx;.#endif /
08c0: 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  * OPENSSL_THREAD
08d0: 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54  S */.#endif /* T
08e0: 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c  CL_THREADS */...
08f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0900: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62  ******/./* Callb
0910: 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f  acks        */./
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0930: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0980: 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62   *. * Eval Callb
0990: 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20  ack Command --. 
09a0: 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61  *. *.Eval callba
09b0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63  ck command and c
09c0: 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a  atch any errors.
09d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
09e0: 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65  *.0 = Command re
09f0: 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65  turned fail or e
0a00: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
0a10: 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f  _ERROR. *.1 = Co
0a20: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73  mmand returned s
0a30: 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72  uccess or eval r
0a40: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20  eturned TCL_OK. 
0a50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0a60: 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20  s:. *.Evaluates 
0a70: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
0a80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
0ad0: 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c  atic int.EvalCal
0ae0: 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70  lback(Tcl_Interp
0af0: 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20   *interp, State 
0b00: 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f  *statePtr, Tcl_O
0b10: 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20  bj *cmdPtr) {.  
0b20: 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d    int code, ok =
0b30: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
0b40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
0b50: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76   Tcl_Preserve((v
0b60: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a  oid *) interp);.
0b70: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0b80: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50  ((void *) stateP
0b90: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  tr);..    /* Eva
0ba0: 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l callback with 
0bb0: 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f  success for ok o
0bc0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31  r return value 1
0bd0: 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72  , fail for error
0be0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65   or return value
0bf0: 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65   0 */.    Tcl_Re
0c00: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0c10: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
0c20: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
0c30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
0c40: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
0c50: 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43    dprintf("EvalC
0c60: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f  allback: %d", co
0c70: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  de);.    if (cod
0c80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
0c90: 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20  /* Check result 
0ca0: 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  for return value
0cb0: 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65   */..Tcl_Obj *re
0cc0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
0cd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
0ce0: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20  ..if (result == 
0cf0: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49  NULL || Tcl_GetI
0d00: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
0d10: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21  , result, &ok) !
0d20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
0d30: 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72   ok = 1;..}..dpr
0d40: 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64  intf("Result: %d
0d50: 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c  ", ok);.    } el
0d60: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d  se {../* Error -
0d70: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74   reject the cert
0d80: 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69  ificate */..dpri
0d90: 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f  ntf("Tcl_Backgro
0da0: 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20  undError");.#if 
0db0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
0dc0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
0dd0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
0de0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
0df0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
0e00: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
0e10: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
0e20: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
0e30: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
0e40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76    Tcl_Release((v
0e50: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
0e60: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
0e70: 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72  e((void *) inter
0e80: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  p);.    return o
0e90: 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  k;.}.../*. *----
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0ee0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61   *. * InfoCallba
0ef0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
0f00: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74  tors SSL connect
0f10: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20  ion process. *. 
0f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
0f30: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
0f40: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
0f50: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
0f60: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0fb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49  */.static void.I
0fc0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  nfoCallback(cons
0fd0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
0fe0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a  where, int ret).
0ff0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
1000: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
1010: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
1020: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
1030: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1040: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
1050: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
1060: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
1070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61    const char *ma
1080: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20  jor, *minor;..  
1090: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
10b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
10c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
10d0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
10e0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
10f0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53  L_CB_HANDSHAKE_S
1100: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  TART) {..major =
1110: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1120: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a  inor = "start";.
1130: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77      } else if (w
1140: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
1150: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a  NDSHAKE_DONE) {.
1160: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1170: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1180: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73  done";.    } els
1190: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26  e {..if (where &
11a0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09   SSL_CB_ALERT)..
11b0: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b  major = "alert";
11c0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
11d0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43   & SSL_ST_CONNEC
11e0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e  T).major = "conn
11f0: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ect";..else if (
1200: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41  where & SSL_ST_A
1210: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20  CCEPT)..major = 
1220: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09  "accept";..else.
1230: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b  ....major = "unk
1240: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65  nown";...if (whe
1250: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44  re & SSL_CB_READ
1260: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64  )..minor = "read
1270: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1280: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54  re & SSL_CB_WRIT
1290: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69  E)..minor = "wri
12a0: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  te";..else if (w
12b0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f  here & SSL_CB_LO
12c0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f  OP)..minor = "lo
12d0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  op";..else if (w
12e0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58  here & SSL_CB_EX
12f0: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78  IT)..minor = "ex
1300: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  it";..else.....m
1310: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  inor = "unknown"
1320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1330: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1340: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1350: 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e  chan, major, min
1360: 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64  or, message, and
1370: 20 74 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20   type args */.  
1380: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1390: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
13a0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
13b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13f0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
1400: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1410: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1420: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1440: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1450: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1460: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1470: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1480: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1490: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
14a0: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
14b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14f0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
1500: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1510: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1520: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1540: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1550: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1560: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1570: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1580: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1590: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
15a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
15b0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15c0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15d0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15e0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
1600: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1610: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1620: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1630: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1640: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1650: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1660: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1670: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1680: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1690: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
16a0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
16b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16f0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
1700: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
1710: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1720: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1730: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1790: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
17a0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
17b0: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17f0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
1800: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1860: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1870: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1880: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1890: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
18a0: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
18b0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18c0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18d0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18e0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
1900: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
1910: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1920: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1930: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1940: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1950: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1960: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1970: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1980: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1990: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
19a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
19b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19c0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19d0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19e0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19f0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
1a00: 65 72 73 69 6f 6e 29 20 7b 0a 20 20 20 20 63 61  ersion) {.    ca
1a10: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a  se TLS1_VERSION:
1a20: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b  ..ver = "TLSv1";
1a30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1a40: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e  e TLS1_1_VERSION
1a50: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1a60: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1a70: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53  case TLS1_2_VERS
1a80: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1a90: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.2";..break;. 
1aa0: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56     case TLS1_3_V
1ab0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1ac0: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b  TLSv1.3";..break
1ad0: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76  ;.    case 0:..v
1ae0: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72  er = "none";..br
1af0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1b00: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77  :..ver = "unknow
1b10: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  n";..break;.    
1b20: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63  }..    switch (c
1b30: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20  ontent_type) {. 
1b40: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1b50: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20  HEADER:..type = 
1b60: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b  "Header";..break
1b70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1b80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1b90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ba0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1bb0: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  pe";..break;.   
1bc0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48   case SSL3_RT_CH
1bd0: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43  ANGE_CIPHER_SPEC
1be0: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67  :..type = "Chang
1bf0: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61  e Cipher";..brea
1c00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1c10: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65  _RT_ALERT:..type
1c20: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65   = "Alert";..bre
1c30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c40: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a  3_RT_HANDSHAKE:.
1c50: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61  .type = "Handsha
1c60: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ke";..break;.   
1c70: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50   case SSL3_RT_AP
1c80: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a  PLICATION_DATA:.
1c90: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74  .type = "App Dat
1ca0: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20  a";..break;.#if 
1cb0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
1cc0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
1cd0: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54  000L.    case DT
1ce0: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54  LS1_RT_HEARTBEAT
1cf0: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74  :..type = "Heart
1d00: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  beat";..break;.#
1d10: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1d20: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e  t:..type = "unkn
1d30: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1d40: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c   /* Needs compil
1d50: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65  e time option "e
1d60: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22  nable-ssl-trace"
1d70: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69  . */.    if ((bi
1d80: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o = BIO_new(BIO_
1d90: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c  s_mem())) != NUL
1da0: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53  L) {..int n;..SS
1db0: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c  L_trace(write_p,
1dc0: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e   version, conten
1dd0: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e  t_type, buf, len
1de0: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62  , ssl, (void *)b
1df0: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65  io);..n = BIO_re
1e00: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
1e10: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1e20: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70   < 15000 ? BIO_p
1e30: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34  ending(bio) : 14
1e40: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29  999);..n = (n<0)
1e50: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65   ? 0 : n;..buffe
1e60: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64  r[n] = 0;..(void
1e70: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b  )BIO_flush(bio);
1e80: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b  ..BIO_free(bio);
1e90: 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72  .   }..    /* Cr
1ea0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
1eb0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
1ec0: 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76  an, direction, v
1ed0: 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e  ersion, type, an
1ee0: 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a  d message args *
1ef0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
1f00: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1f10: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1f20: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
1f30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f40: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1f50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1f60: 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31  bj("message", -1
1f70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
1f80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1f90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1fa0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1fb0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
1fc0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1fd0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
1fe0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1ff0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2000: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2010: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77  l_NewStringObj(w
2020: 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20  rite_p ? "Sent" 
2030: 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31  : "Received", -1
2040: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2050: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2060: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2080: 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20  j(ver, -1));.   
2090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
20b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
20c0: 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c  wStringObj(type,
20d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
20e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
20f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2100: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2110: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
2120: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
2130: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
2140: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
2150: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2160: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
2170: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
2180: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
2190: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
21a0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65  nt(cmdPtr);.}.#e
21b0: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2200: 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c   *. * VerifyCall
2210: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f  back --. *. *.Mo
2220: 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69  nitors SSL certi
2230: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
2240: 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20  n process. Used 
2250: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20  to control the. 
2260: 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20  *.behavior when 
2270: 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  the SSL_VERIFY_P
2280: 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e  EER flag is set.
2290: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a   This is called.
22a0: 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 65   *.whenever a ce
22b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73  rtificate is ins
22c0: 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 65  pected or decide
22d0: 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65  d invalid. Calle
22e0: 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65  d for. *.each ce
22f0: 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 65  rtificate in the
2300: 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a   cert chain.. *.
2310: 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68   * Checks:. *.Th
2320: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  e certificate ch
2330: 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73  ain is checked s
2340: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
2350: 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67   deepest nesting
2360: 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65   level. *.  (the
2370: 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69   root CA certifi
2380: 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64  cate) and worked
2390: 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70   upward to the p
23a0: 65 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74  eer's certificat
23b0: 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74  e.. *.All signat
23c0: 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20  ures are valid, 
23d0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20  current time is 
23e0: 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64  within first and
23f0: 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74   last validity t
2400: 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  ime.. *.Check th
2410: 61 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  at the certifica
2420: 74 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20  te is issued by 
2430: 74 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69  the issuer certi
2440: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20  ficate issuer.. 
2450: 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f  *.Check the revo
2460: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f  cation status fo
2470: 72 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61  r each certifica
2480: 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  te.. *.Check the
2490: 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65   validity of the
24a0: 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74   given CRL and t
24b0: 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69  he cert revocati
24c0: 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68  on status.. *.Ch
24d0: 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73  eck the policies
24e0: 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74   of all the cert
24f0: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41  ificates. *. * A
2500: 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79  rgs. *.preverify
2510: 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68  _ok indicates wh
2520: 65 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66  ether the certif
2530: 69 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69  icate verificati
2540: 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72  on passed (1) or
2550: 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52   not (0). *. * R
2560: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c  esults:. *.A cal
2570: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74  lback bound to t
2580: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65  he socket may re
2590: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09  turn one of:. *.
25a0: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65      0...- the ce
25b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
25c0: 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e  med invalid, sen
25d0: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20  d verification. 
25e0: 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61  *....  failure a
25f0: 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e  lert to peer, an
2600: 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64  d terminate hand
2610: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09  shake.. *.    1.
2620: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
2630: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61  ate is deemed va
2640: 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69  lid, continue wi
2650: 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  th handshake.. *
2660: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e  .    empty strin
2670: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f  g.- no change to
2680: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
2690: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69  idation. *. * Si
26a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
26b0: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
26c0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
26d0: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
26e0: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
26f0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2700: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2710: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2720: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2770: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69  .static int.Veri
2780: 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f  fyCallback(int o
2790: 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  k, X509_STORE_CT
27a0: 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63  X *ctx) {.    Tc
27b0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
27c0: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d     SSL   *ssl..=
27d0: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52   (SSL*)X509_STOR
27e0: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74  E_CTX_get_ex_dat
27f0: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65  a(ctx, SSL_get_e
2800: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52  x_data_X509_STOR
2810: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20  E_CTX_idx());.  
2820: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d    X509  *cert..=
2830: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2840: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74  get_current_cert
2850: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65  (ctx);.    State
2860: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
2870: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
2880: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20  _data(ssl);.    
2890: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
28b0: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64  nterp;.    int d
28c0: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f  epth..= X509_STO
28d0: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72  RE_CTX_get_error
28e0: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20  _depth(ctx);.   
28f0: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39   int err..= X509
2900: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
2910: 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20  rror(ctx);..    
2920: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
2930: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
2940: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2950: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69  %d", ok);..    i
2960: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
2970: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
2980: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f  ULL) {../* Use o
2990: 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66  k value if verif
29a0: 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  ication is requi
29b0: 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74  red */..if (stat
29c0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53  ePtr->vflags & S
29d0: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
29e0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20  F_NO_PEER_CERT) 
29f0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b  {..    return ok
2a00: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
2a10: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20   return 1;..}.  
2a20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72    } else if (cer
2a30: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c  t == NULL || ssl
2a40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
2a50: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
2a60: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66    dprintf("Verif
2a70: 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20  yCallback: eval 
2a80: 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20  callback");..   
2a90: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
2aa0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
2ab0: 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c  fn, chan, depth,
2ac0: 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c   cert info list,
2ad0: 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72   status, and err
2ae0: 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  or args */.    c
2af0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
2b00: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
2b10: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b40: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2b50: 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22  ringObj("verify"
2b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2b90: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72  Ptr,..Tcl_NewStr
2ba0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
2bb0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
2bc0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
2bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2bf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2c00: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74  l_NewIntObj(dept
2c10: 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  h));.    Tcl_Lis
2c20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c30: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2c40: 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  , Tls_NewX509Obj
2c50: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
2c60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2c70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2c90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29  l_NewIntObj(ok))
2ca0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2cb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2cc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2cd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2ce0: 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72  ((char*)X509_ver
2cf0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
2d00: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
2d10: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e  ;..    /* Preven
2d20: 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c  t I/O while call
2d30: 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72  back is in progr
2d40: 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74  ess */.    /* st
2d50: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
2d60: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
2d70: 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76  K; */..    /* Ev
2d80: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
2d90: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
2da0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2db0: 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76  tr);.    ok = Ev
2dc0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
2dd0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
2de0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
2df0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2e00: 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  r);..    dprintf
2e10: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2e20: 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74  : command result
2e30: 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20   = %d", ok);..  
2e40: 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66    /* statePtr->f
2e50: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
2e60: 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a  L_CALLBACK); */.
2e70: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f      return ok;./
2e80: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65  * By default, le
2e90: 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ave verification
2ea0: 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d   unchanged. */.}
2eb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2f00: 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20  * Tls_Error --. 
2f10: 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  *. *.Calls callb
2f20: 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d  ack with error m
2f30: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69  essage.. *. * Si
2f40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
2f50: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
2f60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
2f70: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
2f80: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
2f90: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2fa0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2fb0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2fc0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3010: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28  .void.Tls_Error(
3020: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
3030: 20 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20   char *msg) {.  
3040: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3050: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3060: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3070: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c  _Obj *cmdPtr, *l
3080: 69 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69  istPtr;.    unsi
3090: 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20  gned long err;. 
30a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
30b0: 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72   = msg;..    dpr
30c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
30d0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
30e0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
30f0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
3100: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20  return;..    /* 
3110: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3120: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
3130: 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67  chan, and messag
3140: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3150: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3160: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3170: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
3180: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3190: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
31a0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
31b0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f  wStringObj("erro
31c0: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
31d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
31e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
31f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
3200: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
3210: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
3220: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
3230: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d   -1));.    if (m
3240: 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sg != NULL) {..T
3250: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3260: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3270: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3280: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3290: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
32a0: 69 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47  if ((msg = Tcl_G
32b0: 65 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74  etString(Tcl_Get
32c0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
32d0: 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ))) != NULL) {..
32e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
32f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3300: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3310: 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d  StringObj(msg, -
3320: 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  1));..    } else
3330: 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63   {..listPtr = Tc
3340: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
3350: 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28  NULL);..while ((
3360: 65 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72  err = ERR_get_er
3370: 72 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09  ror()) != 0) {..
3380: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3390: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
33a0: 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
33b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45  l_NewStringObj(E
33c0: 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f  RR_reason_error_
33d0: 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29  string(err), -1)
33e0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f  );..}..Tcl_ListO
33f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3400: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3410: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a  listPtr);.    }.
3420: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3430: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3440: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3450: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3460: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
3470: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
3480: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
3490: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
34a0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
34b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c  -----. *. * KeyL
3500: 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  ogCallback --. *
3510: 0a 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76  . *.Write receiv
3520: 65 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c  ed key data to l
3530: 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53  og file.. *. * S
3540: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
3550: 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
35a0: 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c  /.void KeyLogCal
35b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
35c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72  *ssl, const char
35d0: 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68   *line) {.    ch
35e0: 61 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76  ar *str = getenv
35f0: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b  (SSLKEYLOGFILE);
3600: 0a 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a  .    FILE *fd;..
3610: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
3620: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
3630: 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70  str) {..fd = fop
3640: 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66  en(str, "a");..f
3650: 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e  printf(fd, "%s\n
3660: 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65  ",line);..fclose
3670: 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a  (fd);.    }.}...
3680: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
36d0: 61 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b  assword Callback
36e0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
36f0: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
3700: 20 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61   is needed for a
3710: 20 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65   private key whe
3720: 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20  n loading. *.or 
3730: 73 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65  storing a PEM ce
3740: 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65  rtificate with e
3750: 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73  ncryption. Evals
3760: 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72   callback. *.scr
3770: 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20  ipt and returns 
3780: 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68  the result as th
3790: 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e  e password strin
37a0: 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20  g in buf.. *. * 
37b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
37c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
37d0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
37e0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
37f0: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
3800: 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73  s:. *.Password s
3810: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20  ize in bytes or 
3820: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  -1 for an error.
3830: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
3880: 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72  atic int.Passwor
3890: 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a  dCallback(char *
38a0: 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69  buf, int size, i
38b0: 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20  nt rwflag, void 
38c0: 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74  *udata) {.    St
38d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20  ate *statePtr.= 
38e0: 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b  (State *) udata;
38f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
3900: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
3910: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
3920: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
3930: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20  .    int code;. 
3940: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b     Tcl_Size len;
3950: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
3960: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
3970: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c   If no callback,
3980: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c   use default cal
3990: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20  lback */.    if 
39a0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
39b0: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ord == NULL) {..
39c0: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69  if (Tcl_EvalEx(i
39d0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73  nterp, "tls::pas
39e0: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f  sword", -1, TCL_
39f0: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20  EVAL_GLOBAL) == 
3a00: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63  TCL_OK) {..    c
3a10: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3a20: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3a30: 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74  gFromObj(Tcl_Get
3a40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
3a50: 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69  ), &len);..    i
3a60: 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69  f (len > (Tcl_Si
3a70: 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09  ze) size-1) {...
3a80: 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29  len = (Tcl_Size)
3a90: 20 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a   size-1;..    }.
3aa0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
3ab0: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
3ac0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c  len);..    buf[l
3ad0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20  en] = '\0';..   
3ae0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65   return (int) le
3af0: 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  n;..} else {..  
3b00: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a    return -1;..}.
3b10: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
3b20: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
3b30: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77  eval with fn, rw
3b40: 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61  flag, and size a
3b50: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
3b60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3b70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70  eObj(statePtr->p
3b80: 61 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63  assword);.    Tc
3b90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3ba0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3bb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3bc0: 72 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72  ringObj("passwor
3bd0: 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  d", -1));.    Tc
3be0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3bf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3c00: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e  mdPtr, Tcl_NewIn
3c10: 74 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20  tObj(rwflag));. 
3c20: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3c30: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3c50: 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29  NewIntObj(size))
3c60: 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  ;..    Tcl_Prese
3c70: 72 76 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74  rve((void *) int
3c80: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
3c90: 65 73 65 72 76 65 28 28 76 6f 69 64 20 2a 29 20  eserve((void *) 
3ca0: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3cb0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3cc0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3cd0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3ce0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3cf0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3d00: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3d10: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3d20: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3d30: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3d40: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3d50: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3d60: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3d70: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3d80: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3d90: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3da0: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3db0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3dc0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3dd0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3de0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3df0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3e00: 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72  void *) statePtr
3e10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75  );..    /* If su
3e20: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62  ccessful, pass b
3e30: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72  ack password str
3e40: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65  ing and truncate
3e50: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a   if too long */.
3e60: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
3e70: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20  TCL_OK) {..char 
3e80: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
3e90: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3ea0: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  mObj(Tcl_GetObjR
3eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
3ec0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e  len);..if (len >
3ed0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3ee0: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d  -1) {..    len =
3ef0: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
3f00: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
3f10: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
3f20: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
3f30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
3f40: 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a 29  Release((void *)
3f50: 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72   interp);..retur
3f60: 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20  n (int) len;.   
3f70: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3f80: 73 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65  se((void *) inte
3f90: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
3fa0: 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  -1;.}.../*. *---
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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: 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43  . *. * Session C
4000: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65  allback for Clie
4010: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  nts --. *. *.Cal
4020: 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73  led when a new s
4030: 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20  ession is added 
4040: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e  to the cache. In
4050: 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73   TLS 1.3. *.this
4060: 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64   may be received
4070: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20   multiple times 
4080: 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68  after the handsh
4090: 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c  ake. For. *.earl
40a0: 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68  ier versions, th
40b0: 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69  is will be recei
40c0: 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68  ved during the h
40d0: 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69  andshake.. *.Thi
40e0: 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72  s is the preferr
40f0: 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e  ed way to obtain
4100: 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73   a resumable ses
4110: 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  sion.. *. * Resu
4120: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4130: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4140: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4150: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4160: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4170: 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72  es:. *.0 = error
4180: 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77   where session w
4190: 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65  ill be immediate
41a0: 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ly removed from 
41b0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
41c0: 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65  he.. *.1 = succe
41d0: 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74  ss where app ret
41e0: 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20  ains session in 
41f0: 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61  session cache, a
4200: 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c  nd must call SSL
4210: 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20  _SESSION_free() 
4220: 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a  when done.. *. *
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4280: 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61  nt.SessionCallba
4290: 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c  ck(SSL *ssl, SSL
42a0: 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f  _SESSION *sessio
42b0: 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  n) {.    State *
42c0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
42d0: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
42e0: 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b  ata((SSL *)ssl);
42f0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4300: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4310: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4320: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4330: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
4340: 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
4350: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
4360: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
4370: 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f  on_id;.    size_
4380: 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69  t len2;.    unsi
4390: 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a  gned int ulen;..
43a0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
43b0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
43c0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
43d0: 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  ck == (Tcl_Obj*)
43e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
43f0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4400: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  K;.    } else if
4410: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b   (ssl == NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
4440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
4450: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
4460: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
4470: 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73  n, session id, s
4480: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61  ession ticket, a
4490: 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73  nd lifetime args
44a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
44b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
44c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
44d0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
44e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
44f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4500: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4510: 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20  gObj("session", 
4520: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
4530: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4540: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4550: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
4560: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
4570: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
4580: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
4590: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69  );..    /* Sessi
45a0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73  on id */.    ses
45b0: 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
45c0: 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
45d0: 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20  sion, &ulen);.  
45e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4600: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4610: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73  ewByteArrayObj(s
4620: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
4630: 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20  Size) ulen));.. 
4640: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69     /* Session ti
4650: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
4660: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
4670: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
4680: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20  cket, &len2);.  
4690: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
46a0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
46b0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
46c0: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
46d0: 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
46e0: 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f  ) len2));..    /
46f0: 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d  * Lifetime - num
4700: 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a  ber of seconds *
4710: 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  /.    Tcl_ListOb
4720: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4730: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4740: 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28  Tcl_NewLongObj((
4750: 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f  long) SSL_SESSIO
4760: 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66  N_get_ticket_lif
4770: 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69  etime_hint(sessi
4780: 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  on)));..    /* E
4790: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
47a0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
47b0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
47c0: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61  Ptr);.    EvalCa
47d0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
47e0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
47f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
4800: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
4810: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30  .    /* Return 0
4820: 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73   for now until s
4830: 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20  ession handling 
4840: 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20  is complete */. 
4850: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c     return 0;.}..
4860: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
48b0: 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f  ALPN Callback fo
48c0: 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50  r Servers and NP
48d0: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  N Callback for C
48e0: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
48f0: 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c  Perform protocol
4900: 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20   (http/1.1, h2, 
4910: 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74  h3, etc.) select
4920: 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69  ion for the. *.i
4930: 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69  ncoming connecti
4940: 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  on. Called after
4950: 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65   Hello and serve
4960: 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09  r callbacks.. *.
4970: 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73  Where 'out' is s
4980: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
4990: 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65   and 'in' is the
49a0: 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64   peer advertised
49b0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73   list.. *. * Res
49c0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
49d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
49e0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
49f0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4a00: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4a10: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
4a20: 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20  XT_ERR_OK: ALPN 
4a30: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
4a40: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
4a50: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
4a60: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
4a70: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72  LERT_FATAL: Ther
4a80: 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70  e was no overlap
4a90: 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69   between the cli
4aa0: 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70  ent's. *.    sup
4ab0: 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74  plied list and t
4ac0: 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67  he server config
4ad0: 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  uration. The con
4ae0: 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  nection will be 
4af0: 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f  aborted.. *.SSL_
4b00: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4b10: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  : ALPN protocol 
4b20: 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e  not selected, e.
4b30: 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41  g., because no A
4b40: 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f  LPN. *.    proto
4b50: 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75  cols are configu
4b60: 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e  red for this con
4b70: 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e  nection. The con
4b80: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4b90: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
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 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4be0: 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43  static int.ALPNC
4bf0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
4c00: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
4c10: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
4c20: 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c  igned char *outl
4c30: 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en,..const unsig
4c40: 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e  ned char *in, un
4c50: 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e  signed int inlen
4c60: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
4c70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
4c80: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
4c90: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
4ca0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
4cb0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
4cc0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
4cd0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  ;.    int code, 
4ce0: 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  res;..    dprint
4cf0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
4d00: 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c    if (ssl == NUL
4d10: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c  L || arg == NULL
4d20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4d30: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4d50: 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20  Select protocol 
4d60: 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73  */.    if (SSL_s
4d70: 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  elect_next_proto
4d80: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ((unsigned char 
4d90: 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c  **) out, outlen,
4da0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4db0: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  s, statePtr->pro
4dc0: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e  tos_len,..in, in
4dd0: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f  len) == OPENSSL_
4de0: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20  NPN_NEGOTIATED) 
4df0: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e  {../* Match foun
4e00: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  d */..res = SSL_
4e10: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4e20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
4e30: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f  OPENSSL_NPN_NO_O
4e40: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72  VERLAP = No over
4e50: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73  lap, so use firs
4e60: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65  t item from clie
4e70: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74  nt protocol list
4e80: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4e90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4ea0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4eb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
4ec0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4ed0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  ) {..return res;
4ee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4ef0: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4f00: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
4f10: 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74  han, depth, cert
4f20: 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74   info list, stat
4f30: 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72  us, and error ar
4f40: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
4f50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
4f60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
4f70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
4f80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4f90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4fa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4fb0: 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b  bj("alpn", -1));
4fc0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4fd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4fe0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
4ff0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5000: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5010: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5020: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5030: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5040: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5050: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5060: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e  ewStringObj((con
5070: 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c  st char *) *out,
5080: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5090: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
50a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
50b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  tr, Tcl_NewBoole
50c0: 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c  anObj(res == SSL
50d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29  _TLSEXT_ERR_OK))
50e0: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
50f0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
5100: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
5110: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
5120: 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d  .    if ((code =
5130: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
5140: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
5150: 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a  cmdPtr)) > 1) {.
5160: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5170: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5180: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5190: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
51b0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
51c0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
51d0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
51e0: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  L;.    }.    Tcl
51f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
5200: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  dPtr);.    retur
5210: 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n res;.}.../*. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74  ---. *. * Advert
5270: 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61  ise Protocols Ca
5280: 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20  llback for Next 
5290: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
52a0: 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65  tion (NPN) in Se
52b0: 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a  rverHello --. *.
52c0: 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.called when a
52d0: 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64   TLS server need
52e0: 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70  s a list of supp
52f0: 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20  orted protocols 
5300: 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74  for Next. *.Prot
5310: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e  ocol Negotiation
5320: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
5330: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
5340: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a  ide effects:. *.
5350: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
5360: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5370: 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f  RR_OK: NPN proto
5380: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68  col selected. Th
5390: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
53a0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
53b0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
53c0: 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   NPN protocol no
53d0: 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  t selected. The 
53e0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
53f0: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
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 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5440: 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
5450: 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e  N.static int.NPN
5460: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
5470: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75  SL *ssl, const u
5480: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f  nsigned char **o
5490: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ut, unsigned int
54a0: 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a   *outlen, void *
54b0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
54c0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
54d0: 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64  ate*)arg;..    d
54e0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
54f0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5500: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5510: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5520: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5530: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5540: 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f    /* Set protoco
5550: 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69  ls list */.    i
5560: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
5570: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
5580: 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d  *out = statePtr-
5590: 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65  >protos;..*outle
55a0: 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72  n = statePtr->pr
55b0: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
55c0: 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e  else {..*out = N
55d0: 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20  ULL;..*outlen = 
55e0: 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54  0;..return SSL_T
55f0: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5600: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
5610: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5620: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a  _OK;.}.#endif...
5630: 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
5680: 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  NI Callback for 
5690: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
56a0: 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d  .Perform server-
56b0: 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d  side SNI hostnam
56c0: 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65  e selection afte
56d0: 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20  r receiving SNI 
56e0: 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20  extension. *.in 
56f0: 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61  Client Hello. Ca
5700: 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f  lled after hello
5710: 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65   callback but be
5720: 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61  fore ALPN callba
5730: 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
5740: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
5750: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
5760: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
5770: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
5780: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
5790: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  :. *.SSL_TLSEXT_
57a0: 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74  ERR_OK: SNI host
57b0: 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64  name is accepted
57c0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
57d0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
57e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
57f0: 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68  ERT_FATAL: SNI h
5800: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5810: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e  ccepted. The con
5820: 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69  nection. *.    i
5830: 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75  s aborted. Defau
5840: 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20  lt for alert is 
5850: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
5860: 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c  ZED_NAME.. *.SSL
5870: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5880: 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68  T_WARNING: SNI h
5890: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
58a0: 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67  ccepted, warning
58b0: 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65   alert. *.    se
58c0: 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65  nt (not supporte
58d0: 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54  d in TLSv1.3). T
58e0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
58f0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
5900: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
5910: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5920: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61  s not accepted a
5930: 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64  nd not acknowled
5940: 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e  ged,. *.    e.g.
5950: 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20   if SNI has not 
5960: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e  been configured.
5970: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5980: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
59e0: 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63  nt.SNICallback(c
59f0: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69  onst SSL *ssl, i
5a00: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
5a10: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
5a20: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
5a30: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
5a40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
5a50: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
5a60: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
5a70: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
5a80: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20  nt code, res;.  
5a90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
5aa0: 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b  rvername = NULL;
5ab0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
5ac0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
5ad0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
5ae0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
5af0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5b00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5b10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79    }..    /* Only
5b20: 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31   works for TLS 1
5b30: 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a  .2 and earlier *
5b40: 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  /.    servername
5b50: 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65   = SSL_get_serve
5b60: 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
5b70: 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
5b80: 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21  name);.    if (!
5b90: 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65  servername || se
5ba0: 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27  rvername[0] == '
5bb0: 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  \0') {..return S
5bc0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5bd0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5be0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
5bf0: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
5c00: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5c10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5c20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5c30: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
5c40: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
5c50: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65   chan, and serve
5c60: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20  r name args */. 
5c70: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5c80: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5c90: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5cd0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69  ewStringObj("sni
5ce0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
5cf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5d10: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
5d20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
5d30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
5d40: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
5d50: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5d60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5d70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5d80: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5d90: 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c  Obj(servername ,
5da0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45   -1));..    /* E
5db0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
5dc0: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
5dd0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
5de0: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
5df0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
5e00: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
5e10: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
5e20: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5e30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5e40: 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72  _WARNING;..*aler
5e50: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
5e60: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
5e70: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
5e80: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
5e90: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
5ea0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
5eb0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5ec0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  K;.    } else {.
5ed0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5ee0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5ef0: 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  L;..*alert = SSL
5f00: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5f10: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5f20: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5f30: 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20  .3 */.    }.    
5f40: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5f50: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5f60: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5f70: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69  ------. *. * Cli
5fc0: 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61  entHello Handsha
5fd0: 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  ke Callback for 
5fe0: 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a  Servers --. *. *
5ff0: 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20  .Used by server 
6000: 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73  to examine the s
6010: 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63  erver name indic
6020: 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65  ation (SNI) exte
6030: 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65  nsion. *.provide
6040: 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20  d by the client 
6050: 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65  in order to sele
6060: 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ct an appropriat
6070: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f  e certificate to
6080: 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64  . *.present, and
6090: 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66   make other conf
60a0: 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74  iguration adjust
60b0: 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74  ments relevant t
60c0: 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a  o that server. *
60d0: 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f  .name and its co
60e0: 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69  nfiguration. Thi
60f0: 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70  s includes swapp
6100: 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f  ing out the asso
6110: 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54  ciated. *.SSL_CT
6120: 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66  X pointer, modif
6130: 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ying the server'
6140: 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74  s list of permit
6150: 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73  ted TLS versions
6160: 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68  ,. *.changing th
6170: 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65  e server's ciphe
6180: 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e  r list in respon
6190: 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  se to the client
61a0: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20  's cipher list, 
61b0: 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62  etc.. *.Called b
61c0: 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c  efore SNI and AL
61d0: 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  PN callbacks.. *
61e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
61f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
6200: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
6210: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
6220: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
6230: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
6240: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6250: 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74  RETRY: suspend t
6260: 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e  he handshake, an
6270: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20  d the handshake 
6280: 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
6290: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
62a0: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
62b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c  ELLO_ERROR: fail
62c0: 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63  ure, terminate c
62d0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61  onnection. Set a
62e0: 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f  lert to error co
62f0: 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  de.. *.SSL_CLIEN
6300: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a  T_HELLO_SUCCESS:
6310: 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d   success. *. *--
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 2d  ----------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
6370: 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53  .HelloCallback(S
6380: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
6390: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
63a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
63b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
63c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
63d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
63e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
63f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
6400: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
6410: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
6420: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
6430: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  me;.    const un
6440: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
6450: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20      size_t len, 
6460: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20  remaining;..    
6470: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6480: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
6490: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
64a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
64b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
64c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
64d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
64e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53  (ssl == (const S
64f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67  SL *)NULL || arg
6500: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c   == (void *)NULL
6510: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
6520: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6530: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6540: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20  * Get names */. 
6550: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65     if (!SSL_clie
6560: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78  nt_hello_get0_ex
6570: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59  t(ssl, TLSEXT_TY
6580: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20  PE_server_name, 
6590: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20  &p, &remaining) 
65a0: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  || remaining <= 
65b0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
65c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
65d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
65e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
65f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6600: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6610: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65  * Extract the le
6620: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70  ngth of the supp
6630: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d  lied list of nam
6640: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  es. */.    len =
6650: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6660: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6670: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6680: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29   2 != remaining)
6690: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
66a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
66b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
66c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
66d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
66e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
66f0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20  ining = len;..  
6700: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e    /* The list in
6710: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68   practice only h
6720: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  as a single elem
6730: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20  ent, so we only 
6740: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72  consider the fir
6750: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  st one. */.    i
6760: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  f (remaining == 
6770: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53  0 || *p++ != TLS
6780: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
6790: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72  t_name) {..*aler
67a0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
67b0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
67c0: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
67d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
67e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
67f0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20  remaining--;..  
6800: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20    /* Now we can 
6810: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74  finally pull out
6820: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20   the byte array 
6830: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20  with the actual 
6840: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  hostname. */.   
6850: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c   if (remaining <
6860: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
6870: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6880: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6890: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
68a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
68b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  R;.    }.    len
68c0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
68d0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
68e0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
68f0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67   + 2 > remaining
6900: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6910: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6920: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6930: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6940: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6950: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6960: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73  ing = len;.    s
6970: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e  ervername = (con
6980: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20  st char *)p;..  
6990: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
69a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
69b0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73   fn, chan, and s
69c0: 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20  erver name args 
69d0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
69e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
69f0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
6a00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6a10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6a20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
6a30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6a40: 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20  "hello", -1));. 
6a50: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6a60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6a70: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
6a80: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6a90: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
6aa0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
6ab0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
6ac0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
6ad0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
6ae0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
6af0: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72  StringObj(server
6b00: 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29  name, (Tcl_Size)
6b10: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
6b20: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
6b30: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
6b40: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
6b50: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
6b60: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
6b70: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
6b80: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
6b90: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6ba0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
6bb0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TRY;..*alert = S
6bc0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6bd0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b  _USER_CANCELLED;
6be0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6bf0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
6c00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6c10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
6c20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
6c30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6c40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72  LO_ERROR;..*aler
6c50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6c60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6c70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6c80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6c90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
6ca0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
6cb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cc0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73  ***/./* Commands
6cd0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
6ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6cf0: 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6d40: 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64   * CiphersObjCmd
6d50: 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62   -- list availab
6d60: 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a  le ciphers. *. *
6d70: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
6d80: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
6d90: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
6da0: 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64  ciphers" command
6db0: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
6dc0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62  lable ciphers, b
6dd0: 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63  ased upon protoc
6de0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a  ol selected.. *.
6df0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
6e00: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
6e10: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
6e20: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6e30: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64  *.constructs and
6e40: 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f   destroys SSL co
6e50: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
6e60: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
6eb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74  const char *prot
6ec0: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  ocols[] = {.    
6ed0: 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20  "ssl2", "ssl3", 
6ee0: 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22  "tls1", "tls1.1"
6ef0: 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73  , "tls1.2", "tls
6f00: 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e  1.3", NULL.};.en
6f10: 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20  um protocol {.  
6f20: 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f    TLS_SSL2, TLS_
6f30: 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20  SSL3, TLS_TLS1, 
6f40: 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f  TLS_TLS1_1, TLS_
6f50: 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_2, TLS_TLS1
6f60: 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a  _3, TLS_NONE.};.
6f70: 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68  .static int.Ciph
6f80: 65 72 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  ersObjCmd(.    T
6f90: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
6fa0: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
6fb0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
6fc0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
6fd0: 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj.*const objv
6fe0: 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []).{.    Tcl_Ob
6ff0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
7000: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
7010: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
7020: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
7030: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
7040: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
7050: 20 20 63 68 61 72 20 62 75 66 5b 42 55 46 53 49    char buf[BUFSI
7060: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65  Z];.    int inde
7070: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20  x, verbose = 0, 
7080: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20  use_supported = 
7090: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  0;.    const SSL
70a0: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
70b0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
70c0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
70d0: 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20   ((objc < 2) || 
70e0: 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54  (objc > 4)) {..T
70f0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
7100: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
7110: 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62   "protocol ?verb
7120: 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f  ose? ?supported?
7130: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
7150: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65   if (Tcl_GetInde
7160: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
7170: 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63   objv[1], protoc
7180: 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  ols, "protocol",
7190: 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54   0, &index) != T
71a0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
71b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
71c0: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
71d0: 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 2) && Tcl_GetB
71e0: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
71f0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
7200: 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f  verbose) != TCL_
7210: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
7220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
7230: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33     if ((objc > 3
7240: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
7250: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
7260: 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65  p, objv[3], &use
7270: 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54  _supported) != T
7280: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
7290: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
72a0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
72b0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73  _error();..    s
72c0: 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f  witch ((enum pro
72d0: 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 20  tocol)index) {. 
72e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 53 53 4c 32     case TLS_SSL2
72f0: 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  :..Tcl_AppendRes
7300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7310: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7320: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7330: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7340: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
7350: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7360: 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 09  case TLS_SSL3:..
7370: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7380: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7390: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
73a0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
73b0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  rted", (char *)N
73c0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
73d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 63 61 73  L_ERROR;.    cas
73e0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
73f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
7400: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7410: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7420: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7430: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
7440: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7450: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7460: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7470: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7480: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7490: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
74a0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
74b0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f  .method = TLSv1_
74c0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
74d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
74e0: 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66   TLS_TLS1_1:.#if
74f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7500: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
7510: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
7520: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7530: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
7540: 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65  ETHOD)..Tcl_Appe
7550: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7560: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7570: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7580: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
7590: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
75a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
75b0: 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d  .#else..method =
75c0: 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28   TLSv1_1_method(
75d0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
75e0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c  .    case TLS_TL
75f0: 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_2:.#if define
7600: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
7610: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7620: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7640: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
7650: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7660: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7670: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7680: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7690: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
76a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
76b0: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
76c0: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f  .method = TLSv1_
76d0: 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61  2_method(); brea
76e0: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  k;.#endif.    ca
76f0: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23  se TLS_TLS1_3:.#
7700: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
7710: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
7720: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7730: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
7740: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
7750: 5f 4d 45 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70  _METHOD)..Tcl_Ap
7760: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7770: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7780: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7790: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
77a0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
77b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
77c0: 52 3b 0a 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64  R;.#else..method
77d0: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
77e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
77f0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
7800: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
7810: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
7820: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
7830: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
7840: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 62 72 65 61  _VERSION);..brea
7850: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
7860: 66 61 75 6c 74 3a 0a 09 6d 65 74 68 6f 64 20 3d  fault:..method =
7870: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7880: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7890: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
78a0: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
78b0: 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c   if (ctx == NULL
78c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
78d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45  esult(interp, GE
78e0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
78f0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
7900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7910: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c  ;.    }..    ssl
7920: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b   = SSL_new(ctx);
7930: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
7940: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7960: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7970: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  (), (char *)NULL
7980: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
7990: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54  (ctx);..return T
79a0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
79b0: 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74  .    /* Use list
79c0: 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f   and order as wo
79d0: 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61  uld be sent in a
79e0: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20   ClientHello or 
79f0: 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69  all available ci
7a00: 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20  phers */.    if 
7a10: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20  (use_supported) 
7a20: 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31  {..sk = SSL_get1
7a30: 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65  _supported_ciphe
7a40: 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  rs(ssl);.    } e
7a50: 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f  lse {..sk = SSL_
7a60: 67 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29  get_ciphers(ssl)
7a70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
7a80: 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (sk != NULL) {..
7a90: 69 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a  if (!verbose) {.
7aa0: 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7ab0: 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a 50 74 72  *cp;..    objPtr
7ac0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
7ad0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  j(0, NULL);..   
7ae0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
7af0: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
7b00: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
7b10: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
7b20: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
7b30: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
7b40: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
7b50: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
7b60: 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e  ;..../* cipher n
7b70: 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f  ame or (NONE) */
7b80: 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48  ...cp = SSL_CIPH
7b90: 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a  ER_get_name(c);.
7ba0: 09 09 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c  ..if (cp == NULL
7bb0: 29 20 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c  ) break;...Tcl_L
7bc0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
7bd0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
7be0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
7bf0: 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09  gObj(cp, -1));..
7c00: 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b      }...} else {
7c10: 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
7c20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
7c30: 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20  "",0);..    for 
7c40: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
7c50: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75  sk_SSL_CIPHER_nu
7c60: 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09  m(sk); i++) {...
7c70: 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52  const SSL_CIPHER
7c80: 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50   *c = sk_SSL_CIP
7c90: 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29  HER_value(sk, i)
7ca0: 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c  ;...if (c == NUL
7cb0: 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09  L) continue;....
7cc0: 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72  /* textual descr
7cd0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
7ce0: 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53  pher */...if (SS
7cf0: 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70  L_CIPHER_descrip
7d00: 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a  tion(c, buf, siz
7d10: 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c  eof(buf)) != NUL
7d20: 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41  L) {...    Tcl_A
7d30: 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74  ppendToObj(objPt
7d40: 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a  r, buf, (Tcl_Siz
7d50: 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b  e) strlen(buf));
7d60: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
7d70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
7d80: 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f  j(objPtr, "UNKNO
7d90: 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09  WN\n", 8);...}..
7da0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73      }..}..if (us
7db0: 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09  e_supported) {..
7dc0: 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45      sk_SSL_CIPHE
7dd0: 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20  R_free(sk);..}. 
7de0: 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65     }.    SSL_fre
7df0: 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f  e(ssl);.    SSL_
7e00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a  CTX_free(ctx);..
7e10: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7e20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
7e30: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
7e40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
7e50: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e90: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74  -----. *. * Prot
7ea0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c  ocolsObjCmd -- l
7eb0: 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72  ist available pr
7ec0: 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68  otocols. *. *.Th
7ed0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
7ee0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
7ef0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f  ss the "tls::pro
7f00: 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a  tocols" command.
7f10: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
7f20: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a  able protocols..
7f30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
7f40: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
7f50: 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a   result list.. *
7f60: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
7f70: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
7fd0: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  nt.ProtocolsObjC
7fe0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
7ff0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
8000: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8010: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
8020: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
8030: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
8040: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
8050: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
8060: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
8070: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20   if (objc != 1) 
8080: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
8090: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
80a0: 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72  bjv, "");..retur
80b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
80c0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
80d0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
80e0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
80f0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
8100: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
8110: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
8120: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8130: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
8140: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8150: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  1_METHOD).    Tc
8160: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8170: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8180: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8190: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
81a0: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29  s[TLS_TLS1], -1)
81b0: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
81c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
81d0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
81e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
81f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8200: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
8210: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
8220: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8230: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8240: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8250: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8260: 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29  LS_TLS1_1], -1))
8270: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8280: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
8290: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
82c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
82d0: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
82e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
82f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8300: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8310: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
8320: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b  S_TLS1_2], -1));
8330: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8340: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
8350: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8360: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
8370: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8380: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8390: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
83a0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
83b0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
83c0: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
83d0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
83e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
83f0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
8400: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
8410: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61  -------. *. * Ha
8460: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d  ndshakeObjCmd --
8470: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d  . *. *.This comm
8480: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76  and is used to v
8490: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68  erify whether th
84a0: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63  e handshake is c
84b0: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f  omplete. *.or no
84c0: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
84d0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
84e0: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65  Tcl result. 1 me
84f0: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f  ans handshake co
8500: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20  mplete, 0 means 
8510: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  pending.. *. * S
8520: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
8530: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65  May force SSL ne
8540: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b  gotiation to tak
8550: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d  e place.. *. *--
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e  -. */..static in
85b0: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t HandshakeObjCm
85c0: 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
85d0: 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
8600: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
8610: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
8620: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
8630: 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an;        /* Th
8640: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
8650: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
8660: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
8670: 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c  tr;        /* cl
8680: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
8690: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
86a0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72   const char *err
86b0: 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  Str = NULL;.    
86c0: 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20  int ret = 1;.   
86d0: 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20   int err = 0;.. 
86e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
86f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
8700: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
8710: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8720: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8730: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
8740: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
8750: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
8760: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
8770: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
8780: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
8790: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
87a0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
87b0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
87c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
87d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
87e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
87f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
8800: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
8810: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
8820: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
8830: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
8840: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
8850: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
8860: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
8870: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
8880: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
8890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
88a0: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
88b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
88c0: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
88d0: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
88e0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
88f0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8900: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8910: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8920: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
8930: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ID", (char *)NUL
8940: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
8950: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
8960: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
8970: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
8980: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
8990: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69  chan);..    dpri
89a0: 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73  ntf("Calling Tls
89b0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22  _WaitForConnect"
89c0: 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73  );.    ret = Tls
89d0: 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28  _WaitForConnect(
89e0: 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20  statePtr, &err, 
89f0: 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  1);.    dprintf(
8a00: 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e  "Tls_WaitForConn
8a10: 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69  ect returned: %i
8a20: 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66  ", ret);..    if
8a30: 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73   (ret < 0 && ((s
8a40: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
8a50: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20   TLS_TCL_ASYNC) 
8a60: 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49  && (err == EAGAI
8a70: 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  N))) {..dprintf(
8a80: 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65  "Async set and e
8a90: 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09  rr = EAGAIN");..
8aa0: 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65  ret = 0;.    } e
8ab0: 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29  lse if (ret < 0)
8ac0: 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b   {..long result;
8ad0: 0a 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65  ..errStr = state
8ae0: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52  Ptr->err;..Tcl_R
8af0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
8b00: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  p);..Tcl_SetErrn
8b10: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65  o(err);...if (!e
8b20: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74  rrStr || (*errSt
8b30: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  r == 0)) {..    
8b40: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73  errStr = Tcl_Pos
8b50: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ixError(interp);
8b60: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  ..}...Tcl_Append
8b70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8b80: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
8b90: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68  : ", errStr, (ch
8ba0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 69 66 20  ar *)NULL);..if 
8bb0: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67  ((result = SSL_g
8bc0: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
8bd0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
8be0: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
8bf0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
8c00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8c10: 20 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30   due to \"", X50
8c20: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
8c30: 72 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c  ror_string(resul
8c40: 74 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  t), "\"", (char 
8c50: 2a 29 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  *)NULL);..}..Tcl
8c60: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
8c70: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8c80: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
8c90: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
8ca0: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74  );..dprintf("Ret
8cb0: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52  urning TCL_ERROR
8cc0: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20   with handshake 
8cd0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72  failed: %s", err
8ce0: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Str);..return TC
8cf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65  L_ERROR;.    } e
8d00: 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21  lse {..if (err !
8d10: 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69  = 0) {..    dpri
8d20: 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f  ntf("Got an erro
8d30: 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74  r with a complet
8d40: 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72  ed handshake: er
8d50: 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09  r = %i", err);..
8d60: 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20  }..ret = 1;.    
8d70: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
8d80: 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b  Returning TCL_OK
8d90: 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c   with data \"%i\
8da0: 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63  "", ret);.    Tc
8db0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
8dc0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
8dd0: 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20  tObj(ret));.    
8de0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
8df0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
8e40: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d   ImportObjCmd --
8e50: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
8e60: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
8e70: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
8e80: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  "ssl" command. *
8e90: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d  . *.The ssl comm
8ea0: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f  and pushes SSL o
8eb0: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e  ver a (newly con
8ec0: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b  nected) tcp sock
8ed0: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  et. *. * Results
8ee0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
8ef0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
8f00: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
8f10: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
8f20: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
8f30: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
8f40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
8f90: 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43  c int.ImportObjC
8fa0: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
8fb0: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
8fc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8fd0: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
8fe0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
8ff0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20  onst objv[]).{. 
9000: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
9010: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
9020: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
9030: 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74  de on. */.    St
9040: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09  ate *statePtr;..
9050: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
9060: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
9070: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  /.    SSL_CTX *c
9080: 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tx..= NULL;.    
9090: 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09  Tcl_Obj *script.
90a0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
90b0: 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09  _Obj *password..
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
90d0: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c  Obj *vcmd..= NUL
90e0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
90f0: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
9100: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
9110: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
9120: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
9130: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
9140: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
9150: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63   int idx;.    Tc
9160: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20  l_Size len;.    
9170: 69 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c  int flags...= TL
9180: 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20  S_TCL_INIT;.    
9190: 69 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30  int server...= 0
91a0: 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69  ;./* is connecti
91b0: 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f  on incoming or o
91c0: 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20  utgoing? */.    
91d0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d  char *keyfile..=
91e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
91f0: 2a 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c  *certfile..= NUL
9200: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
9210: 63 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c  char *key..= NUL
9220: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
9230: 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20  key_len..= 0;.  
9240: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9250: 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20  *cert..= NULL;. 
9260: 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74     Tcl_Size cert
9270: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63  _len..= 0;.    c
9280: 68 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20  har *ciphers..= 
9290: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
92a0: 63 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20  ciphersuites..= 
92b0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
92c0: 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  CAfile..= NULL;.
92d0: 20 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68      char *CApath
92e0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
92f0: 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20  ar *DHparams..= 
9300: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9310: 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a  model...= NULL;.
9320: 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72      char *server
9330: 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a  name..= NULL;./*
9340: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65   hostname for Se
9350: 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61  rver Name Indica
9360: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72  tion */.    char
9370: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09 3d 20   *session_id..= 
9380: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9390: 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b  j *alpn..= NULL;
93a0: 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20  .    int ssl2 = 
93b0: 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20  0, ssl3 = 0;.   
93c0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74   int tls1 = 1, t
93d0: 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_1 = 1, tls1_
93e0: 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20  2 = 1, tls1_3 = 
93f0: 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f  1;.    int proto
9400: 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31   = 0, level = -1
9410: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79  ;.    int verify
9420: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20   = 0, require = 
9430: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20  0, request = 1, 
9440: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d  post_handshake =
9450: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
9460: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
9470: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9480: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9490: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
94a0: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64    tls1 = 0;.#end
94b0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
94c0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
94d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
94e0: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31  TLS1_1).    tls1
94f0: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _1 = 0;.#endif.#
9500: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9510: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
9520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9530: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d  _2).    tls1_2 =
9540: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9550: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
9560: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9570: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
9580: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
9590: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
95a0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
95b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
95c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
95d0: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
95e0: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
95f0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9600: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
9610: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20  or();..    chan 
9620: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
9630: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9640: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9650: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
9660: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
9670: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
9680: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9690: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
96a0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
96b0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
96c0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
96d0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
96e0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
96f0: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20  ;..    for (idx 
9700: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 2; idx < objc;
9710: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20   idx++) {..char 
9720: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *opt = Tcl_GetSt
9730: 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b  ring(objv[idx]);
9740: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
9750: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
9760: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
9770: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
9780: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70  TR("-cadir", CAp
9790: 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ath);..OPTSTR("-
97a0: 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29  cafile", CAfile)
97b0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72  ;..OPTBYTE("-cer
97c0: 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c  t", cert, cert_l
97d0: 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  en);..OPTSTR("-c
97e0: 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69  ertfile", certfi
97f0: 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  le);..OPTSTR("-c
9800: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29  ipher", ciphers)
9810: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9820: 65 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  ers", ciphers);.
9830: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9840: 73 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73  suites", ciphers
9850: 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28  uites);..OPTOBJ(
9860: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69  "-command", scri
9870: 70 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64  pt);..OPTSTR("-d
9880: 68 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61  hparams", DHpara
9890: 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  ms);..OPTBYTE("-
98a0: 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c  key", key, key_l
98b0: 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b  en);..OPTSTR("-k
98c0: 65 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65  eyfile", keyfile
98d0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64  );..OPTSTR("-mod
98e0: 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50  el", model);..OP
98f0: 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22  TOBJ("-password"
9900: 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50  , password);..OP
9910: 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e  TBOOL("-post_han
9920: 64 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61  dshake", post_ha
9930: 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f  ndshake);..OPTBO
9940: 4f 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72  OL("-request", r
9950: 65 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f  equest);..OPTBOO
9960: 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65  L("-require", re
9970: 71 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28  quire);..OPTINT(
9980: 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  "-security_level
9990: 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42  ", level);..OPTB
99a0: 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73  OOL("-server", s
99b0: 65 72 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28  erver);..OPTSTR(
99c0: 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73  "-servername", s
99d0: 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54  ervername);..OPT
99e0: 53 54 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64  STR("-session_id
99f0: 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a  ", session_id);.
9a00: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22  .OPTBOOL("-ssl2"
9a10: 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl2);..OPTBOO
9a20: 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29  L("-ssl3", ssl3)
9a30: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9a40: 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42  1", tls1);..OPTB
9a50: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74  OOL("-tls1.1", t
9a60: 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c  ls1_1);..OPTBOOL
9a70: 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31  ("-tls1.2", tls1
9a80: 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _2);..OPTBOOL("-
9a90: 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29  tls1.3", tls1_3)
9aa0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69  ;..OPTOBJ("-vali
9ab0: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63  datecommand", vc
9ac0: 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76  md);..OPTOBJ("-v
9ad0: 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f  cmd", vcmd);...O
9ae0: 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20  PTBAD("option", 
9af0: 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20  "-alpn, -cadir, 
9b00: 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20  -cafile, -cert, 
9b10: 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68  -certfile, -ciph
9b20: 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65  er, -ciphersuite
9b30: 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68  s, -command, -dh
9b40: 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b  params, -key, -k
9b50: 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20  eyfile, -model, 
9b60: 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74  -password, -post
9b70: 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71  _handshake, -req
9b80: 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20  uest, -require, 
9b90: 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c  -security_level,
9ba0: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65   -server, -serve
9bb0: 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f  rname, -session_
9bc0: 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33  id, -ssl2, -ssl3
9bd0: 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31  , -tls1, -tls1.1
9be0: 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31  , -tls1.2, -tls1
9bf0: 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65  .3, or -validate
9c00: 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74  command");...ret
9c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9c20: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71     }.    if (req
9c30: 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66 79  uest).    verify
9c40: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
9c50: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
9c60: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
9c70: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
9c80: 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66 79   require) verify
9c90: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
9ca0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
9cb0: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71  ERT;.    if (req
9cc0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
9cd0: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c  dshake).verify |
9ce0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  = SSL_VERIFY_POS
9cf0: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20  T_HANDSHAKE;.   
9d00: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30   if (verify == 0
9d10: 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56  ).verify = SSL_V
9d20: 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20  ERIFY_NONE;..   
9d30: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20   proto |= (ssl2 
9d40: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  ? TLS_PROTO_SSL2
9d50: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
9d60: 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f   |= (ssl3 ? TLS_
9d70: 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b  PROTO_SSL3 : 0);
9d80: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
9d90: 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  ls1 ? TLS_PROTO_
9da0: 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  TLS1 : 0);.    p
9db0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20  roto |= (tls1_1 
9dc0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
9dd0: 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _1 : 0);.    pro
9de0: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20  to |= (tls1_2 ? 
9df0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
9e00: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
9e10: 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c   |= (tls1_3 ? TL
9e20: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a  S_PROTO_TLS1_3 :
9e30: 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73   0);..    /* res
9e40: 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c  et to NULL if bl
9e50: 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69  ank string provi
9e60: 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ded */.    if (c
9e70: 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09  ert && !*cert)..
9e80: 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20          cert.   
9e90: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9ea0: 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65   if (key && !*ke
9eb0: 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09  y)..        key.
9ec0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9ed0: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
9ee0: 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20   && !*certfile) 
9ef0: 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65          certfile
9f00: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20  .= NULL;.    if 
9f10: 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65  (keyfile && !*ke
9f20: 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09  yfile)..keyfile.
9f30: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9f40: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20      if (ciphers 
9f50: 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20  && !*ciphers).  
9f60: 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20        ciphers.  
9f70: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
9f80: 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74    if (ciphersuit
9f90: 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75  es && !*ciphersu
9fa0: 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74  ites) ciphersuit
9fb0: 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20  es    = NULL;.  
9fc0: 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20    if (CAfile && 
9fd0: 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20  !*CAfile).      
9fe0: 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20    CAfile.       
9ff0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a000: 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70  (CApath && !*CAp
a010: 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70  ath).        CAp
a020: 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ath.        = NU
a030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61  LL;.    if (DHpa
a040: 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61  rams && !*DHpara
a050: 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61  ms).        DHpa
a060: 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55  rams        = NU
a070: 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20  LL;..    /* new 
a080: 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  SSL state */.   
a090: 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74   statePtr..= (St
a0a0: 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28  ate *) ckalloc((
a0b0: 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66  unsigned) sizeof
a0c0: 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65  (State));.    me
a0d0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30  mset(statePtr, 0
a0e0: 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  , sizeof(State))
a0f0: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  ;..    statePtr-
a100: 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a  >flags.= flags;.
a110: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e      statePtr->in
a120: 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20  terp.= interp;. 
a130: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c     statePtr->vfl
a140: 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20  ags.= verify;.  
a150: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09    statePtr->err.
a160: 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c  = "";..    /* al
a170: 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f  locate script */
a180: 0a 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29  .    if (script)
a190: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
a1a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
a1b0: 73 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09  script, &len);..
a1c0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a1d0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a1e0: 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20  ck = script;..  
a1f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a200: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
a210: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  lback);..}.    }
a220: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a230: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
a240: 20 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20    if (password) 
a250: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a260: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70  tStringFromObj(p
a270: 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a  assword, &len);.
a280: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a290: 20 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77   statePtr->passw
a2a0: 6f 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a  ord = password;.
a2b0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a2c0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a2d0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
a2e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a2f0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f  cate validate co
a300: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20  mmand */.    if 
a310: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29  (vcmd) {..(void)
a320: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a330: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e  omObj(vcmd, &len
a340: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a350: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63      statePtr->vc
a360: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20  md = vcmd;..    
a370: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
a380: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
a390: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a3a0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
a3b0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
a3c0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
a3d0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
a3e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
a3f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
a400: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
a410: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
a420: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
a430: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76  .    Tls_Free((v
a440: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
a450: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a460: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a  _ERROR;..}.../*.
a470: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
a480: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
a490: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
a4a0: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
a4b0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
a4c0: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47  han);..if (Tcl_G
a4d0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
a4e0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
a4f0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20  elType()) {..   
a500: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a510: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
a520: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
a530: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
a540: 68 61 6e 29 2c 0a 09 09 20 20 20 20 22 5c 22 3a  han),...    "\":
a550: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
a560: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  el", (char *)NUL
a570: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
a580: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
a590: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
a5a0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
a5b0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
a5c0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73  )NULL);..    Tls
a5d0: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
a5e0: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a5f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a600: 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74  .}..ctx = ((Stat
a610: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
a620: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
a630: 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20  han))->ctx;.    
a640: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63  } else {..if ((c
a650: 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74  tx = CTX_Init(st
a660: 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20  atePtr, server, 
a670: 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20  proto, keyfile, 
a680: 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63  certfile, key, c
a690: 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c  ert, (int) key_l
a6a0: 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63  en,..    (int) c
a6b0: 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c  ert_len, CApath,
a6c0: 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73   CAfile, ciphers
a6d0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20  , ciphersuites, 
a6e0: 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29  level, DHparams)
a6f0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) == NULL) {..  
a700: 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64    Tls_Free((void
a710: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
a720: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a730: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
a740: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78     statePtr->ctx
a750: 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a   = ctx;..    /*.
a760: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74       * We need t
a770: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
a780: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72   the channel wor
a790: 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f  ks in binary (fo
a7a0: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63  r the.     * enc
a7b0: 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67  ryption not to g
a7c0: 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20  et goofed up).. 
a7d0: 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61      * We only wa
a7e0: 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  nt to adjust the
a7f0: 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72   buffering in pr
a800: 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77  e-v2 channels, w
a810: 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68  here.     * each
a820: 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20   channel in the 
a830: 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64  stack maintained
a840: 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73   its own buffers
a850: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  ..     */.    Tc
a860: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
a870: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
a880: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
a890: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
a8a0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
a8b0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
a8c0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
a8d0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
a8e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
a8f0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
a900: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
a910: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
a920: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
a930: 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26  n, "-eofchar", &
a940: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
a950: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  har);.    Tcl_Ge
a960: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
a970: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
a980: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72  ncoding", &upper
a990: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
a9a0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
a9b0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
a9c0: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
a9d0: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43  lation", &upperC
a9e0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
a9f0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  n);.    Tcl_GetC
aa00: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aa10: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
aa20: 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  cking", &upperCh
aa30: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
aa40: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
aa50: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
aa60: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
aa70: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29  tion", "binary")
aa80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
aa90: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
aaa0: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
aab0: 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20  ing", "true");. 
aac0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73     dprintf("Cons
aad0: 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65  uming Tcl channe
aae0: 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  l %s", Tcl_GetCh
aaf0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29  annelName(chan))
ab00: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
ab10: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b  self = Tcl_Stack
ab20: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
ab30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
ab40: 29 2c 20 73 74 61 74 65 50 74 72 2c 20 28 54 43  ), statePtr, (TC
ab50: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
ab60: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
ab70: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
ab80: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20  Created channel 
ab90: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47  named %s", Tcl_G
aba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
abb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
abc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
abd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
abe0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
abf0: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f  ./*.. * No use o
ac00: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79  f Tcl_Eventually
ac10: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20  Free because no 
ac20: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65  possible Tcl_Pre
ac30: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73  serve... */..Tls
ac40: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
ac50: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
ac60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
ac70: 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  }..    Tcl_SetCh
ac80: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ac90: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
aca0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  lf, "-translatio
acb0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
acc0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
acd0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
ace0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
acf0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ad00: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
ad10: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54  , "-encoding", T
ad20: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
ad30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
ad40: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c  oding));.    Tcl
ad50: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
ad60: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
ad70: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63  tr->self, "-eofc
ad80: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
ad90: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
ada0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20  nnelEOFChar));. 
adb0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
adc0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
add0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
ade0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c  "-blocking", Tcl
adf0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
ae00: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
ae10: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44  ing));.    Tcl_D
ae20: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
ae30: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
ae40: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
ae50: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
ae60: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
ae70: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
ae80: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
ae90: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
aea0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
aeb0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
aec0: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a  ocking);..    /*
aed0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
aee0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
aef0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
af00: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
af10: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
af20: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
af30: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
af40: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
af50: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
af60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
af70: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
af80: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
af90: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
afa0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
afb0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
afc0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
afd0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49  , "IMPORT", "INI
afe0: 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  T", "FAILED", (c
aff0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 6c  har *)NULL);..Tl
b000: 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73  s_Free((void *)s
b010: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
b020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b030: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68   }..    /* Set h
b040: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ost server name 
b050: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  */.    if (serve
b060: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74  rname) {../* Set
b070: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  s the server nam
b080: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
b090: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c  I) in ClientHell
b0a0: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09  o extension */..
b0b0: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c  /* Per RFC 6066,
b0c0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41   hostname is a A
b0d0: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72  SCII encoded str
b0e0: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20  ing, though RFC 
b0f0: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e  4366 says UTF-8.
b100: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65   */..if (!SSL_se
b110: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61  t_tlsext_host_na
b120: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
b130: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26  , servername) &&
b140: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20   require) {..   
b150: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b160: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53  t(interp, "Set S
b170: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  NI extension fai
b180: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b190: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b1a0: 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  *)NULL);..    Tc
b1b0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b1c0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b1d0: 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22  MPORT", "SNI", "
b1e0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
b1f0: 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73  )NULL);..    Tls
b200: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
b210: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b220: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b230: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74  .}.../* Set host
b240: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65  name for peer ce
b250: 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61  rtificate hostna
b260: 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  me verification 
b270: 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20  in clients...   
b280: 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65  Don't use SSL_se
b290: 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74  t1_host since it
b2a0: 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73   has limitations
b2b0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61  . */..if (!SSL_a
b2c0: 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74  dd1_host(statePt
b2d0: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
b2e0: 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  me)) {..    Tcl_
b2f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b300: 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f  erp, "Set DNS ho
b310: 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22  stname failed: "
b320: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
b330: 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  (), (char *)NULL
b340: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b350: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b360: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b370: 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46  , "HOSTNAME", "F
b380: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b390: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b3a0: 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74 61  Free((void *)sta
b3b0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b3c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b3d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
b3e0: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69  Resume session i
b3f0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73  d */.    if (ses
b400: 73 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65  sion_id && strle
b410: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d  n(session_id) <=
b420: 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58   SSL_MAX_SID_CTX
b430: 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53  _LENGTH) {../* S
b440: 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29  SL_set_session()
b450: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45   */..if (!SSL_SE
b460: 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f  SSION_set1_id_co
b470: 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65  ntext(SSL_get_se
b480: 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  ssion(statePtr->
b490: 73 73 6c 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75  ssl),...(const u
b4a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
b4b0: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73  session_id, (uns
b4c0: 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65  igned int) strle
b4d0: 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20  n(session_id))) 
b4e0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
b4f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
b500: 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20  "Resume session 
b510: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b520: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b530: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
b540: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b550: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b560: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53   "IMPORT", "SESS
b570: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  ION", "FAILED", 
b580: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
b590: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f      Tls_Free((vo
b5a0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
b5b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b5c0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
b5d0: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41  .    /* Enable A
b5e0: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72  pplication-Layer
b5f0: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69   Protocol Negoti
b600: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20  ation. Examples 
b610: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09  are: http/1.0,..
b620: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
b630: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70  , ftp, imap, pop
b640: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20  3, xmpp-client, 
b650: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74  xmpp-server, mqt
b660: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a  t, irc, etc. */.
b670: 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a      if (alpn) {.
b680: 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43  ./* Convert a TC
b690: 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72  L list into a pr
b6a0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77  otocol-list in w
b6b0: 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75  ire-format */..u
b6c0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
b6d0: 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67  otos, *p;..unsig
b6e0: 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c  ned int protos_l
b6f0: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a  en = 0;..Tcl_Siz
b700: 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a  e cnt, i;..int j
b710: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73  ;..Tcl_Obj **lis
b720: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73  t;...if (Tcl_Lis
b730: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
b740: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63  interp, alpn, &c
b750: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43  nt, &list) != TC
b760: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73  L_OK) {..    Tls
b770: 5f 46 72 65 65 28 28 76 6f 69 64 20 2a 29 73 74  _Free((void *)st
b780: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b790: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b7a0: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
b7b0: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
b7c0: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72  uired for the pr
b7d0: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
b7e0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
b7f0: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
b800: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
b810: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26  omObj(list[i], &
b820: 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c  len);..    if (l
b830: 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63  en > 255) {...Tc
b840: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b850: 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f  nterp, "ALPN pro
b860: 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20  tocol names too 
b870: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 4e  long", (char *)N
b880: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45  ULL);...Tcl_SetE
b890: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b8a0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b8b0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
b8c0: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
b8d0: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 76  );...Tls_Free((v
b8e0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
b8f0: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
b900: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
b910: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31   protos_len += 1
b920: 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d   + (int) len;..}
b930: 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  .../* Build the 
b940: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f  complete protoco
b950: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f  l-list */..proto
b960: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74  s = ckalloc(prot
b970: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f  os_len);../* pro
b980: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73  tocol-lists cons
b990: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e  ist of 8-bit len
b9a0: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79  gth-prefixed, by
b9b0: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66  te strings */..f
b9c0: 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70  or (j = 0, p = p
b9d0: 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20  rotos; j < cnt; 
b9e0: 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  j++) {..    char
b9f0: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53   *str = Tcl_GetS
ba00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
ba10: 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[j], &len);..  
ba20: 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e    *p++ = (unsign
ba30: 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20  ed char) len;.. 
ba40: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72     memcpy(p, str
ba50: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
ba60: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a  ..    p += len;.
ba70: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  .}.../* SSL_set_
ba80: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65  alpn_protos make
ba90: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
baa0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
bab0: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20  ../* Note: This 
bac0: 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65  function reverse
bad0: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
bae0: 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f  ue convention */
baf0: 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c  ..if (SSL_set_al
bb00: 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50  pn_protos(stateP
bb10: 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c  tr->ssl, protos,
bb20: 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a   protos_len)) {.
bb30: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
bb40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
bb50: 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  et ALPN protocol
bb60: 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  s failed: ", GET
bb70: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
bb80: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
bb90: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
bba0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
bbb0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
bbc0: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
bbd0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20  char *)NULL);.. 
bbe0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69     Tls_Free((voi
bbf0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
bc00: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f      ckfree(proto
bc10: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  s);..    return 
bc20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
bc30: 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f  /* Store protoco
bc40: 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74  ls list */..stat
bc50: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70  ePtr->protos = p
bc60: 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72  rotos;..statePtr
bc70: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70  ->protos_len = p
bc80: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d  rotos_len;.    }
bc90: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74   else {..statePt
bca0: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c  r->protos = NULL
bcb0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
bcc0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  tos_len = 0;.   
bcd0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
bce0: 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a  * SSL Callbacks.
bcf0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f       */.    SSL_
bd00: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61  set_app_data(sta
bd10: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69  tePtr->ssl, (voi
bd20: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f  d *)statePtr);./
bd30: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20  * point back to 
bd40: 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  us */.    SSL_se
bd50: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74  t_verify(statePt
bd60: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20  r->ssl, verify, 
bd70: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b  VerifyCallback);
bd80: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66  .    SSL_set_inf
bd90: 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  o_callback(state
bda0: 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61  Ptr->ssl, InfoCa
bdb0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a  llback);..    /*
bdc0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62   Callback for ob
bdd0: 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  serving protocol
bde0: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66   messages */.#if
bdf0: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
be00: 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a  SSL_TRACE.    /*
be10: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
be20: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
be30: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  rg(statePtr->ctx
be40: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
be50: 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53  tr);.    void SS
be60: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
be70: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
be80: 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ctx, MessageCal
be90: 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53  lback); */.    S
bea0: 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  SL_set_msg_callb
beb0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
bec0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
bed0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53  tatePtr);.    SS
bee0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
bef0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
bf00: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  , MessageCallbac
bf10: 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  k);.#endif..    
bf20: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68  /* Create Tcl_Ch
bf30: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65  annel BIO Handle
bf40: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  r */.    statePt
bf50: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e  r->p_bio.= BIO_n
bf60: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c  ew_tcl(statePtr,
bf70: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20   BIO_NOCLOSE);. 
bf80: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f     statePtr->bio
bf90: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66  .= BIO_new(BIO_f
bfa0: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66  _ssl());..    if
bfb0: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20   (server) {../* 
bfc0: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73  Server callbacks
bfd0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
bfe0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
bff0: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  me_arg(statePtr-
c000: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
c010: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54  atePtr);..SSL_CT
c020: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
c030: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b  vername_callback
c040: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c050: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53  SNICallback);..S
c060: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
c070: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65  t_hello_cb(state
c080: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43  Ptr->ctx, HelloC
c090: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c0a0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20  )statePtr);..if 
c0b0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c0c0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
c0d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c    SSL_CTX_set_al
c0e0: 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61  pn_select_cb(sta
c0f0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e  tePtr->ctx, ALPN
c100: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
c110: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66  *)statePtr);.#if
c120: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20  def USE_NPN..   
c130: 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30   if (tls1_2 == 0
c140: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
c150: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
c160: 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76  _next_protos_adv
c170: 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65  ertised_cb(state
c180: 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c  Ptr->ctx, NPNCal
c190: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c1a0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d  tatePtr);..    }
c1b0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20  .#endif..}.../* 
c1c0: 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f  Enable server to
c1d0: 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65   send cert reque
c1e0: 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61  st after handsha
c1f0: 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  ke (TLS 1.3 only
c200: 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65  ) */../* A write
c210: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20   operation must 
c220: 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74  take place for t
c230: 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52  he Certificate R
c240: 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20  equest to be..  
c250: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69   sent to the cli
c260: 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65  ent, this can be
c270: 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64   done with SSL_d
c280: 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a  o_handshake(). *
c290: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26  /..if (request &
c2a0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
c2b0: 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20   && tls1_3) {.. 
c2c0: 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c     SSL_verify_cl
c2d0: 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  ient_post_handsh
c2e0: 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ake(statePtr->ss
c2f0: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20  l);..}.../* set 
c300: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20  automatic curve 
c310: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53  selection */..SS
c320: 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28  L_set_ecdh_auto(
c330: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31  statePtr->ssl, 1
c340: 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76  );.../* Set serv
c350: 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74  er mode */..stat
c360: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
c370: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09  LS_TCL_SERVER;..
c380: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73  SSL_set_accept_s
c390: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
c3a0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
c3b0: 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c  {../* Client cal
c3c0: 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66  lbacks */.#ifdef
c3d0: 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74   USE_NPN..if (st
c3e0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
c3f0: 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32  = NULL && tls1_2
c400: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
c410: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c  == 0) {..    SSL
c420: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
c430: 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74  oto_select_cb(st
c440: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50  atePtr->ctx, ALP
c450: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
c460: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d   *)statePtr);..}
c470: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73  .#endif.../* Ses
c480: 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a  sion caching */.
c490: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73  .SSL_CTX_set_ses
c4a0: 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
c4b0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c4c0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
c4d0: 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f  IENT | SSL_SESS_
c4e0: 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41  CACHE_NO_INTERNA
c4f0: 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43  L_STORE);..SSL_C
c500: 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f  TX_sess_set_new_
c510: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c520: 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  , SessionCallbac
c530: 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  k);.../* Enable 
c540: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41  post handshake A
c550: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78  uthentication ex
c560: 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33  tension. TLS 1.3
c570: 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f   only, not http/
c580: 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  2. */..if (reque
c590: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
c5a0: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
c5b0: 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  _set_post_handsh
c5c0: 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74  ake_auth(statePt
c5d0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a  r->ssl, 1);..}..
c5e0: 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d  ./* Set client m
c5f0: 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ode */..SSL_set_
c600: 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74  connect_state(st
c610: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
c620: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f    }.    SSL_set_
c630: 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  bio(statePtr->ss
c640: 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  l, statePtr->p_b
c650: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  io, statePtr->p_
c660: 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65  bio);.    BIO_se
c670: 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e  t_ssl(statePtr->
c680: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  bio, statePtr->s
c690: 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  sl, BIO_NOCLOSE)
c6a0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
c6b0: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74   End of SSL Init
c6c0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
c6d0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
c6e0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
c6f0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
c700: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63  ->self));.    Tc
c710: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
c720: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c  rp, (char *) Tcl
c730: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
c740: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
c750: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
c760: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
c770: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
c780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
c7c0: 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62   *. * UnimportOb
c7d0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
c7e0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
c7f0: 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76  invoked to remov
c800: 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  e the topmost ch
c810: 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a  annel filter.. *
c820: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
c830: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
c840: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
c850: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61  e effects:. *.Ma
c860: 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68  y modify the beh
c870: 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63  avior of an IO c
c880: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d  hannel.. *. *---
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 2d  ----------------
c8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8d0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
c8e0: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
c8f0: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
c900: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
c910: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
c920: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
c930: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73     Tcl_Obj *cons
c940: 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20  t objv[]).{.    
c950: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
c960: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
c970: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
c980: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69  on. */..    dpri
c990: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
c9a0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
c9b0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
c9c0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
c9d0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
c9e0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
c9f0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
ca00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
ca10: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
ca20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ca30: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
ca40: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
ca50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
ca60: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
ca70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ca80: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
ca90: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
caa0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
cab0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
cac0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
cad0: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66  l(chan);..    if
cae0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
caf0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
cb00: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
cb10: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
cb20: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
cb30: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
cb40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
cb50: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
cb60: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
cb70: 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  l", (char *)NULL
cb80: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
cb90: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
cba0: 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52   "TLS", "UNIMPOR
cbb0: 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  T", "CHANNEL", "
cbc0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
cbd0: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
cbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
cbf0: 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  }..    if (Tcl_U
cc00: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
cc10: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
cc20: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74  CL_ERROR) {..ret
cc30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cc40: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
cc50: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
cc60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
cc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cca0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f  -----. *. * CTX_
ccb0: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63  Init -- construc
ccc0: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  t a SSL_CTX inst
ccd0: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ance. *. * Resul
cce0: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53  ts:. *.A valid S
ccf0: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20  SL_CTX instance 
cd00: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53  or NULL.. *. * S
cd10: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
cd20: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63  constructs SSL c
cd30: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
cd40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
cd90: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f  c SSL_CTX *.CTX_
cda0: 49 6e 69 74 28 0a 20 20 20 20 53 74 61 74 65 20  Init(.    State 
cdb0: 2a 73 74 61 74 65 50 74 72 2c 0a 20 20 20 20 69  *statePtr,.    i
cdc0: 6e 74 20 69 73 53 65 72 76 65 72 2c 0a 20 20 20  nt isServer,.   
cdd0: 20 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20   int proto,.    
cde0: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20  char *keyfile,. 
cdf0: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c     char *certfil
ce00: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
ce10: 63 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75  char *key,.    u
ce20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
ce30: 72 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f  rt,.    int key_
ce40: 6c 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 65 72  len,.    int cer
ce50: 74 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 72 20  t_len,.    char 
ce60: 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61  *CApath,.    cha
ce70: 72 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 63  r *CAfile,.    c
ce80: 68 61 72 20 2a 63 69 70 68 65 72 73 2c 0a 20 20  har *ciphers,.  
ce90: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75    char *ciphersu
cea0: 69 74 65 73 2c 0a 20 20 20 20 69 6e 74 20 6c 65  ites,.    int le
ceb0: 76 65 6c 2c 0a 20 20 20 20 63 68 61 72 20 2a 44  vel,.    char *D
cec0: 48 70 61 72 61 6d 73 29 0a 7b 0a 20 20 20 20 54  Hparams).{.    T
ced0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cee0: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
cef0: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
cf00: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
cf10: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
cf20: 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d  s;.    int off =
cf30: 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20   0, abort = 0;. 
cf40: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
cf50: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
cf60: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
cf70: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
cf80: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
cf90: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
cfa0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
cfb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
cfc0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
cfd0: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20  elected", (char 
cfe0: 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
cff0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
d000: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20    /* create SSL 
d010: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 69  context */.    i
d020: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d030: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
d040: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d050: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d060: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL2 protocol no
d070: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d080: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
d090: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d0a0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d0b0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d0c0: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL3)) {..Tcl_
d0d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d0e0: 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f  erp, "SSL3 proto
d0f0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d100: 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  d", (char *)NULL
d110: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d120: 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e  .    }.#if defin
d130: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
d140: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d150: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28  O_TLS1).    if (
d160: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d170: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20  LS_PROTO_TLS1)) 
d180: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d190: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
d1a0: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.0 protocol no
d1b0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d1c0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
d1d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d1e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d1f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
d200: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d210: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
d220: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d230: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d240: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
d250: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d260: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
d270: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d280: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
d290: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d2a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d2b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
d2c0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
d2d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d2e0: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
d2f0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d300: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
d310: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d320: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
d330: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
d340: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
d350: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
d360: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d370: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d380: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
d390: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d3a0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
d3b0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
d3c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
d3d0: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _3)) {..Tcl_Appe
d3e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d3f0: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63   "TLS 1.3 protoc
d400: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d410: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
d420: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d430: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
d440: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
d450: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
d460: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
d470: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
d480: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d490: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
d4a0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
d4b0: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
d4c0: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
d4d0: 6f 29 20 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  o) {.#if !define
d4e0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
d4f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d500: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
d510: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d520: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
d530: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
d540: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
d550: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
d560: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d570: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
d580: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d590: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d5a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
d5b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d5c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
d5d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d5e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
d5f0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
d600: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
d610: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d620: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
d630: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d640: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
d650: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d660: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d670: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
d680: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d690: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
d6a0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d6b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
d6c0: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
d6d0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
d6e0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d6f0: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
d700: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d710: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
d720: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d730: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
d740: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
d750: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d760: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
d770: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d780: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
d790: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
d7a0: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
d7b0: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
d7c0: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
d7d0: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
d7e0: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
d7f0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
d800: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
d810: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d820: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
d830: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
d840: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
d850: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
d860: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
d870: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
d880: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d890: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
d8a0: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
d8b0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
d8c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d8d0: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
d8e0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d8f0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
d900: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
d910: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
d920: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
d930: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
d940: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d950: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
d960: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d970: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
d980: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
d990: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
d9a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d9b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
d9c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d9d0: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
d9e0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d9f0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
da00: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
da10: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
da20: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
da30: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
da40: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
da50: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
da60: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
da70: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
da80: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
da90: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
daa0: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
dab0: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
dac0: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
dad0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
dae0: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
daf0: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
db00: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
db10: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53      if (getenv(S
db20: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b  SLKEYLOGFILE)) {
db30: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65  ..SSL_CTX_set_ke
db40: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74  ylog_callback(ct
db50: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63  x, KeyLogCallbac
db60: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  k);.    }..#if !
db70: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
db80: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
db90: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
dba0: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20  ).    if (proto 
dbb0: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  == TLS_PROTO_TLS
dbc0: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  1_3) {..SSL_CTX_
dbd0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
dbe0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
dbf0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c  3_VERSION);..SSL
dc00: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
dc10: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
dc20: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
dc30: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
dc40: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68     /* Force ciph
dc50: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64  er selection ord
dc60: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a  er by server */.
dc70: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65      if (!isServe
dc80: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  r) {..SSL_CTX_se
dc90: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
dca0: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52  SL_OP_CIPHER_SER
dcb0: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b  VER_PREFERENCE);
dcc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 53 53 4c 5f  .    }..    SSL_
dcd0: 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  CTX_set_app_data
dce0: 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74  (ctx, (void*)int
dcf0: 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65  erp);./* remembe
dd00: 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  r the interprete
dd10: 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  r */.    SSL_CTX
dd20: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
dd30: 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f  , SSL_OP_ALL);./
dd40: 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f  * all SSL bug wo
dd50: 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20  rkarounds */.   
dd60: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
dd70: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
dd80: 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29  _NO_COMPRESSION)
dd90: 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d  ;./* disable com
dda0: 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66  pression even if
ddb0: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
ddc0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
ddd0: 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b  tions(ctx, off);
dde0: 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f  ../* disable pro
ddf0: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a  tocol versions *
de00: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
de10: 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a  ss_set_cache_siz
de20: 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20  e(ctx, 128);..  
de30: 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65    /* Set user de
de40: 66 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63  fined ciphers, c
de50: 69 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e  ipher suites, an
de60: 64 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  d security level
de70: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70   */.    if ((cip
de80: 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  hers != NULL) &&
de90: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
dea0: 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63  pher_list(ctx, c
deb0: 69 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f  iphers)) {..Tcl_
dec0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ded0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
dee0: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
def0: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
df00: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c  ar *)NULL);..SSL
df10: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
df20: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
df30: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
df40: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
df50: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
df60: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
df70: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
df80: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
df90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dfa0: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
dfb0: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
dfc0: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
dfd0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53  har *)NULL);..SS
dfe0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
dff0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e000: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
e010: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e020: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
e030: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
e040: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
e050: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e060: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
e070: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
e080: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
e090: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
e0a0: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
e0b0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e0c0: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e0d0: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
e0e0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
e0f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
e100: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
e110: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
e120: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
e130: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
e140: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
e150: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
e160: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
e170: 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   one */.    Tcl_
e180: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
e190: 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  ;.#ifdef OPENSSL
e1a0: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44  _NO_DH.    if (D
e1b0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
e1c0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e1d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48  sult(interp, "DH
e1e0: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f   parameter suppo
e1f0: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rt not available
e200: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
e210: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e220: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e230: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  LL;.    }.#else.
e240: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09      {..DH* dh;..
e250: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
e260: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f  NULL) {..    BIO
e270: 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f   *bio;...    bio
e280: 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28   = BIO_new_file(
e290: 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64  F2N(DHparams, &d
e2a0: 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69  s), "r");..    i
e2b0: 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c  f (!bio) {...Tcl
e2c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
e2d0: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
e2e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
e2f0: 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48  ould not find DH
e300: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
e310: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
e320: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
e330: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
e340: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  NULL;..    }... 
e350: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
e360: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
e370: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
e380: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
e390: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
e3a0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e3b0: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
e3c0: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
e3d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e3e0: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
e3f0: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
e400: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
e410: 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  *)NULL);...SSL_C
e420: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
e430: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
e440: 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58    }..    SSL_CTX
e450: 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c  _set_tmp_dh(ctx,
e460: 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72   dh);..    DH_fr
e470: 65 65 28 64 68 29 3b 0a 09 7d 20 65 6c 73 65 20  ee(dh);..} else 
e480: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65  {..    /* Use we
e490: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61  ll known DH para
e4a0: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65  meters that have
e4b0: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72   built-in suppor
e4c0: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a  t in OpenSSL */.
e4d0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
e4e0: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74  X_set_dh_auto(ct
e4f0: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41  x, 1)) {...Tcl_A
e500: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e510: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65  rp, "Could not e
e520: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74  nable set DH aut
e530: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  o: ", GET_ERR_RE
e540: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e550: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
e560: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
e570: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
e580: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
e590: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
e5a0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
e5b0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
e5c0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
e5d0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
e5e0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
e5f0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
e600: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
e610: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
e620: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
e630: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
e640: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
e650: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
e660: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
e670: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e680: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
e690: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
e6a0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
e6b0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
e6c0: 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45  ..    GET_ERR_RE
e6d0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e6e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 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: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
e710: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
e720: 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20  Free(&ds);..    
e730: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
e740: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
e750: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
e760: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
e770: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
e780: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65  SN1(ctx, cert_le
e790: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
e7a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
e7b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e7c0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
e7d0: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09  rtificate: ",...
e7e0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53      GET_ERR_REAS
e7f0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55  ON(), (char *)NU
e800: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
e810: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
e820: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
e830: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
e840: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
e850: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
e860: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
e870: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
e880: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
e890: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
e8a0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
e8b0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
e8c0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  0..    Tcl_Appen
e8d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e8e0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
e8f0: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
e900: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
e910: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 20 20 20  ile, ": ",...   
e920: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
e930: 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ), (char *)NULL)
e940: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
e950: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
e960: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64  eturn NULL;.#end
e970: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  if..}.    }..   
e980: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76   /* set our priv
e990: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  ate key */.    i
e9a0: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  f (load_private_
e9b0: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66  key) {..if (keyf
e9c0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b  ile == NULL && k
e9d0: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey == NULL) {.. 
e9e0: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72     keyfile = cer
e9f0: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28  tfile;..}...if (
ea00: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  keyfile != NULL)
ea10: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74   {..    /* get t
ea20: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61  he private key a
ea30: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ea40: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
ea50: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66  */..    if (keyf
ea60: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
ea70: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66  .keyfile = certf
ea80: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ile;..    }...  
ea90: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
eaa0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c  e_PrivateKey_fil
eab0: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69  e(ctx, F2N(keyfi
eac0: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
ead0: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
eae0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
eaf0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a  gFree(&ds);.../*
eb00: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
eb10: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
eb20: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
eb30: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
eb40: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
eb50: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
eb60: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
eb70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
eb80: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
eb90: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20  public key file 
eba0: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c  ", keyfile, " ",
ebb0: 0a 09 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53  ....GET_ERR_REAS
ebc0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55  ON(), (char *)NU
ebd0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ebe0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ebf0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ec00: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ec10: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 20 65 6c  Free(&ds);..} el
ec20: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55  se if (key != NU
ec30: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53  LL) {..    if (S
ec40: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
ec50: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50  teKey_ASN1(EVP_P
ec60: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65  KEY_RSA, ctx, ke
ec70: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29  y,key_len) <= 0)
ec80: 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68   {.../* flush th
ec90: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
eca0: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
ecb0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
ecc0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
ecd0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
ece0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
ecf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ed00: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
ed10: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
ed20: 79 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  y: ", GET_ERR_RE
ed30: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ed40: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
ed50: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
ed60: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
ed70: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
ed80: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
ed90: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
eda0: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
edb0: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
edc0: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
edd0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
ede0: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
edf0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ee00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
ee10: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
ee20: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
ee30: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
ee40: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
ee50: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
ee60: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
ee70: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
ee80: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  NULL;..}.    }..
ee90: 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73      /* Set to us
eea0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69  e default locati
eeb0: 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20  on and file for 
eec0: 43 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68  Certificate Auth
eed0: 6f 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69  ority (CA) certi
eee0: 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20  ficates. The.   
eef0: 20 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20    * verify path 
ef00: 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65  and store can be
ef10: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
ef20: 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20  he SSL_CERT_DIR 
ef30: 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72  env var. The ver
ef40: 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20  ify file can.   
ef50: 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65    * be overridde
ef60: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
ef70: 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20  T_FILE env var. 
ef80: 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
ef90: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
efa0: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
efb0: 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20  )) {..abort++;. 
efc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
efd0: 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43  rrides for the C
efe0: 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  A verify path an
eff0: 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a  d file */.    {.
f000: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
f010: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
f020: 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41  0000000L..if (CA
f030: 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  path != NULL || 
f040: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
f050: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
f060: 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c  ng ds1;..    Tcl
f070: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
f080: 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53  1);...    if (!S
f090: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
f0a0: 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
f0b0: 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
f0c0: 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  s), F2N(CApath, 
f0d0: 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72  &ds1))) {...abor
f0e0: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
f0f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f100: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
f110: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31  DStringFree(&ds1
f120: 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20  );...    /* Set 
f130: 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73  list of CAs to s
f140: 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68  end to client wh
f150: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  en requesting a 
f160: 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61  client certifica
f170: 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74  te */..    /* ht
f180: 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67  tps://sourceforg
f190: 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73  e.net/p/tls/bugs
f1a0: 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  /57/ */..    /* 
f1b0: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68  XXX:TODO: Let th
f1c0: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61  e user supply va
f1d0: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61  lues here instea
f1e0: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74  d of something t
f1f0: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68  hat exists on th
f200: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  e filesystem */.
f210: 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
f220: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
f230: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
f240: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
f250: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
f260: 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61  ..    if (certNa
f270: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
f280: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
f290: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
f2a0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20   certNames);..  
f2b0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
f2c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f2d0: 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41  }..#else..if (CA
f2e0: 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  path != NULL) {.
f2f0: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
f300: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69  X_load_verify_di
f310: 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74  r(ctx, F2N(CApat
f320: 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  h, &ds))) {...ab
f330: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
f340: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f350: 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20  ee(&ds);..}..if 
f360: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  (CAfile != NULL)
f370: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c   {..    if (!SSL
f380: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
f390: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43  _file(ctx, F2N(C
f3a0: 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a  Afile, &ds))) {.
f3b0: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20  ..abort++;..    
f3c0: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
f3d0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20  ngFree(&ds);... 
f3e0: 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f     /* Set list o
f3f0: 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f  f CAs to send to
f400: 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71   client when req
f410: 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74  uesting a client
f420: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
f430: 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
f440: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
f450: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
f460: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
f470: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
f480: 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61  ..    if (certNa
f490: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
f4a0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
f4b0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
f4c0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20   certNames);..  
f4d0: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
f4e0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f4f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  }.#endif.    }..
f500: 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a      return ctx;.
f510: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
f520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
f560: 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20   * StatusObjCmd 
f570: 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66  -- return certif
f580: 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63  icate for connec
f590: 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20  ted peer.. *. * 
f5a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
f5b0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
f5c0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
f5d0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
f5e0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f620: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
f630: 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62  tic int.StatusOb
f640: 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e  jCmd(.    TCL_UN
f650: 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20  USED(void *),.  
f660: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f670: 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62  terp,.    int ob
f680: 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09  jc,.    Tcl_Obj.
f690: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b  *const objv[]).{
f6a0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
f6b0: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a  ePtr;.    X509 *
f6c0: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  peer;.    Tcl_Ob
f6d0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54  j *objPtr;.    T
f6e0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
f6f0: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e  .    char *chann
f700: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73  elName, *ciphers
f710: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a  ;.    int mode;.
f720: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
f730: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a  ed char *proto;.
f740: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
f750: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69   len;.    int ni
f760: 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72  d, res;..    dpr
f770: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
f780: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
f790: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c  2 || objc > 3 ||
f7a0: 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21   (objc == 3 && !
f7b0: 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
f7c0: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ring(objv[1]), "
f7d0: 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63  -local"))) {..Tc
f7e0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
f7f0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
f800: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65  "?-local? channe
f810: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
f820: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
f830: 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65     /* Get channe
f840: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e  l Id */.    chan
f850: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
f860: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62  tString(objv[(ob
f870: 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29  jc == 2 ? 1 : 2)
f880: 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  ]);.    chan = T
f890: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
f8a0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  terp, channelNam
f8b0: 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  e, &mode);.    i
f8c0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
f8d0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
f8e0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
f8f0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
f900: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
f910: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
f920: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
f930: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
f940: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
f950: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
f960: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
f970: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
f980: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
f990: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f9a0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
f9b0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
f9c0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
f9d0: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
f9e0: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
f9f0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54  char *)NULL);..T
fa00: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
fa10: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
fa20: 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45  STATUS", "CHANNE
fa30: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
fa40: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
fa50: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fa60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
fa70: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
fa80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
fa90: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
faa0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65  ;..    /* Get ce
fab0: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65  rtificate for pe
fac0: 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20  er or self */.  
fad0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
fae0: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67   {..peer = SSL_g
faf0: 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63  et_peer_certific
fb00: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
fb10: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
fb20: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
fb30: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
fb40: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
fb50: 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35   }.    /* Get X5
fb60: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69  09 certificate i
fb70: 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  nfo */.    if (p
fb80: 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d  eer) {..objPtr =
fb90: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28   Tls_NewX509Obj(
fba0: 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09  interp, peer);..
fbb0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
fbc0: 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28  ..    X509_free(
fbd0: 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72  peer);..    peer
fbe0: 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20   = NULL;..}.    
fbf0: 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72  } else {..objPtr
fc00: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
fc10: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
fc20: 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e  }..    /* Peer n
fc30: 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  ame */.    LAPPE
fc40: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
fc50: 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65  bjPtr, "peername
fc60: 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72  ", SSL_get0_peer
fc70: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
fc80: 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41  sl), -1);.    LA
fc90: 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
fca0: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73  , objPtr, "sbits
fcb0: 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  ", SSL_get_ciphe
fcc0: 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d  r_bits(statePtr-
fcd0: 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20  >ssl, NULL));.. 
fce0: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68     ciphers = (ch
fcf0: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68  ar*)SSL_get_ciph
fd00: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  er(statePtr->ssl
fd10: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
fd20: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
fd30: 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70  r, "cipher", cip
fd40: 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  hers, -1);..    
fd50: 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35  /* Verify the X5
fd60: 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70  09 certificate p
fd70: 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20  resented by the 
fd80: 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50  peer */.    LAPP
fd90: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
fda0: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52  objPtr, "verifyR
fdb0: 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65  esult",..X509_ve
fdc0: 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f  rify_cert_error_
fdd0: 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76  string(SSL_get_v
fde0: 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61  erify_result(sta
fdf0: 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31  tePtr->ssl)), -1
fe00: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
fe10: 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f  y mode */.    mo
fe20: 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  de = SSL_get_ver
fe30: 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  ify_mode(statePt
fe40: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  r->ssl);.    if 
fe50: 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
fe60: 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50  IFY_NONE) {..LAP
fe70: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
fe80: 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
fe90: 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  Mode", "none", -
fea0: 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  1);.    } else {
feb0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f  ..Tcl_Obj *listO
fec0: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
fed0: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
fee0: 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
fef0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b  L_VERIFY_PEER) {
ff00: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
ff10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
ff20: 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
ff30: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
ff40: 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29  Obj("peer", -1))
ff50: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
ff60: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  & SSL_VERIFY_FAI
ff70: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
ff80: 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  T) {..    Tcl_Li
ff90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ffa0: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
ffb0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ffc0: 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66  ringObj("fail if
ffd0: 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20   no peer cert", 
ffe0: 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
fff0: 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
10000 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a  _CLIENT_ONCE) {.
10010 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10020 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10030 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10040 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10050 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22  bj("client once"
10060 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
10070 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
10080 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
10090 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
100a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
100b0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
100c0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
100d0 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61  ringObj("post ha
100e0 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a  ndshake", -1));.
100f0 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28  .}..LAPPEND_OBJ(
10100 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10110 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69  "verifyMode", li
10120 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a  stObjPtr).    }.
10130 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d  .    /* Verify m
10140 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20  ode depth */.   
10150 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
10160 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
10170 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f  rifyDepth", SSL_
10180 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68  get_verify_depth
10190 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
101a0 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74  ;..    /* Report
101b0 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
101c0 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
101d0 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69  lt of the negoti
101e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c  ation */.    SSL
101f0 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63  _get0_alpn_selec
10200 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ted(statePtr->ss
10210 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29  l, &proto, &len)
10220 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
10230 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10240 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20  , "alpn", (char 
10250 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  *)proto, (Tcl_Si
10260 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41  ze) len);.    LA
10270 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10280 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f  , objPtr, "proto
10290 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65  col", SSL_get_ve
102a0 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  rsion(statePtr->
102b0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ssl), -1);..    
102c0 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e  /* Valid for non
102d0 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61  -RSA signature a
102e0 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  nd TLS 1.3 */.  
102f0 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
10300 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
10310 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
10320 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10330 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
10340 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
10350 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
10360 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
10370 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
10380 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
10390 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41  nid = 0;}.    LA
103a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
103b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61  , objPtr, "signa
103c0 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68  tureHashAlgorith
103d0 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  m", OBJ_nid2ln(n
103e0 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69  id), -1);..    i
103f0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
10400 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70  .res = SSL_get_p
10410 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79  eer_signature_ty
10420 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  pe_nid(statePtr-
10430 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20  >ssl, &nid);.   
10440 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
10450 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75   SSL_get_signatu
10460 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
10470 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10490 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
104a0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
104b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
104c0 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22   "signatureType"
104d0 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64  , OBJ_nid2ln(nid
104e0 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c  ), -1);..    Tcl
104f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10500 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
10510 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
10520 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
10530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10570 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  *. * ConnectionI
10580 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  nfoObjCmd -- ret
10590 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  urn connection i
105a0 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  nfo from OpenSSL
105b0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
105c0 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f  . *.A list of co
105d0 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20  nnection info.  
105e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
105f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10620 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
10630 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69  tic int Connecti
10640 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 0a 20 20  onInfoObjCmd(.  
10650 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69    TCL_UNUSED(voi
10660 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e  d *),.    Tcl_In
10670 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
10680 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20    int objc,.    
10690 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
106a0 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 54 63 6c  bjv[]).{.    Tcl
106b0 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
106c0 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
106d0 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20  o set a mode on 
106e0 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
106f0 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
10700 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
10710 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
10720 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
10730 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
10740 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
10750 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
10760 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
10770 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
10780 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
10790 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
107a0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
107b0 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
107c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
107d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
107e0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
107f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10800 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
10810 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
10820 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10830 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
10840 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
10850 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
10860 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
10870 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10880 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
10890 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
108a0 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
108b0 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
108c0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
108d0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
108e0 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
108f0 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
10900 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
10910 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
10920 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10930 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
10940 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
10950 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
10960 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
10970 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
10980 29 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74  )NULL);..Tcl_Set
10990 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
109a0 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43  , "TLS", "CONNEC
109b0 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22  TION", "CHANNEL"
109c0 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
109d0 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
109e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
109f0 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72     }..    objPtr
10a00 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
10a10 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  j(0, NULL);..   
10a20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
10a30 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  nfo */.    state
10a40 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
10a50 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
10a60 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
10a70 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65  .    ssl = state
10a80 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66  Ptr->ssl;.    if
10a90 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
10aa0 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ../* connection 
10ab0 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e  state */..LAPPEN
10ac0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10ad0 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53  jPtr, "state", S
10ae0 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
10af0 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a  long(ssl), -1);.
10b00 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71  ../* Get SNI req
10b10 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61  uested server na
10b20 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  me */..LAPPEND_S
10b30 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10b40 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c  r, "servername",
10b50 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
10b60 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
10b70 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
10b80 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47  me), -1);.../* G
10b90 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09  et protocol */..
10ba0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10bb0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f  rp, objPtr, "pro
10bc0 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  tocol", SSL_get_
10bd0 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31  version(ssl), -1
10be0 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69  );.../* Renegoti
10bf0 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f  ation allowed */
10c00 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
10c10 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10c20 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c  renegotiation_al
10c30 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f  lowed", SSL_get_
10c40 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61  secure_renegotia
10c50 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53  tion_support((SS
10c60 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a  L *) ssl));.../*
10c70 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65   Get security le
10c80 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  vel */..LAPPEND_
10c90 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10ca0 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65  tr, "security_le
10cb0 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  vel", SSL_get_se
10cc0 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c  curity_level(ssl
10cd0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
10ce0 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
10cf0 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10d00 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
10d10 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73  reused", SSL_ses
10d20 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29  sion_reused(ssl)
10d30 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65  );.../* Is serve
10d40 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45  r info */..LAPPE
10d50 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
10d60 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76  objPtr, "is_serv
10d70 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76  er", SSL_is_serv
10d80 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49  er(ssl));.../* I
10d90 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45  s DTLS */..LAPPE
10da0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
10db0 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73  objPtr, "is_dtls
10dc0 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73  ", SSL_is_dtls(s
10dd0 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sl));.    }..   
10de0 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20   /* Cipher info 
10df0 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20  */.    cipher = 
10e00 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
10e10 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20  cipher(ssl);.   
10e20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e   if (cipher != N
10e30 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
10e40 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a  [BUFSIZ] = {0};.
10e50 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62  .int bits, alg_b
10e60 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72  its;.../* Cipher
10e70 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e   name */..LAPPEN
10e80 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10e90 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20  jPtr, "cipher", 
10ea0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e  SSL_CIPHER_get_n
10eb0 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ame(cipher), -1)
10ec0 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20  ;.../* RFC name 
10ed0 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  of cipher */..LA
10ee0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10ef0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64  , objPtr, "stand
10f00 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43  ard_name", SSL_C
10f10 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
10f20 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ame(cipher), -1)
10f30 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e  ;.../* OpenSSL n
10f40 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f  ame of cipher */
10f50 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10f60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f  terp, objPtr, "o
10f70 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50  penssl_name", OP
10f80 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d  ENSSL_cipher_nam
10f90 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61  e(SSL_CIPHER_sta
10fa0 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65  ndard_name(ciphe
10fb0 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e  r)), -1);.../* n
10fc0 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20  umber of secret 
10fd0 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69  bits used for ci
10fe0 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20  pher */..bits = 
10ff0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62  SSL_CIPHER_get_b
11000 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67  its(cipher, &alg
11010 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44  _bits);..LAPPEND
11020 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11030 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74  Ptr, "secret_bit
11040 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50  s", bits);..LAPP
11050 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11060 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74  objPtr, "algorit
11070 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69  hm_bits", alg_bi
11080 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74  ts);../* alg_bit
11090 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20  s is actual key 
110a0 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20  secret bits. If 
110b0 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63  use bits and sec
110c0 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20  ret (algorithm) 
110d0 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20  bits differ,..  
110e0 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
110f0 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c   bits are fixed,
11100 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65   i.e. for limite
11110 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73  d export ciphers
11120 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a   (bits < 56) */.
11130 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77  ../* Indicates w
11140 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f  hich SSL/TLS pro
11150 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69  tocol version fi
11160 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20  rst defined the 
11170 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11180 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11190 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73  bjPtr, "min_vers
111a0 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  ion", SSL_CIPHER
111b0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70  _get_version(cip
111c0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
111d0 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c  Cipher NID */..L
111e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
111f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11200 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  erNID", (char *)
11210 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11220 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72  IPHER_get_cipher
11230 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
11240 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
11250 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11260 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63   "digestNID", (c
11270 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
11280 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
11290 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65  digest_nid(ciphe
112a0 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
112b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
112c0 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61  bjPtr, "keyExcha
112d0 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ngeNID", (char *
112e0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
112f0 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69  CIPHER_get_kx_ni
11300 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
11310 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11320 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
11330 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44  uthenticationNID
11340 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
11350 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
11360 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69  _get_auth_nid(ci
11370 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
11380 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e  * message authen
11390 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20  tication code - 
113a0 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28  Cipher is AEAD (
113b0 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43  e.g. GCM or ChaC
113c0 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f  ha20/Poly1305) o
113d0 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74  r not */../* Aut
113e0 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79  henticated Encry
113f0 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63  ption with assoc
11400 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44  iated data (AEAD
11410 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50  ) check */..LAPP
11420 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11430 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
11440 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43  _is_aead", SSL_C
11450 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69  IPHER_is_aead(ci
11460 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67  pher));.../* Dig
11470 65 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20  est used during 
11480 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64  the SSL/TLS hand
11490 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67  shake when using
114a0 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a   the cipher. */.
114b0 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  .md = SSL_CIPHER
114c0 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64  _get_handshake_d
114d0 69 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09  igest(cipher);..
114e0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
114f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e  rp, objPtr, "han
11500 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20  dshake_digest", 
11510 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e  (char *)EVP_MD_n
11520 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09  ame(md), -1);...
11530 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73  /* Get OpenSSL-s
11540 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20  pecific ID, not 
11550 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50  IANA ID */..LAPP
11560 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11570 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
11580 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43  id", (int) SSL_C
11590 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70  IPHER_get_id(cip
115a0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d  her));.../* Two-
115b0 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20  byte ID used in 
115c0 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c  the TLS protocol
115d0 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69   of the given ci
115e0 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  pher */..LAPPEND
115f0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11600 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69  Ptr, "protocol_i
11610 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
11620 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f  PHER_get_protoco
11630 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a  l_id(cipher));..
11640 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63  ./* Textual desc
11650 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  ription of the c
11660 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53  ipher */..if (SS
11670 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70  L_CIPHER_descrip
11680 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66  tion(cipher, buf
11690 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
116a0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c  = NULL) {..    L
116b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
116c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63  p, objPtr, "desc
116d0 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d  ription", buf, -
116e0 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  1);..}.    }..  
116f0 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66    /* Session inf
11700 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  o */.    session
11710 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69   = SSL_get_sessi
11720 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  on(ssl);.    if 
11730 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c  (session != NULL
11740 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  ) {..const unsig
11750 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
11760 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a  ;..size_t len2;.
11770 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c  .unsigned int ul
11780 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en;..const unsig
11790 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
117a0 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75  n_id, *proto;..u
117b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66  nsigned char buf
117c0 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54  fer[SSL_MAX_MAST
117d0 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a  ER_KEY_LENGTH];.
117e0 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
117f0 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
11800 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
11810 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69   the ALPN negoti
11820 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45  ation */..SSL_SE
11830 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f  SSION_get0_alpn_
11840 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e  selected(session
11850 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29  , &proto, &len2)
11860 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11870 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11880 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20  alpn", (char *) 
11890 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65  proto, (Tcl_Size
118a0 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65  ) len2);.../* Re
118b0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
118c0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
118d0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50  result of the NP
118e0 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
118f0 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
11900 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70  .SSL_get0_next_p
11910 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28  roto_negotiated(
11920 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c  ssl, &proto, &ul
11930 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  en);..LAPPEND_ST
11940 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11950 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a  , "npn", (char *
11960 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  ) proto, (Tcl_Si
11970 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69  ze) ulen);.#endi
11980 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65  f.../* Resumable
11990 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50   session */..LAP
119a0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
119b0 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d  , objPtr, "resum
119c0 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  able", SSL_SESSI
119d0 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28  ON_is_resumable(
119e0 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
119f0 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69  Session start ti
11a00 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63  me (seconds sinc
11a10 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50  e epoch) */..LAP
11a20 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11a30 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f   objPtr, "start_
11a40 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
11a50 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73  ON_get_time(sess
11a60 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  ion));.../* Time
11a70 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
11a80 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
11a90 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
11aa0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
11ab0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
11ac0 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53  meout", SSL_SESS
11ad0 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28  ION_get_timeout(
11ae0 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
11af0 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53  Session id - TLS
11b00 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f  v1.2 and below o
11b10 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f  nly */..session_
11b20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
11b30 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c  _get_id(session,
11b40 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
11b50 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
11b60 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
11b70 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69  n_id", session_i
11b80 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  d, (Tcl_Size) ul
11b90 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  en);.../* Sessio
11ba0 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65  n context */..se
11bb0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
11bc0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63  ESSION_get0_id_c
11bd0 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20  ontext(session, 
11be0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
11bf0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
11c00 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
11c10 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69  _context", sessi
11c20 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
11c30 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65  ) ulen);.../* Se
11c40 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63  ssion ticket - c
11c50 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53  lient only */..S
11c60 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
11c70 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
11c80 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
11c90 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
11ca0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11cb0 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74   "session_ticket
11cc0 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
11cd0 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
11ce0 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
11cf0 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28   lifetime hint (
11d00 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
11d10 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11d20 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66  rp, objPtr, "lif
11d30 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53  etime", SSL_SESS
11d40 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
11d50 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
11d60 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63  sion));.../* Tic
11d70 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a  ket app data */.
11d80 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
11d90 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
11da0 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45  0000000L..SSL_SE
11db0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
11dc0 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53  t_appdata((SSL_S
11dd0 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f  ESSION *) sessio
11de0 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
11df0 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  2);..LAPPEND_BAR
11e00 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
11e10 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f  tr, "ticket_app_
11e20 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28  data", ticket, (
11e30 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
11e40 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74  .#endif.../* Get
11e50 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09   master key */..
11e60 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49  len2 = SSL_SESSI
11e70 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65  ON_get_master_ke
11e80 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65  y(session, buffe
11e90 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  r, SSL_MAX_MASTE
11ea0 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09  R_KEY_LENGTH);..
11eb0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
11ec0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11ed0 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66  master_key", buf
11ee0 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  fer, (Tcl_Size) 
11ef0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70  len2);.../* Comp
11f00 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75  ression id */..u
11f10 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d  nsigned int id =
11f20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
11f30 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73  _compress_id(ses
11f40 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  sion);..LAPPEND_
11f50 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11f60 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
11f70 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20  _id", id == 1 ? 
11f80 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c  "zlib" : "none",
11f90 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
11fa0 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20   /* Compression 
11fb0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
11fc0 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23  ssl != NULL) {.#
11fd0 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43  ifdef HAVE_SSL_C
11fe0 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73  OMPRESSION..cons
11ff0 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63  t COMP_METHOD *c
12000 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d  omp, *expn;..com
12010 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  p = SSL_get_curr
12020 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28  ent_compression(
12030 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53  ssl);..expn = SS
12040 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78  L_get_current_ex
12050 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09  pansion(ssl);...
12060 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12070 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d  rp, objPtr, "com
12080 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20  pression", comp 
12090 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  ? SSL_COMP_get_n
120a0 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e  ame(comp) : "non
120b0 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
120c0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
120d0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
120e0 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f  ", expn ? SSL_CO
120f0 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e  MP_get_name(expn
12100 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  ) : "none", -1);
12110 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f  .#else..LAPPEND_
12120 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12130 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
12140 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
12150 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12160 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
12170 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  pansion", "none"
12180 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
12190 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76    }..    /* Serv
121a0 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b  er info */.    {
121b0 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53  ..long mode = SS
121c0 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f  L_CTX_get_sessio
121d0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
121e0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68  tePtr->ctx);..ch
121f0 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d  ar *msg;...if (m
12200 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12210 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20  ACHE_OFF) {..   
12220 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d   msg = "off";..}
12230 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
12240 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
12250 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d  CLIENT) {..    m
12260 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09  sg = "client";..
12270 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
12280 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12290 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20  _SERVER) {..    
122a0 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a  msg = "server";.
122b0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
122c0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
122d0 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d  E_BOTH) {..    m
122e0 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20  sg = "both";..} 
122f0 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20  else {..    msg 
12300 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a  = "unknown";..}.
12310 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12320 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
12330 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
12340 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  ", msg, -1);.   
12350 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69   }..    /* CA Li
12360 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20  st */.    /* IF 
12370 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61  not a server, sa
12380 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70  me as SSL_get0_p
12390 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20  eer_CA_list. If 
123a0 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53  server same as S
123b0 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e  SL_CTX_get_clien
123c0 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20  t_CA_list */.   
123d0 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e   listPtr = Tcl_N
123e0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
123f0 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46  L);.    STACK_OF
12400 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f  (X509_NAME) *ca_
12410 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63  list;.    if ((c
12420 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74  a_list = SSL_get
12430 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
12440 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ssl)) != NULL) {
12450 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55  ..char buffer[BU
12460 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74  FSIZ];..for (int
12470 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58   i = 0; i < sk_X
12480 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
12490 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20  list); i++) {.. 
124a0 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61     X509_NAME *na
124b0 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  me = sk_X509_NAM
124c0 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c  E_value(ca_list,
124d0 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61   i);..    if (na
124e0 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d  me) {...X509_NAM
124f0 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20  E_oneline(name, 
12500 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
12510 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
12520 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12530 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
12540 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75  _NewStringObj(bu
12550 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20  ffer, -1));..   
12560 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
12570 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
12580 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
12590 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a  ist", listPtr);.
125a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
125b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
125c0 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73  "caListCount", s
125d0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28  k_X509_NAME_num(
125e0 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20  ca_list));..    
125f0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12600 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
12610 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12620 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
12630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12670 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f  -. *. * VersionO
12680 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
12690 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66  version string f
126a0 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
126b0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
126c0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
126d0 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
126e0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
126f0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
12740 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69  static int.Versi
12750 6f 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  onObjCmd(.    TC
12760 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
12770 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
12780 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 43   *interp,.    TC
12790 4c 5f 55 4e 55 53 45 44 28 69 6e 74 29 20 2f 2a  L_UNUSED(int) /*
127a0 20 6f 62 6a 63 20 2a 2f 2c 0a 20 20 20 20 54 43   objc */,.    TC
127b0 4c 5f 55 4e 55 53 45 44 28 54 63 6c 5f 4f 62 6a  L_UNUSED(Tcl_Obj
127c0 20 2a 63 6f 6e 73 74 20 2a 29 20 2f 2a 20 6f 62   *const *) /* ob
127d0 6a 76 20 2a 2f 29 0a 7b 0a 20 20 20 20 54 63 6c  jv */).{.    Tcl
127e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
127f0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
12800 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
12810 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
12820 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
12830 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
12840 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
12850 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
12860 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
12870 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
12880 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128c0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
128d0 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
128e0 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
128f0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
12900 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
12910 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
12920 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
12930 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
12940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12970 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
12980 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
12990 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
129a0 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
129b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
129c0 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
129d0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f  .    Tcl_Obj.*co
129e0 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
129f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
12a00 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
12a10 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
12a20 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
12a30 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
12a40 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
12a50 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
12a60 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20   Tcl_Size cmd;. 
12a70 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20     int isStr;.  
12a80 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36    char buffer[16
12a90 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e  384];..    dprin
12aa0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
12ab0 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
12ac0 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
12ad0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
12ae0 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e  objv, "subcomman
12af0 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74  d ?args?");..ret
12b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12b10 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
12b20 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
12b30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
12b40 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d  , commands, "com
12b50 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20  mand", 0, &cmd) 
12b60 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
12b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12b80 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
12b90 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
12ba0 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20     isStr = (cmd 
12bb0 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20  == C_STRREQ);.  
12bc0 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
12bd0 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a  command) cmd) {.
12be0 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61  .case C_REQ:..ca
12bf0 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09  se C_STRREQ: {..
12c00 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b      EVP_PKEY *pk
12c10 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35  ey=NULL;..    X5
12c20 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09  09 *cert=NULL;..
12c30 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e      X509_NAME *n
12c40 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54  ame=NULL;..    T
12c50 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a  cl_Obj **listv;.
12c60 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69  .    Tcl_Size li
12c70 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f  stc,i;...    BIO
12c80 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
12c90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6b 5f    const char *k_
12ca0 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
12cb0 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
12cc0 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
12cd0 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
12ce0 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
12cf0 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
12d00 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
12d10 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
12d20 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
12d30 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
12d40 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
12d50 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55  BIGNUM *bne = NU
12d60 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73  LL;..    RSA *rs
12d70 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a  a = NULL;.#else.
12d80 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54  .    EVP_PKEY_CT
12d90 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23  X *ctx = NULL;.#
12da0 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28  endif...    if (
12db0 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a  (objc<5) || (obj
12dc0 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72  c>6)) {...Tcl_Wr
12dd0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12de0 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79  p, 2, objv, "key
12df0 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72  size keyfile cer
12e00 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a  tfile ?info?");.
12e10 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12e20 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  OR;..    }...   
12e30 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46   if (Tcl_GetIntF
12e40 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12e50 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65  bjv[2], &keysize
12e60 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
12e70 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
12e80 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b  R;..    }..    k
12e90 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72  eyout=Tcl_GetStr
12ea0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20  ing(objv[3]);.. 
12eb0 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65     pemout=Tcl_Ge
12ec0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
12ed0 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72  ;..    if (isStr
12ee0 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72  ) {...Tcl_SetVar
12ef0 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22  (interp,keyout,"
12f00 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56  ",0);...Tcl_SetV
12f10 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
12f20 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a  ,"",0);..    }..
12f30 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36  .    if (objc>=6
12f40 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69  ) {...if (Tcl_Li
12f50 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
12f60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
12f70 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  , &listc, &listv
12f80 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
12f90 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12fa0 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
12fb0 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
12fc0 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
12fd0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
12fe0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
12ff0 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
13000 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
13010 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
13020 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13030 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
13040 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
13050 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
13060 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13070 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
13080 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
13090 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
130a0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
130b0 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
130c0 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
130d0 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
130e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
130f0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13100 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
13110 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
13120 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
13130 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
13140 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
13150 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
13160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13170 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
13180 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
13190 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
131a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
131b0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
131c0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
131d0 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
131e0 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
131f0 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13200 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13210 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13220 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
13230 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
13240 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13250 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13260 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
13270 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
13280 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13290 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
132a0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
132b0 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
132c0 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
132d0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
132e0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
132f0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
13300 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
13310 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
13320 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13330 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13340 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
13350 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
13360 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
13370 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13380 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
13390 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
133a0 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
133b0 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
133c0 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
133d0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
133e0 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
133f0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13400 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13410 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f  L..    bne = BN_
13420 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20  new();..    rsa 
13430 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20  = RSA_new();..  
13440 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45    pkey = EVP_PKE
13450 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66  Y_new();..    if
13460 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (bne == NULL ||
13470 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   rsa == NULL || 
13480 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13490 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65  !BN_set_word(bne
134a0 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52  ,RSA_F4) ||...!R
134b0 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f  SA_generate_key_
134c0 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c  ex(rsa, keysize,
134d0 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21   bne, NULL) || !
134e0 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f  EVP_PKEY_assign_
134f0 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20  RSA(pkey, rsa)) 
13500 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13510 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53  e(pkey);.../* RS
13520 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65  A_free(rsa); fre
13530 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66  ed by EVP_PKEY_f
13540 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65  ree */...BN_free
13550 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20  (bne);.#else..  
13560 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41    pkey = EVP_RSA
13570 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69  _gen((unsigned i
13580 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20  nt) keysize);.. 
13590 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45     ctx = EVP_PKE
135a0 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e  Y_CTX_new(pkey,N
135b0 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
135c0 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63  key == NULL || c
135d0 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  tx == NULL || !E
135e0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69  VP_PKEY_keygen_i
135f0 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45  nit(ctx) ||...!E
13600 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
13610 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28  rsa_keygen_bits(
13620 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c  ctx, keysize) ||
13630 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
13640 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b  n(ctx, &pkey)) {
13650 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13660 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b  (pkey);...EVP_PK
13670 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  EY_CTX_free(ctx)
13680 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53  ;.#endif...Tcl_S
13690 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
136a0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
136b0 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e  g private key",N
136c0 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  ULL);...return T
136d0 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
136e0 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73   else {...if (is
136f0 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74  Str) {...    out
13700 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d  =BIO_new(BIO_s_m
13710 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d  em());...    PEM
13720 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
13730 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
13740 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
13750 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42  NULL);...    i=B
13760 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
13770 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
13780 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
13790 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
137a0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
137b0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
137c0 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75  Var(interp,keyou
137d0 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
137e0 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
137f0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
13800 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
13810 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
13820 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
13830 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
13840 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
13850 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,keyout);...    
13860 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
13870 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
13880 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
13890 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
138a0 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f  /* PEM_write_bio
138b0 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f  _RSAPrivateKey(o
138c0 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e  ut, rsa, NULL, N
138d0 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  ULL, 0, NULL, NU
138e0 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49  LL); */...    BI
138f0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
13900 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65  .. .}....if ((ce
13910 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d  rt=X509_new())==
13920 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
13930 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
13940 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
13950 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ting certificate
13960 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b   request",NULL);
13970 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
13980 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
13990 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
139a0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
139b0 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
139c0 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
139d0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
139e0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58  _ERROR;...}....X
139f0 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28  509_set_version(
13a00 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f  cert,2);...ASN1_
13a10 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30 39  INTEGER_set(X509
13a20 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65  _get_serialNumbe
13a30 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b  r(cert),serial);
13a40 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
13a50 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
13a60 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
13a70 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
13a80 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74  dj(X509_getm_not
13a90 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e  After(cert),(lon
13aa0 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29  g)60*60*24*days)
13ab0 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62  ;...X509_set_pub
13ac0 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a  key(cert,pkey);.
13ad0 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74  ...name=X509_get
13ae0 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65  _subject_name(ce
13af0 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d  rt);....X509_NAM
13b00 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13b10 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53  xt(name,"C", MBS
13b20 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13b30 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13b40 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_C, -1, -1, 
13b50 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13b60 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13b70 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54  (name,"ST", MBST
13b80 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
13b90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13ba0 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_ST, -1, -1, 
13bb0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13bc0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13bd0 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52  (name,"L", MBSTR
13be0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
13bf0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13c00 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_L, -1, -1, 0)
13c10 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13c20 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13c30 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e  ame,"O", MBSTRIN
13c40 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13c50 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13c60 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _O, -1, -1, 0);.
13c70 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13c80 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13c90 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47  e,"OU", MBSTRING
13ca0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13cb0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13cc0 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  OU, -1, -1, 0);.
13cd0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13ce0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13cf0 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47  e,"CN", MBSTRING
13d00 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13d10 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13d20 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  CN, -1, -1, 0);.
13d30 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13d40 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13d50 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52  e,"Email", MBSTR
13d60 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
13d70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13d80 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31   k_Email, -1, -1
13d90 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65  , 0);....X509_se
13da0 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
13db0 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66  ert,name);....if
13dc0 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72   (!X509_sign(cer
13dd0 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35  t,pkey,EVP_sha25
13de0 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35  6())) {...    X5
13df0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
13e00 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72  .    EVP_PKEY_fr
13e10 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50  ee(pkey);.#if OP
13e20 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13e30 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13e40 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65  0L...    BN_free
13e50 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09  (bne);.#endif...
13e60 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
13e70 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
13e80 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63  signing certific
13e90 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  ate",NULL);...  
13ea0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13eb0 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69  OR;...}....if (i
13ec0 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
13ed0 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
13ee0 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
13ef0 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
13f00 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
13f10 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74    i=BIO_read(out
13f20 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62  ,buffer,sizeof(b
13f30 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20  uffer)-1);...   
13f40 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69   i=(i<0) ? 0 : i
13f50 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69  ;...    buffer[i
13f60 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63  ]='\0';...    Tc
13f70 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13f80 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29  pemout,buffer,0)
13f90 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73  ;...    BIO_flus
13fa0 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49  h(out);...    BI
13fb0 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d  O_free(out);...}
13fc0 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75   else {...    ou
13fd0 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
13fe0 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42  file());...    B
13ff0 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d  IO_write_filenam
14000 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09  e(out,pemout);..
14010 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
14020 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74  io_X509(out,cert
14030 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
14040 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a  e_all(out);...}.
14050 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65 72  ...X509_free(cer
14060 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  t);...EVP_PKEY_f
14070 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
14080 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
14090 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
140a0 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e  00L...BN_free(bn
140b0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20  e);.#endif..    
140c0 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20  }..}..break;.   
140d0 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b   default:..break
140e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
140f0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
14100 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14140 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
14150 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
14160 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
14170 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
14180 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
14190 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
141a0 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
141b0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
141c0 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
141d0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
141e0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
141f0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14200 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
14210 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14250 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
14260 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
14270 52 53 49 4f 4e 20 3e 20 38 0a 54 6c 73 5f 46 72  RSION > 8.Tls_Fr
14280 65 65 28 20 76 6f 69 64 20 2a 62 6c 6f 63 6b 50  ee( void *blockP
14290 74 72 20 29 0a 23 65 6c 73 65 0a 54 6c 73 5f 46  tr ).#else.Tls_F
142a0 72 65 65 28 20 63 68 61 72 20 2a 62 6c 6f 63 6b  ree( char *block
142b0 50 74 72 20 29 0a 23 65 6e 64 69 66 0a 7b 0a 20  Ptr ).#endif.{. 
142c0 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
142d0 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c  tr = (State *)bl
142e0 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72  ockPtr;..    dpr
142f0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
14300 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73  .    Tls_Clean(s
14310 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b  tatePtr);.    ck
14320 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a  free(blockPtr);.
14330 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
14340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
14380 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a   * Tls_Clean --.
14390 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
143a0 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77  dure cleans up w
143b0 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74  hen a SSL socket
143c0 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20   based channel. 
143d0 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20  *.is closed and 
143e0 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  its reference co
143f0 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20  unt falls below 
14400 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a  1.  This should.
14410 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e   *.be called syn
14420 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68  chronously by th
14430 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74  e CloseProc, not
14440 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74   in the. *.Event
14450 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61  uallyFree callba
14460 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ck.. *. * Result
14470 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
14480 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14490 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
144a0 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20  --------------. 
144f0 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61  */.void Tls_Clea
14500 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  n(State *statePt
14510 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  r) {.    dprintf
14520 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
14530 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65   /*.     * we're
14540 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74   assuming here t
14550 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65  hat we're single
14560 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a  -threaded.     *
14570 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
14580 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63  tr->timer != (Tc
14590 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55  l_TimerToken) NU
145a0 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74  LL) {..Tcl_Delet
145b0 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74  eTimerHandler(st
145c0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a  atePtr->timer);.
145d0 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  .statePtr->timer
145e0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
145f0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14600 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66  ->protos) {..ckf
14610 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72  ree(statePtr->pr
14620 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72  otos);..statePtr
14630 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
14640 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14650 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
14660 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
14670 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
14680 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
14690 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72  .dprintf("BIO_fr
146a0 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61  ee_all(%p)", sta
146b0 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49  tePtr->bio);..BI
146c0 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65  O_free_all(state
146d0 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74  Ptr->bio);..stat
146e0 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c  ePtr->bio = NULL
146f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
14700 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
14710 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66  ..dprintf("SSL_f
14720 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50  ree(%p)", stateP
14730 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66  tr->ssl);..SSL_f
14740 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ree(statePtr->ss
14750 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  l);..statePtr->s
14760 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  sl = NULL;.    }
14770 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14780 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43  r->ctx) {..SSL_C
14790 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
147a0 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74  ->ctx);..statePt
147b0 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ctx = NULL;. 
147c0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
147d0 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
147e0 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
147f0 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
14800 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65  allback);..state
14810 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20  Ptr->callback = 
14820 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
14830 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
14840 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44  ssword) {..Tcl_D
14850 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
14860 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
14870 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  ..statePtr->pass
14880 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  word = NULL;.   
14890 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
148a0 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63  Ptr->vcmd) {..Tc
148b0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
148c0 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
148d0 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  .statePtr->vcmd 
148e0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
148f0 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
14900 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  rning");.}.../*.
14910 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14950 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
14960 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Init --. *. *.Th
14970 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20  is is a package 
14980 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
14990 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20  rocedure, which 
149a0 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20  is called. *.by 
149b0 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61  Tcl when this pa
149c0 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61  ckage is to be a
149d0 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72  dded to an inter
149e0 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  preter.. *. * Re
149f0 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66  sults:  Ssl conf
14a00 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65  igured and loade
14a10 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  d. *. * Side eff
14a20 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65  ects:. *. create
14a30 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64   the ssl command
14a40 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c  , initialize ssl
14a50 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d   context. *. *--
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14aa0 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  -. */..#ifndef S
14ab0 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66 69  TRINGIFY.#  defi
14ac0 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29 20  ne STRINGIFY(x) 
14ad0 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23 20  STRINGIFY1(x).# 
14ae0 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46   define STRINGIF
14af0 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66 0a  Y1(x) #x.#endif.
14b00 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
14b10 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  ar tlsTclInitScr
14b20 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75  ipt[] = {.#inclu
14b30 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 20  de "tls.tcl.h". 
14b40 20 20 20 30 78 30 30 0a 7d 3b 0a 0a 44 4c 4c 45     0x00.};..DLLE
14b50 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e  XPORT int Tls_In
14b60 69 74 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  it(.    Tcl_Inte
14b70 72 70 20 2a 69 6e 74 65 72 70 29 0a 7b 0a 20 20  rp *interp).{.  
14b80 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e    Tcl_CmdInfo in
14b90 66 6f 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  fo;..    dprintf
14ba0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 09 2f 2a  ("Called");.../*
14bb0 0a 09 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70  .. * We only sup
14bc0 70 6f 72 74 20 54 63 6c 20 38 2e 36 20 6f 72 20  port Tcl 8.6 or 
14bd0 6e 65 77 65 72 0a 09 20 2a 2f 0a 20 20 20 20 69  newer.. */.    i
14be0 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f (Tcl_InitStubs
14bf0 28 69 6e 74 65 72 70 2c 20 22 38 2e 36 2d 22 2c  (interp, "8.6-",
14c00 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09   0) == NULL) {..
14c10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14c20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
14c30 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21  (TlsLibInit(0) !
14c40 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c  = TCL_OK) {..Tcl
14c50 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
14c60 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  terp, "could not
14c70 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20   initialize SSL 
14c80 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61 72 20  library", (char 
14c90 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
14ca0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14cb0 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  }..    Tcl_Creat
14cc0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
14cd0 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  rp, "tls::cipher
14ce0 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  s", CiphersObjCm
14cf0 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  d, NULL, 0);.   
14d00 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
14d10 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
14d20 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c  ls::connection",
14d30 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
14d40 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b  bjCmd, NULL, 0);
14d50 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14d60 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14d70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b  , "tls::handshak
14d80 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  e", HandshakeObj
14d90 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20  Cmd, NULL, 0);. 
14da0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
14db0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14dc0 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49  "tls::import", I
14dd0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c  mportObjCmd, NUL
14de0 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43  L, 0);.    Tcl_C
14df0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
14e00 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e  interp, "tls::un
14e10 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72  import", Unimpor
14e20 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30  tObjCmd, NULL, 0
14e30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
14e40 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
14e50 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73  rp, "tls::status
14e60 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c  ", StatusObjCmd,
14e70 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54   NULL, 0);.    T
14e80 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14e90 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
14ea0 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
14eb0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c  ionObjCmd, NULL,
14ec0 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65   0);.    Tcl_Cre
14ed0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
14ee0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63  terp, "tls::misc
14ef0 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 4e  ", MiscObjCmd, N
14f00 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ULL, 0);.    Tcl
14f10 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
14f20 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
14f30 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
14f40 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 4e 55 4c  ocolsObjCmd, NUL
14f50 4c 2c 20 30 29 3b 0a 0a 20 20 20 20 69 66 20 28  L, 0);..    if (
14f60 69 6e 74 65 72 70 29 20 7b 0a 09 69 66 20 28 54  interp) {..if (T
14f70 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
14f80 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
14f90 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
14fa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14fb0 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
14fc0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
14fd0 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
14fe0 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64  p, "::tcl::build
14ff0 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20  -info", &info)) 
15000 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  {..Tcl_CreateObj
15010 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15020 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e  "::tls::build-in
15030 66 6f 22 2c 0a 09 09 69 6e 66 6f 2e 6f 62 6a 50  fo",...info.objP
15040 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09  roc, (void *)(..
15050 09 20 20 20 20 50 41 43 4b 41 47 45 5f 56 45 52  .    PACKAGE_VER
15060 53 49 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49  SION "+" STRINGI
15070 46 59 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55  FY(TLS_VERSION_U
15080 55 49 44 29 0a 09 09 09 20 20 20 20 22 2e 62 6f  UID)....    ".bo
15090 68 61 67 61 6e 22 0a 23 69 66 20 64 65 66 69 6e  hagan".#if defin
150a0 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26  ed(__clang__) &&
150b0 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67   defined(__clang
150c0 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20 20  _major__)....   
150d0 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49 4e   ".clang-" STRIN
150e0 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a  GIFY(__clang_maj
150f0 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61 6e  or__).#if __clan
15100 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09  g_minor__ < 10..
15110 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69 66  ..    "0".#endif
15120 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49 46  ....    STRINGIF
15130 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f  Y(__clang_minor_
15140 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  _).#endif.#if de
15150 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75  fined(__cplusplu
15160 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  s) && !defined(_
15170 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20 20  _OBJC__)....    
15180 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e  ".cplusplus".#en
15190 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  dif.#ifndef NDEB
151a0 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62 75  UG....    ".debu
151b0 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  g".#endif.#if !d
151c0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
151d0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 5f  ) && !defined(__
151e0 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 20  INTEL_COMPILER) 
151f0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55  && defined(__GNU
15200 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67 63  C__)....    ".gc
15210 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f  c-" STRINGIFY(__
15220 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e  GNUC__).#if __GN
15230 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a  UC_MINOR__ < 10.
15240 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69  ...    "0".#endi
15250 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49  f....    STRINGI
15260 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f  FY(__GNUC_MINOR_
15270 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  _).#endif.#ifdef
15280 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45   __INTEL_COMPILE
15290 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d 22  R....    ".icc-"
152a0 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e 54   STRINGIFY(__INT
152b0 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65 6e  EL_COMPILER).#en
152c0 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d  dif.#ifdef TCL_M
152d0 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20 20  EM_DEBUG....    
152e0 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e 64  ".memdebug".#end
152f0 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
15300 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20 20  MSC_VER)....    
15310 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47 49  ".msvc-" STRINGI
15320 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65 6e  FY(_MSC_VER).#en
15330 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f 4e  dif.#ifdef USE_N
15340 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e 6d  MAKE....    ".nm
15350 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  ake".#endif.#ifn
15360 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54 49  def TCL_CFG_OPTI
15370 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e 6e  MIZED....    ".n
15380 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e 64  o-optimize".#end
15390 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a 43  if.#ifdef __OBJC
153a0 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a 65  __....    ".obje
153b0 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65 66  ctive-c".#if def
153c0 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73  ined(__cplusplus
153d0 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70 6c  )....    "pluspl
153e0 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  us".#endif.#endi
153f0 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46 47  f.#ifdef TCL_CFG
15400 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20 20  _PROFILED....   
15410 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e 64   ".profile".#end
15420 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 46 59  if.#ifdef PURIFY
15430 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 66 79  ....    ".purify
15440 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ".#endif.#ifdef 
15450 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09 09  STATIC_BUILD....
15460 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23 65      ".static".#e
15470 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b  ndif...), NULL);
15480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
15490 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn Tcl_PkgProvid
154a0 65 45 78 28 69 6e 74 65 72 70 2c 20 50 41 43 4b  eEx(interp, PACK
154b0 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47  AGE_NAME, PACKAG
154c0 45 5f 56 45 52 53 49 4f 4e 2c 20 4e 55 4c 4c 29  E_VERSION, NULL)
154d0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15510 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65  *. *. *.Tls_Safe
15520 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15560 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63   *.Standard proc
15570 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62  edure required b
15580 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69  y 'load'.. *.Ini
15590 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78  tializes this ex
155a0 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61  tension for a sa
155b0 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  fe interpreter..
155c0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155f0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
15600 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20  effects:. *..As 
15610 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
15620 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
15630 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65  A standard Tcl e
15640 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a  rror code.. *. *
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15680 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c 4c  ------*. */..DLL
15690 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53  EXPORT int Tls_S
156a0 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
156b0 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
156c0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
156d0 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  d");.    return 
156e0 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Tls_Init(interp)
156f0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15730 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e  *. *. *.TlsLibIn
15740 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15780 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .Initializes SSL
15790 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65   library once pe
157a0 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a  r application. *
157b0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
157c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157e0 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
157f0 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69  fects:. *..initi
15800 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
15810 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  ry. *. *.Result:
15820 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  . *..none. *. *-
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15860 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69  -----*. */.stati
15870 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74  c int TlsLibInit
15880 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a  (int uninitializ
15890 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  e) {.    static 
158a0 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
158b0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  = 0;.    int sta
158c0 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69  tus = TCL_OK;.#i
158d0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
158e0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
158f0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
15900 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75  S).    size_t nu
15910 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  m_locks;.#endif.
15920 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69  .    if (uniniti
15930 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69  alize) {..if (!i
15940 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20  nitialized) {.. 
15950 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65     dprintf("Aske
15960 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a  d to uninitializ
15970 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f  e, but we are no
15980 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b  t initialized");
15990 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
159a0 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e  L_OK;..}...dprin
159b0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
159c0 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69  nitialize");..#i
159d0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
159e0 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
159f0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
15a00 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63  S)..Tcl_MutexLoc
15a10 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69  k(&init_mx);...i
15a20 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20  f (locks) {..   
15a30 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20   free(locks);.. 
15a40 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b     locks = NULL;
15a50 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74  ..    locksCount
15a60 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a   = 0;..}.#endif.
15a70 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30  .initialized = 0
15a80 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15a90 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15aa0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15ab0 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
15ac0 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
15ad0 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74  x);.#endif...ret
15ae0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  urn TCL_OK;.    
15af0 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69  }..    if (initi
15b00 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e  alized) {..dprin
15b10 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20  tf("Called, but 
15b20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c  using cached val
15b30 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74  ue");..return st
15b40 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  atus;.    }..   
15b50 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15b60 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
15b70 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
15b80 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
15b90 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63  _THREADS).    Tc
15ba0 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
15bb0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20  t_mx);.#endif.  
15bc0 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20    initialized = 
15bd0 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  1;..#if defined(
15be0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
15bf0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
15c00 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d  THREADS).    num
15c10 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20  _locks = 1;.    
15c20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e  locksCount = (in
15c30 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20  t) num_locks;.  
15c40 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63    locks = malloc
15c50 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20  (sizeof(*locks) 
15c60 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20  * num_locks);.  
15c70 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20    memset(locks, 
15c80 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  0, sizeof(*locks
15c90 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
15ca0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49  #endif..    /* I
15cb0 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c  nitialize BOTH l
15cc0 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62  ibcrypto and lib
15cd0 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e  ssl. */.    OPEN
15ce0 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45  SSL_init_ssl(OPE
15cf0 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53  NSSL_INIT_LOAD_S
15d00 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45  SL_STRINGS | OPE
15d10 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43  NSSL_INIT_LOAD_C
15d20 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c  RYPTO_STRINGS..|
15d30 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
15d40 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20  D_ALL_CIPHERS | 
15d50 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
15d60 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55  _ALL_DIGESTS, NU
15d70 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65  LL);..    BIO_ne
15d80 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a  w_tcl(NULL, 0);.
15d90 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15da0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15db0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15dc0 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
15dd0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
15de0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  mx);.#endif..   
15df0 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a   return status;.
15e00 7d 0a                                            }.