Hex Artifact Content

Artifact 57a6f16cffccb0531c1256165d7e67146d2ecfa7af3125d0168c6191b6dbe78b:


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 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 45 78  rsa.h>../*. * Ex
03a0: 74 65 72 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73  ternal functions
03b0: 0a 20 2a 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77  . */../*. * Forw
03c0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
03d0: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32  . */..#define F2
03e0: 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28  N(key, dsp) \..(
03f0: 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20  ((key) == NULL) 
0400: 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20  ? (char *) NULL 
0410: 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c  : \...Tcl_Transl
0420: 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
0430: 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29  rp, (key), (dsp)
0440: 29 29 0a 23 64 65 66 69 6e 65 20 52 45 41 53 4f  )).#define REASO
0450: 4e 28 29 09 45 52 52 5f 72 65 61 73 6f 6e 5f 65  N().ERR_reason_e
0460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 45 52 52 5f  rror_string(ERR_
0470: 67 65 74 5f 65 72 72 6f 72 28 29 29 0a 0a 73 74  get_error())..st
0480: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54  atic SSL_CTX *CT
0490: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
04a0: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
04b0: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
04c0: 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68   char *key,...ch
04d0: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e  ar *certfile, un
04e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
04f0: 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20  _asn1, unsigned 
0500: 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c  char *cert_asn1,
0510: 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f  ...int key_asn1_
0520: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 61 73  len, int cert_as
0530: 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  n1_len, char *CA
0540: 64 69 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c  dir, char *CAfil
0550: 65 2c 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65  e,...char *ciphe
0560: 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72  rs, char *cipher
0570: 73 75 69 74 65 73 2c 20 63 68 61 72 20 2a 44 48  suites, char *DH
0580: 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63  params);..static
0590: 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28   int.TlsLibInit(
05a0: 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
05b0: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  );..#define TLS_
05c0: 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31  PROTO_SSL2..0x01
05d0: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
05e0: 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64  TO_SSL3..0x02.#d
05f0: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
0600: 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 69  TLS1..0x04.#defi
0610: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
0620: 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65  1_1.0x08.#define
0630: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
0640: 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54  2.0x10.#define T
0650: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09  LS_PROTO_TLS1_3.
0660: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41  0x20.#define ENA
0670: 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29  BLED(flag, mask)
0680: 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73  .(((flag) & (mas
0690: 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a  k)) == (mask))..
06a0: 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f  #define SSLKEYLO
06b0: 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f  GFILE.."SSLKEYLO
06c0: 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 53 74  GFILE"../*. * St
06d0: 61 74 69 63 20 64 61 74 61 20 73 74 72 75 63 74  atic data struct
06e0: 75 72 65 73 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65  ures. */..#ifnde
06f0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
0700: 23 69 6e 63 6c 75 64 65 20 22 64 68 5f 70 61 72  #include "dh_par
0710: 61 6d 73 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 2f  ams.h".#endif../
0720: 2a 0a 20 2a 20 57 65 20 6c 6f 73 65 20 74 68 65  *. * We lose the
0730: 20 74 63 6c 20 70 61 73 73 77 6f 72 64 20 63 61   tcl password ca
0740: 6c 6c 62 61 63 6b 20 77 68 65 6e 20 77 65 20 75  llback when we u
0750: 73 65 20 74 68 65 20 52 53 41 20 42 53 41 46 45  se the RSA BSAFE
0760: 20 53 53 4c 2d 43 20 31 2e 31 2e 32 0a 20 2a 20   SSL-C 1.1.2. * 
0770: 6c 69 62 72 61 72 69 65 73 20 69 6e 73 74 65 61  libraries instea
0780: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
0790: 20 4f 70 65 6e 53 53 4c 20 6c 69 62 72 61 72 69   OpenSSL librari
07a0: 65 73 2e 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20  es.. */..#ifdef 
07b0: 42 53 41 46 45 0a 23 64 65 66 69 6e 65 20 50 52  BSAFE.#define PR
07c0: 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 20  E_OPENSSL_0_9_4 
07d0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20  1.#endif../*. * 
07e0: 50 72 65 20 4f 70 65 6e 53 53 4c 20 30 2e 39 2e  Pre OpenSSL 0.9.
07f0: 34 20 43 6f 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69  4 Compat. */..#i
0800: 66 6e 64 65 66 20 53 54 41 43 4b 5f 4f 46 0a 23  fndef STACK_OF.#
0810: 64 65 66 69 6e 65 20 53 54 41 43 4b 5f 4f 46 28  define STACK_OF(
0820: 78 29 09 09 09 53 54 41 43 4b 0a 23 64 65 66 69  x)...STACK.#defi
0830: 6e 65 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52  ne sk_SSL_CIPHER
0840: 5f 6e 75 6d 28 73 6b 29 09 09 73 6b 5f 6e 75 6d  _num(sk)..sk_num
0850: 28 28 73 6b 29 29 0a 23 64 65 66 69 6e 65 20 73  ((sk)).#define s
0860: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
0870: 75 65 28 73 6b 2c 20 69 6e 64 65 78 29 09 28 53  ue(sk, index).(S
0880: 53 4c 5f 43 49 50 48 45 52 2a 29 73 6b 5f 76 61  SL_CIPHER*)sk_va
0890: 6c 75 65 28 28 73 6b 29 2c 20 28 69 6e 64 65 78  lue((sk), (index
08a0: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  )).#endif../*. *
08b0: 20 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53   Thread-Safe TLS
08c0: 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65   Code. */..#ifde
08d0: 66 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64  f TCL_THREADS.#d
08e0: 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48  efine OPENSSL_TH
08f0: 52 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e  READ_DEFINES.#in
0900: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f  clude <openssl/o
0910: 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23  pensslconf.h>..#
0920: 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48  ifdef OPENSSL_TH
0930: 52 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c  READS.#include <
0940: 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68  openssl/crypto.h
0950: 3e 0a 2f 2a 20 41 64 64 65 64 20 2a 2f 0a 23 69  >./* Added */.#i
0960: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0970: 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68  ssl.h>../*. * Th
0980: 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e  readed operation
0990: 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e   requires lockin
09a0: 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42  g callbacks. * B
09b0: 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74  ased from /crypt
09c0: 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20  o/cryptlib.c of 
09d0: 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70  OpenSSL and NSOp
09e0: 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74  enSSL.. */..stat
09f0: 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f  ic Tcl_Mutex *lo
0a00: 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74  cks = NULL;.stat
0a10: 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e  ic int locksCoun
0a20: 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63  t = 0;.static Tc
0a30: 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b  l_Mutex init_mx;
0a40: 0a 0a 23 20 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ..# if OPENSSL_V
0a50: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
0a60: 30 78 31 30 31 30 30 30 30 30 4c 0a 0a 76 6f 69  0x10100000L..voi
0a70: 64 20 43 72 79 70 74 6f 54 68 72 65 61 64 4c 6f  d CryptoThreadLo
0a80: 63 6b 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6d  ckCallback(int m
0a90: 6f 64 65 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73  ode, int n, cons
0aa0: 74 20 63 68 61 72 20 2a 66 69 6c 65 2c 20 69 6e  t char *file, in
0ab0: 74 20 6c 69 6e 65 29 20 7b 0a 0a 20 20 20 20 69  t line) {..    i
0ac0: 66 20 28 6d 6f 64 65 20 26 20 43 52 59 50 54 4f  f (mode & CRYPTO
0ad0: 5f 4c 4f 43 4b 29 20 7b 0a 09 2f 2a 20 54 68 69  _LOCK) {../* Thi
0ae0: 73 20 64 65 62 75 67 67 69 6e 67 20 69 73 20 74  s debugging is t
0af0: 75 72 6e 65 64 20 6f 66 66 20 62 79 20 64 65 66  urned off by def
0b00: 61 75 6c 74 20 2d 2d 20 69 74 27 73 20 74 6f 6f  ault -- it's too
0b10: 20 6e 6f 69 73 79 2e 20 2a 2f 0a 09 2f 2a 20 64   noisy. */../* d
0b20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 20 74  printf("Called t
0b30: 6f 20 6c 6f 63 6b 20 28 6e 3d 25 69 20 6f 66 20  o lock (n=%i of 
0b40: 25 69 29 22 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f  %i)", n, locksCo
0b50: 75 6e 74 29 3b 20 2a 2f 0a 09 54 63 6c 5f 4d 75  unt); */..Tcl_Mu
0b60: 74 65 78 4c 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e  texLock(&locks[n
0b70: 5d 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ]);.    } else {
0b80: 0a 09 2f 2a 20 64 70 72 69 6e 74 66 28 22 43 61  ../* dprintf("Ca
0b90: 6c 6c 65 64 20 74 6f 20 75 6e 6c 6f 63 6b 20 28  lled to unlock (
0ba0: 6e 3d 25 69 20 6f 66 20 25 69 29 22 2c 20 6e 2c  n=%i of %i)", n,
0bb0: 20 6c 6f 63 6b 73 43 6f 75 6e 74 29 3b 20 2a 2f   locksCount); */
0bc0: 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
0bd0: 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20  k(&locks[n]);.  
0be0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 64 70 72 69    }..    /* dpri
0bf0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
0c00: 3b 20 2a 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e  ; */..    return
0c10: 3b 0a 20 20 20 20 66 69 6c 65 20 3d 20 66 69 6c  ;.    file = fil
0c20: 65 3b 0a 20 20 20 20 6c 69 6e 65 20 3d 20 6c 69  e;.    line = li
0c30: 6e 65 3b 0a 7d 0a 0a 75 6e 73 69 67 6e 65 64 20  ne;.}..unsigned 
0c40: 6c 6f 6e 67 20 43 72 79 70 74 6f 54 68 72 65 61  long CryptoThrea
0c50: 64 49 64 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  dIdCallback(void
0c60: 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ) {.    unsigned
0c70: 20 6c 6f 6e 67 20 72 65 74 3b 0a 0a 20 20 20 20   long ret;..    
0c80: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
0c90: 29 3b 0a 0a 20 20 20 20 72 65 74 20 3d 20 28 75  );..    ret = (u
0ca0: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 29 20 54 63  nsigned long) Tc
0cb0: 6c 5f 47 65 74 43 75 72 72 65 6e 74 54 68 72 65  l_GetCurrentThre
0cc0: 61 64 28 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ad();..    dprin
0cd0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 6c  tf("Returning %l
0ce0: 75 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 72  u", ret);..    r
0cf0: 65 74 75 72 6e 28 72 65 74 29 3b 0a 7d 0a 0a 23  eturn(ret);.}..#
0d00: 65 6e 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20  endif.#endif /* 
0d10: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 20  OPENSSL_THREADS 
0d20: 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c  */.#endif /* TCL
0d30: 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f  _THREADS */..../
0d40: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
0d90: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  foCallback --. *
0da0: 0a 20 2a 09 6d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.monitors SSL
0db0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63   connection proc
0dc0: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ess. *. * Result
0dd0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
0de0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0df0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
0e00: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e50: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0e60: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0e70: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0e80: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
0e90: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
0ea0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
0eb0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
0ec0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
0ed0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  );.    Tcl_Obj *
0ee0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72  cmdPtr;.    char
0ef0: 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d   *major; char *m
0f00: 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  inor;..    dprin
0f10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
0f20: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
0f30: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
0f40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65  l_Obj*)NULL)..re
0f50: 74 75 72 6e 3b 0a 0a 20 20 20 20 63 6d 64 50 74  turn;..    cmdPt
0f60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
0f70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
0f80: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 20 30  allback);..#if 0
0f90: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
0fa0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
0fb0: 0a 09 73 65 76 20 3d 20 53 53 4c 5f 61 6c 65 72  ..sev = SSL_aler
0fc0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
0fd0: 6e 67 28 72 65 74 29 3b 0a 09 69 66 20 28 73 74  ng(ret);..if (st
0fe0: 72 63 6d 70 28 73 65 76 2c 20 22 66 61 74 61 6c  rcmp(sev, "fatal
0ff0: 22 29 3d 3d 30 29 20 7b 09 2f 2a 20 4d 61 70 20  ")==0) {./* Map 
1000: 74 6f 20 65 72 72 6f 72 20 2a 2f 0a 09 20 20 20  to error */..   
1010: 20 54 6c 73 5f 45 72 72 6f 72 28 73 74 61 74 65   Tls_Error(state
1020: 50 74 72 2c 20 53 53 4c 5f 45 52 52 4f 52 28 73  Ptr, SSL_ERROR(s
1030: 73 6c 2c 20 30 29 29 3b 0a 09 20 20 20 20 72 65  sl, 0));..    re
1040: 74 75 72 6e 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23  turn;..}.    }.#
1050: 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 77 68  endif.    if (wh
1060: 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e  ere & SSL_CB_HAN
1070: 44 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a  DSHAKE_START) {.
1080: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1090: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
10a0: 73 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c  start";.    } el
10b0: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
10c0: 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f  SL_CB_HANDSHAKE_
10d0: 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  DONE) {..major =
10e0: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
10f0: 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20  inor = "done";. 
1100: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
1110: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1120: 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20  ALERT)..major = 
1130: 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69  "alert";..else i
1140: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
1150: 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72  T_CONNECT).major
1160: 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65   = "connect";..e
1170: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1180: 53 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09  SSL_ST_ACCEPT)..
1190: 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22  major = "accept"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f  ;..else.....majo
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a  r = "unknown";..
11c0: 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c  .if (where & SSL
11d0: 5f 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72  _CB_READ)..minor
11e0: 20 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65   = "read";..else
11f0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
1200: 5f 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f  _CB_WRITE)..mino
1210: 72 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c  r = "write";..el
1220: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1230: 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e  SL_CB_LOOP)..min
1240: 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c  or = "loop";..el
1250: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1260: 53 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e  SL_CB_EXIT)..min
1270: 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c  or = "exit";..el
1280: 73 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22  se.....minor = "
1290: 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a  unknown";.    }.
12a0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
12b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
12c0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
12d0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
12e0: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
12f0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1300: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1310: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ent(statePtr->in
1320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1330: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1340: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
1350: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
1360: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
1370: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1380: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65  endElement(state
1390: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
13a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
13b0: 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29  ngObj(major, -1)
13c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
13d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13e0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
13f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1400: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72  wStringObj(minor
1410: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20  , -1));..    if 
1420: 28 77 68 65 72 65 20 26 20 28 53 53 4c 5f 43 42  (where & (SSL_CB
1430: 5f 4c 4f 4f 50 7c 53 53 4c 5f 43 42 5f 45 58 49  _LOOP|SSL_CB_EXI
1440: 54 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f  T)) {..Tcl_ListO
1450: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1460: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1470: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1480: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1490: 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
14a0: 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29  _long(ssl), -1))
14b0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
14c0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
14d0: 41 4c 45 52 54 29 20 7b 0a 09 63 6f 6e 73 74 20  ALERT) {..const 
14e0: 63 68 61 72 20 2a 63 70 20 3d 20 28 63 68 61 72  char *cp = (char
14f0: 20 2a 29 20 53 53 4c 5f 61 6c 65 72 74 5f 64 65   *) SSL_alert_de
1500: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  sc_string_long(r
1510: 65 74 29 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  et);...Tcl_ListO
1520: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1530: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1540: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1550: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
1560: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
1570: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
1580: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74  pendElement(stat
1590: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
15a0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
15b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
15c0: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
15d0: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20  g(ssl), -1));.  
15e0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 50 72 65 73    }.    Tcl_Pres
15f0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
1600: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
1610: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
1620: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
1630: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
1640: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
1650: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
1660: 20 28 76 6f 69 64 29 20 54 63 6c 5f 45 76 61 6c   (void) Tcl_Eval
1670: 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d 3e  ObjEx(statePtr->
1680: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1690: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
16a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
16b0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
16c0: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
16d0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
16e0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  atePtr);.    Tcl
16f0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
1700: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e  Data) statePtr->
1710: 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  interp);.}.../*.
1720: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 56 65 72 69  -----. *. * Veri
1770: 66 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  fyCallback --. *
1780: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.Monitors SSL
1790: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
17a0: 69 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e  idation process.
17b0: 0a 20 2a 09 54 68 69 73 20 69 73 20 63 61 6c 6c  . *.This is call
17c0: 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 63 65  ed whenever a ce
17d0: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73  rtificate is ins
17e0: 70 65 63 74 65 64 0a 20 2a 09 6f 72 20 64 65 63  pected. *.or dec
17f0: 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 0a 20 2a  ided invalid.. *
1800: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1810: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64  A callback bound
1820: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d   to the socket m
1830: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ay return one of
1840: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74  :. *.    0...- t
1850: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
1860: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64  s deemed invalid
1870: 0a 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68  . *.    1...- th
1880: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73  e certificate is
1890: 20 64 65 65 6d 65 64 20 76 61 6c 69 64 0a 20 2a   deemed valid. *
18a0: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e  .    empty strin
18b0: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f  g.- no change to
18c0: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
18d0: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69  idation. *. * Si
18e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
18f0: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
1900: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
1910: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
1920: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
1930: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
1940: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
1950: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
1960: 73 6f 6e 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  son. *----------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
19b0: 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79 43  atic int.VerifyC
19c0: 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c 20  allback(int ok, 
19d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20 2a  X509_STORE_CTX *
19e0: 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ctx) {.    Tcl_O
19f0: 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 72 65 73  bj *cmdPtr, *res
1a00: 75 6c 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 65  ult;.    char *e
1a10: 72 72 53 74 72 2c 20 2a 73 74 72 69 6e 67 3b 0a  rrStr, *string;.
1a20: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 0a      int length;.
1a30: 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09      SSL   *ssl..
1a40: 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f  = (SSL*)X509_STO
1a50: 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61  RE_CTX_get_ex_da
1a60: 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f  ta(ctx, SSL_get_
1a70: 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f  ex_data_X509_STO
1a80: 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20  RE_CTX_idx());. 
1a90: 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09     X509  *cert..
1aa0: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
1ab0: 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72  _get_current_cer
1ac0: 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74  t(ctx);.    Stat
1ad0: 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53  e *statePtr.= (S
1ae0: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
1af0: 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20  p_data(ssl);.   
1b00: 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35   int depth..= X5
1b10: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
1b20: 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78  _error_depth(ctx
1b30: 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09  );.    int err..
1b40: 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  = X509_STORE_CTX
1b50: 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b  _get_error(ctx);
1b60: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a  .    int code;..
1b70: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
1b80: 69 66 79 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  ify: %d", ok);..
1b90: 20 20 20 20 69 66 20 28 21 6f 6b 29 20 7b 0a 09      if (!ok) {..
1ba0: 65 72 72 53 74 72 20 3d 20 28 63 68 61 72 2a 29  errStr = (char*)
1bb0: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
1bc0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72  _error_string(er
1bd0: 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  r);.    } else {
1be0: 0a 09 65 72 72 53 74 72 20 3d 20 28 63 68 61 72  ..errStr = (char
1bf0: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   *)0;.    }..   
1c00: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
1c10: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
1c20: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 69 66  Obj*)NULL) {..if
1c30: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61   (statePtr->vfla
1c40: 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  gs & SSL_VERIFY_
1c50: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
1c60: 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74  CERT) {..    ret
1c70: 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20  urn ok;..} else 
1c80: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b  {..    return 1;
1c90: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d  ..}.    }.    cm
1ca0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
1cb0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
1cc0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20  ->callback);..  
1cd0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1ce0: 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65  endElement(state
1cf0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
1d00: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1d10: 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20  ngObj("verify", 
1d20: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1d30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1d40: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  nt(statePtr->int
1d50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1d60: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1d70: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
1d80: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
1d90: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
1da0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1db0: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50  ndElement(stateP
1dc0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
1dd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
1de0: 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54  j(depth));.    T
1df0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1e00: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
1e10: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1e20: 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  , Tls_NewX509Obj
1e30: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
1e40: 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54  p, cert));.    T
1e50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1e60: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
1e70: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1e80: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1e90: 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ok));.    Tcl_Li
1ea0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1eb0: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  nt(statePtr->int
1ec0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
1ed0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 65 72  _NewStringObj(er
1ee0: 72 53 74 72 20 3f 20 65 72 72 53 74 72 20 3a 20  rStr ? errStr : 
1ef0: 22 22 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54  "", -1));..    T
1f00: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
1f10: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
1f20: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  r->interp);.    
1f30: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
1f40: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
1f50: 74 72 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50  tr);..    stateP
1f60: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
1f70: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a  _TCL_CALLBACK;..
1f80: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1f90: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
1fa0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61    code = Tcl_Eva
1fb0: 6c 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d  lObjEx(statePtr-
1fc0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1fd0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
1fe0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
1ff0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a  != TCL_OK) {../*
2000: 20 49 74 20 67 6f 74 20 61 6e 20 65 72 72 6f 72   It got an error
2010: 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65   - reject the ce
2020: 72 74 69 66 69 63 61 74 65 2e 09 09 2a 2f 0a 23  rtificate...*/.#
2030: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
2040: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
2050: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
2060: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
2070: 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74  groundError(stat
2080: 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23  ePtr->interp);.#
2090: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
20a0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 73 74  oundException(st
20b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
20c0: 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 09 6f  code);.#endif..o
20d0: 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  k = 0;.    } els
20e0: 65 20 7b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63  e {..result = Tc
20f0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 73  l_GetObjResult(s
2100: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2110: 3b 0a 09 73 74 72 69 6e 67 20 3d 20 54 63 6c 5f  ;..string = Tcl_
2120: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2130: 28 72 65 73 75 6c 74 2c 20 26 6c 65 6e 67 74 68  (result, &length
2140: 29 3b 0a 09 2f 2a 20 41 6e 20 65 6d 70 74 79 20  );../* An empty 
2150: 72 65 73 75 6c 74 20 6c 65 61 76 65 73 20 76 65  result leaves ve
2160: 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61  rification uncha
2170: 6e 67 65 64 2e 09 2a 2f 0a 09 69 66 20 28 73 74  nged..*/..if (st
2180: 72 69 6e 67 20 21 3d 20 4e 55 4c 4c 20 26 26 20  ring != NULL && 
2190: 6c 65 6e 67 74 68 20 3e 20 30 29 20 7b 0a 09 20  length > 0) {.. 
21a0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 47 65     code = Tcl_Ge
21b0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 73 74 61 74  tIntFromObj(stat
21c0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 72 65  ePtr->interp, re
21d0: 73 75 6c 74 2c 20 26 6f 6b 29 3b 0a 09 20 20 20  sult, &ok);..   
21e0: 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c   if (code != TCL
21f0: 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f  _OK) {.#if (TCL_
2200: 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d  MAJOR_VERSION ==
2210: 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f   8) && (TCL_MINO
2220: 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09  R_VERSION < 6)..
2230: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
2240: 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 69  rror(statePtr->i
2250: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 09  nterp);.#else...
2260: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78  Tcl_BackgroundEx
2270: 63 65 70 74 69 6f 6e 28 73 74 61 74 65 50 74 72  ception(statePtr
2280: 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b  ->interp, code);
2290: 0a 23 65 6e 64 69 66 0a 09 09 6f 6b 20 3d 20 30  .#endif...ok = 0
22a0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
22b0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
22c0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
22d0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66  .    statePtr->f
22e0: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
22f0: 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20  L_CALLBACK);..  
2300: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
2310: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
2320: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65  Ptr);.    Tcl_Re
2330: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
2340: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
2350: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  erp);.    return
2360: 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61  (ok);./* By defa
2370: 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66  ult, leave verif
2380: 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65  ication unchange
2390: 64 2e 09 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  d..*/.}.../*. *-
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72  --. *. * Tls_Err
23f0: 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  or --. *. *.Call
2400: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  s callback with 
2410: 24 66 64 20 61 6e 64 20 24 6d 73 67 20 2d 20 73  $fd and $msg - s
2420: 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 63  o the callback c
2430: 61 6e 20 64 65 63 69 64 65 0a 20 2a 09 77 68 61  an decide. *.wha
2440: 74 20 74 6f 20 64 6f 20 77 69 74 68 20 65 72 72  t to do with err
2450: 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ors.. *. * Side 
2460: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2470: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2480: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2490: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
24a0: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
24b0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
24c0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
24d0: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
24e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2520: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
2530: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
2540: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
2550: 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *msg) {.    Tcl_
2560: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2570: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20   int code;..    
2580: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
2590: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 73 67 20  );..    if (msg 
25a0: 26 26 20 2a 6d 73 67 29 20 7b 0a 09 54 63 6c 5f  && *msg) {..Tcl_
25b0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 73 74 61  SetErrorCode(sta
25c0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 22  tePtr->interp, "
25d0: 53 53 4c 22 2c 20 6d 73 67 2c 20 28 63 68 61 72  SSL", msg, (char
25e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20   *)NULL);.    } 
25f0: 65 6c 73 65 20 7b 0a 09 6d 73 67 20 3d 20 54 63  else {..msg = Tc
2600: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
2610: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
2620: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ult(statePtr->in
2630: 74 65 72 70 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  terp), NULL);.  
2640: 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
2650: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20  ->err = msg;..  
2660: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
2670: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
2680: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 63  _Obj*)NULL) {..c
2690: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b  har buf[BUFSIZ];
26a0: 0a 09 73 70 72 69 6e 74 66 28 62 75 66 2c 20 22  ..sprintf(buf, "
26b0: 53 53 4c 20 63 68 61 6e 6e 65 6c 20 5c 22 25 73  SSL channel \"%s
26c0: 5c 22 3a 20 65 72 72 6f 72 3a 20 25 73 22 2c 0a  \": error: %s",.
26d0: 09 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
26e0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
26f0: 2d 3e 73 65 6c 66 29 2c 20 6d 73 67 29 3b 0a 09  ->self), msg);..
2700: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 73 74  Tcl_SetResult(st
2710: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20  atePtr->interp, 
2720: 62 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  buf, TCL_VOLATIL
2730: 45 29 3b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  E);.#if (TCL_MAJ
2740: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
2750: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
2760: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
2770: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2780: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2790: 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42  p);.#else..Tcl_B
27a0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69  ackgroundExcepti
27b0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  on(statePtr->int
27c0: 65 72 70 2c 20 54 43 4c 5f 45 52 52 4f 52 29 3b  erp, TCL_ERROR);
27d0: 0a 23 65 6e 64 69 66 0a 09 72 65 74 75 72 6e 3b  .#endif..return;
27e0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74  .    }.    cmdPt
27f0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2800: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2810: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54  allback);..    T
2820: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2830: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
2840: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
2850: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
2860: 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c  ringObj("error",
2870: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f   -1));..    Tcl_
2880: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2890: 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69  ment(statePtr->i
28a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
28b0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
28c0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
28d0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
28e0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a  ->self), -1));..
28f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2900: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61  ppendElement(sta
2910: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
2920: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
2930: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
2940: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c  , -1));..    Tcl
2950: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
2960: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2d  tData) statePtr-
2970: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  >interp);.    Tc
2980: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
2990: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
29a0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72  );..    Tcl_Incr
29b0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
29c0: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
29d0: 5f 45 76 61 6c 4f 62 6a 45 78 28 73 74 61 74 65  _EvalObjEx(state
29e0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64  Ptr->interp, cmd
29f0: 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  Ptr, TCL_EVAL_GL
2a00: 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  OBAL);.    if (c
2a10: 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode != TCL_OK) {
2a20: 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f  .#if (TCL_MAJOR_
2a30: 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26  VERSION == 8) &&
2a40: 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53   (TCL_MINOR_VERS
2a50: 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61  ION < 6)..Tcl_Ba
2a60: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74  ckgroundError(st
2a70: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
2a80: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
2a90: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
2aa0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2ab0: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
2ac0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
2ad0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2ae0: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  r);.    Tcl_Rele
2af0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
2b00: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
2b10: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
2b20: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
2b30: 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a  r->interp);.}...
2b40: 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  void KeyLogCallb
2b50: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
2b60: 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  sl, const char *
2b70: 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72  line) {.    char
2b80: 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53   *str = getenv(S
2b90: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20  SLKEYLOGFILE);. 
2ba0: 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 20 20 20     FILE *fd;.   
2bb0: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20   if (str) {..fd 
2bc0: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22  = fopen(str, "a"
2bd0: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20  );..fprintf(fd, 
2be0: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66  "%s\n",line);..f
2bf0: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
2c00: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2c50: 0a 20 2a 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  . * PasswordCall
2c60: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  back --. *. *.Ca
2c70: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
2c80: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 74  word is needed t
2c90: 6f 20 75 6e 70 61 63 6b 20 52 53 41 20 61 6e 64  o unpack RSA and
2ca0: 20 50 45 4d 20 6b 65 79 73 2e 0a 20 2a 09 45 76   PEM keys.. *.Ev
2cb0: 61 6c 73 20 61 6e 79 20 62 6f 75 6e 64 20 70 61  als any bound pa
2cc0: 73 73 77 6f 72 64 20 73 63 72 69 70 74 20 61 6e  ssword script an
2cd0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 72 65  d returns the re
2ce0: 73 75 6c 74 20 61 73 0a 20 2a 09 74 68 65 20 70  sult as. *.the p
2cf0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 2e 0a  assword string..
2d00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d40: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66  -----. */.#ifdef
2d50: 20 50 52 45 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39   PRE_OPENSSL_0_9
2d60: 5f 34 0a 2f 2a 0a 20 2a 20 4e 6f 20 77 61 79 20  _4./*. * No way 
2d70: 74 6f 20 68 61 6e 64 6c 65 20 75 73 65 72 2d 64  to handle user-d
2d80: 61 74 61 20 74 68 65 72 65 66 6f 72 65 20 6e 6f  ata therefore no
2d90: 20 77 61 79 20 77 69 74 68 6f 75 74 20 61 20 67   way without a g
2da0: 6c 6f 62 61 6c 0a 20 2a 20 76 61 72 69 61 62 6c  lobal. * variabl
2db0: 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
2dc0: 54 63 6c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  Tcl interpreter.
2dd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50  .*/.static int.P
2de0: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
2df0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
2e00: 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66 79 29  ize, int verify)
2e10: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31   {.    return -1
2e20: 3b 0a 09 62 75 66 20 3d 20 62 75 66 3b 0a 09 73  ;..buf = buf;..s
2e30: 69 7a 65 20 3d 20 73 69 7a 65 3b 0a 09 76 65 72  ize = size;..ver
2e40: 69 66 79 20 3d 20 76 65 72 69 66 79 3b 0a 7d 0a  ify = verify;.}.
2e50: 23 65 6c 73 65 0a 73 74 61 74 69 63 20 69 6e 74  #else.static int
2e60: 0a 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63  .PasswordCallbac
2e70: 6b 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74  k(char *buf, int
2e80: 20 73 69 7a 65 2c 20 69 6e 74 20 76 65 72 69 66   size, int verif
2e90: 79 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20  y, void *udata) 
2ea0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
2eb0: 74 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a  tePtr.= (State *
2ec0: 29 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c  ) udata;.    Tcl
2ed0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2ee0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2ef0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
2f00: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
2f10: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69   code;..    dpri
2f20: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
2f30: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2f40: 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55  ->password == NU
2f50: 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45  LL) {..if (Tcl_E
2f60: 76 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74  valEx(interp, "t
2f70: 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d  ls::password", -
2f80: 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  1, TCL_EVAL_GLOB
2f90: 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  AL) == TCL_OK) {
2fa0: 0a 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20  ..    char *ret 
2fb0: 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  = (char *) Tcl_G
2fc0: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69  etStringResult(i
2fd0: 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72  nterp);..    str
2fe0: 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28  ncpy(buf, ret, (
2ff0: 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09  size_t) size);..
3000: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
3010: 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20  strlen(ret);..} 
3020: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75  else {..    retu
3030: 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a  rn -1;..}.    }.
3040: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3050: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3060: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
3070: 64 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65  d);..    Tcl_Pre
3080: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3090: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
30a0: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
30b0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
30c0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 49 6e  tr);..    Tcl_In
30d0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
30e0: 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54  r);.    code = T
30f0: 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
3100: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
3110: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
3120: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54     if (code != T
3130: 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43  CL_OK) {.#if (TC
3140: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
3150: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
3160: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
3170: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3180: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
3190: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
31a0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
31b0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
31c0: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  dif.    }.    Tc
31d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
31e0: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c  mdPtr);..    Tcl
31f0: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3200: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
3210: 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ..    if (code =
3220: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61  = TCL_OK) {..cha
3230: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a  r *ret = (char *
3240: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  ) Tcl_GetStringR
3250: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09  esult(interp);..
3260: 69 66 20 28 73 74 72 6c 65 6e 28 72 65 74 29 20  if (strlen(ret) 
3270: 3c 20 73 69 7a 65 20 2d 20 31 29 20 7b 0a 09 20  < size - 1) {.. 
3280: 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20     strncpy(buf, 
3290: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69  ret, (size_t) si
32a0: 7a 65 29 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65  ze);..    Tcl_Re
32b0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
32c0: 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 20 20 20  a) interp);..   
32d0: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72   return (int)str
32e0: 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 0a 20 20 20  len(ret);..}.   
32f0: 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61   }.    Tcl_Relea
3300: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
3310: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
3320: 75 72 6e 20 2d 31 3b 0a 09 76 65 72 69 66 79 20  urn -1;..verify 
3330: 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 23 65 6e 64  = verify;.}.#end
3340: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
3350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
3390: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  . * CiphersObjCm
33a0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
33b0: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20  ble ciphers. *. 
33c0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
33d0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
33e0: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
33f0: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e  :ciphers" comman
3400: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
3410: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20  ilable ciphers, 
3420: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f  based upon proto
3430: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a  col selected.. *
3440: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3450: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
3460: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
3470: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3480: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e   *.constructs an
3490: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63  d destroys SSL c
34a0: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
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 2f 0a 73 74 61 74 69 63  -----. */.static
3500: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
3510: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73  tocols[] = {.."s
3520: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74  sl2", "ssl3", "t
3530: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20  ls1", "tls1.1", 
3540: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e  "tls1.2", "tls1.
3550: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d  3", NULL.};.enum
3560: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20   protocol {.    
3570: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53  TLS_SSL2, TLS_SS
3580: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c  L3, TLS_TLS1, TL
3590: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c  S_TLS1_1, TLS_TL
35a0: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33  S1_2, TLS_TLS1_3
35b0: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73  , TLS_NONE.};..s
35c0: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72  tatic int.Cipher
35d0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
35e0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
35f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3600: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
3610: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
3620: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
3630: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
3640: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
3650: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
3660: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
3670: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
3680: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
3690: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b    char *cp, buf[
36a0: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74  BUFSIZ];.    int
36b0: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20   index, verbose 
36c0: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74  = 0, use_support
36d0: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ed = 0;..    dpr
36e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
36f0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c  .    if ((objc <
3700: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34   2) || (objc > 4
3710: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
3720: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
3730: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f  , objv, "protoco
3740: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70  l ?verbose? ?sup
3750: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75  ported?");..retu
3760: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3770: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
3780: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
3790: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
37a0: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f   protocols, "pro
37b0: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65  tocol", 0, &inde
37c0: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  x) != TCL_OK) {.
37d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
37e0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
37f0: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54  ((objc > 2) && T
3800: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
3810: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
3820: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20  v[2], &verbose) 
3830: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
3840: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3850: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f      }.    if ((o
3860: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f  bjc > 3) && Tcl_
3870: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
3880: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
3890: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65  ], &use_supporte
38a0: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  d) != TCL_OK) {.
38b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
38c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77  R;.    }..    sw
38d0: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
38e0: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
38f0: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
3900: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
3910: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
3920: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
3930: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
3940: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
3950: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
3960: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3970: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
3980: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
3990: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
39a0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
39b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
39c0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
39d0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 53   = SSL_CTX_new(S
39e0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20  SLv2_method()); 
39f0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
3a00: 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69  ase TLS_SSL3:.#i
3a10: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
3a20: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
3a30: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09  ENSSL_NO_SSL3)..
3a40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3a50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
3a60: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
3a70: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
3a80: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
3a90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
3aa0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
3ab0: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
3ac0: 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65 74 68  X_new(SSLv3_meth
3ad0: 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23 65  od()); break;.#e
3ae0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
3af0: 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  LS1:.#if defined
3b00: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
3b10: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
3b20: 54 4c 53 31 29 0a 09 20 20 20 20 54 63 6c 5f 41  TLS1)..    Tcl_A
3b30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3b40: 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e  rp, protocols[in
3b50: 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f  dex], ": protoco
3b60: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
3b70: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  , NULL);..    re
3b80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3b90: 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d  #else..    ctx =
3ba0: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53   SSL_CTX_new(TLS
3bb0: 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  v1_method()); br
3bc0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
3bd0: 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69  e TLS_TLS1_1:.#i
3be0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
3bf0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
3c00: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
3c10: 31 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  1)..    Tcl_Appe
3c20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3c30: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
3c40: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
3c50: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
3c60: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
3c70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
3c80: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53  se..    ctx = SS
3c90: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f  L_CTX_new(TLSv1_
3ca0: 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65  1_method()); bre
3cb0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
3cc0: 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66   TLS_TLS1_2:.#if
3cd0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
3ce0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
3cf0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
3d00: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
3d10: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3d20: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
3d30: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
3d40: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
3d50: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
3d60: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
3d70: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c  e..    ctx = SSL
3d80: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 32  _CTX_new(TLSv1_2
3d90: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61  _method()); brea
3da0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
3db0: 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20  TLS_TLS1_3:.#if 
3dc0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
3dd0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
3de0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
3df0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
3e00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
3e10: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
3e20: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
3e30: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
3e40: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
3e50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
3e60: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
3e70: 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65 74 68  CTX_new(TLS_meth
3e80: 6f 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  od());.         
3e90: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
3ea0: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
3eb0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
3ec0: 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f  SION);..    SSL_
3ed0: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
3ee0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
3ef0: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
3f00: 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64  .    break;.#end
3f10: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
3f20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3f30: 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55     if (ctx == NU
3f40: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
3f50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3f60: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
3f70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3f80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
3f90: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
3fa0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
3fb0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
3fc0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3fd0: 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55  rp, REASON(), NU
3fe0: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
3ff0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
4000: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
4010: 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c 69  }..    /* Use li
4020: 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73 20  st and order as 
4030: 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69 6e  would be sent in
4040: 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f   a ClientHello o
4050: 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20  r all available 
4060: 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20 69  ciphers */.    i
4070: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64  f (use_supported
4080: 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  ) {..sk = SSL_ge
4090: 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69 70  t1_supported_cip
40a0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
40b0: 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53   else {..sk = SS
40c0: 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73 73  L_get_ciphers(ss
40d0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  l);.    }..    i
40e0: 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b  f (sk != NULL) {
40f0: 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29 20  ..if (!verbose) 
4100: 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  {..    objPtr = 
4110: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
4120: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f  , NULL);..    fo
4130: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
4140: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
4150: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
4160: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
4170: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
4180: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
4190: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
41a0: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
41b0: 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d 65  ../* cipher name
41c0: 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09   or (NONE) */...
41d0: 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  cp = SSL_CIPHER_
41e0: 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69  get_name(c);...i
41f0: 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62  f (cp == NULL) b
4200: 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  reak;...Tcl_List
4210: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4220: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
4230: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4240: 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20  j(cp, -1));..   
4250: 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20   }...} else {.. 
4260: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
4270: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c  NewStringObj("",
4280: 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e  0);..    for (in
4290: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
42a0: 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73  SSL_CIPHER_num(s
42b0: 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e  k); i++) {...con
42c0: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
42d0: 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   = sk_SSL_CIPHER
42e0: 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09  _value(sk, i);..
42f0: 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20  .if (c == NULL) 
4300: 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20  continue;..../* 
4310: 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74  textual descript
4320: 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65  ion of the ciphe
4330: 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43  r */...if (SSL_C
4340: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
4350: 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  n(c, buf, sizeof
4360: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
4370: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
4380: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20  ndToObj(objPtr, 
4390: 62 75 66 2c 20 73 74 72 6c 65 6e 28 62 75 66 29  buf, strlen(buf)
43a0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
43b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
43c0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b  Obj(objPtr, "UNK
43d0: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d  NOWN\n", 8);...}
43e0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
43f0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
4400: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50  ..    sk_SSL_CIP
4410: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d  HER_free(sk);..}
4420: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
4430: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
4440: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
4450: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
4460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
4470: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
4480: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
4490: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
44a0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44f0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
4500: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
4510: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
4520: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
4530: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
4540: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
4550: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
4560: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
4570: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
4580: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
4590: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
45a0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
45b0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
45c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
45d0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
4630: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
4640: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
4650: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
4660: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
4670: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
4680: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
4690: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
46a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
46b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
46c0: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09   (objc != 1) {..
46d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
46e0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
46f0: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  , "");..return T
4700: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
4710: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
4720: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
4730: 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  NULL);..#if OPEN
4740: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
4750: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
4760: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
4770: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
4780: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
4790: 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  2).    Tcl_ListO
47a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
47b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
47c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
47d0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
47e0: 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL2], -1));.#end
47f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
4800: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
4810: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
4820: 53 53 4c 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69  SSL3).    Tcl_Li
4830: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4840: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
4850: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4860: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
4870: 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23  S_SSL3], -1));.#
4880: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
4890: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
48a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
48b0: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 54 63 6c  NO_TLS1).    Tcl
48c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
48d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
48e0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
48f0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
4900: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29  [TLS_TLS1], -1))
4910: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
4920: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
4930: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
4940: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
4950: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4960: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4970: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
4980: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
4990: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
49a0: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _1], -1));.#endi
49b0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
49c0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
49d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
49e0: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 54 63 6c  _TLS1_2).    Tcl
49f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4a00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
4a10: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
4a20: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
4a30: 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31  [TLS_TLS1_2], -1
4a40: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
4a50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
4a60: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
4a70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
4a80: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
4a90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4aa0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
4ab0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4ac0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
4ad0: 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_3], -1));.#en
4ae0: 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  dif..    Tcl_Set
4af0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
4b00: 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
4b10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
4b20: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
4b30: 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
4b40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73  ----. *. * Hands
4b90: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  hakeObjCmd --. *
4ba0: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64  . *.This command
4bb0: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
4bc0: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68  fy whether the h
4bd0: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70  andshake is comp
4be0: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a  lete. *.or not..
4bf0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4c00: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
4c10: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73   result. 1 means
4c20: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c   handshake compl
4c30: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e  ete, 0 means pen
4c40: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ding.. *. * Side
4c50: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
4c60: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74   force SSL negot
4c70: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70  iation to take p
4c80: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  lace.. *. *-----
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4cd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61  */.static int Ha
4ce0: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c  ndshakeObjCmd(Cl
4cf0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
4d00: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
4d10: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
4d20: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
4d30: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
4d40: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
4d50: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
4d60: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
4d70: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
4d80: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4d90: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65  ;        /* clie
4da0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
4db0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63   socket */.    c
4dc0: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74  onst char *errSt
4dd0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  r = NULL;.    in
4de0: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69  t ret = 1;.    i
4df0: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20  nt err = 0;..   
4e00: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
4e10: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
4e20: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
4e30: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
4e40: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
4e50: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
4e60: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
4e70: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
4e80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
4e90: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
4ea0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
4eb0: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
4ec0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
4ed0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
4ee0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28  NULL) {..return(
4ef0: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
4f00: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
4f10: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
4f20: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
4f30: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20  most channel.   
4f40: 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20    */.    chan = 
4f50: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
4f60: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
4f70: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
4f80: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
4f90: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
4fa0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
4fb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
4fc0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
4fd0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4fe0: 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74  (chan), "\": not
4ff0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
5000: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
5010: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
5020: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
5030: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
5040: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
5050: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
5060: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
5070: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
5080: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20  nect");.    ret 
5090: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
50a0: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
50b0: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72  err, 1);.    dpr
50c0: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f  intf("Tls_WaitFo
50d0: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65  rConnect returne
50e0: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20  d: %i", ret);.. 
50f0: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26     if (ret < 0 &
5100: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  & ((statePtr->fl
5110: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
5120: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20  YNC) && (err == 
5130: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72  EAGAIN))) {..dpr
5140: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20  intf("Async set 
5150: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e  and err = EAGAIN
5160: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20  ");..ret = 0;.  
5170: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74    } else if (ret
5180: 20 3c 20 30 29 20 7b 0a 09 65 72 72 53 74 72 20   < 0) {..errStr 
5190: 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b  = statePtr->err;
51a0: 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c  ..Tcl_ResetResul
51b0: 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f  t(interp);..Tcl_
51c0: 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a  SetErrno(err);..
51d0: 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20  .if (!errStr || 
51e0: 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20  (*errStr == 0)) 
51f0: 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20  {..    errStr = 
5200: 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69  Tcl_PosixError(i
5210: 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c  nterp);..}...Tcl
5220: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
5230: 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65  terp, "handshake
5240: 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53   failed: ", errS
5250: 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  tr, (char *) NUL
5260: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
5270: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
5280: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
5290: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
52a0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54  rStr);..return(T
52b0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
52c0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72   else {..if (err
52d0: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   != 0) {..    dp
52e0: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72  rintf("Got an er
52f0: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c  ror with a compl
5300: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20  eted handshake: 
5310: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b  err = %i", err);
5320: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20  ..}..ret = 1;.  
5330: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
5340: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
5350: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25  OK with data \"%
5360: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20  i\"", ret);.    
5370: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
5380: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
5390: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20  IntObj(ret));.  
53a0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
53b0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
53c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f  clientData;.}../
53d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5410: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
5420: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
5430: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
5440: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
5450: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
5460: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
5470: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
5480: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
5490: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
54a0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
54b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
54c0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
54d0: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
54e0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
54f0: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
5500: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
5510: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5570: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
5580: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
5590: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
55a0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
55b0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
55c0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
55d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
55e0: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
55f0: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
5600: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
5610: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
5620: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
5630: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
5640: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
5650: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
5660: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63  .    Tcl_Obj *sc
5670: 72 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e  ript.        = N
5680: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
5690: 20 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20   *password.     
56a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
56b0: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72  cl_DString upper
56c0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
56d0: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  on, upperChannel
56e0: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43  Blocking, upperC
56f0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20  hannelEncoding, 
5700: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
5710: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78  har;.    int idx
5720: 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66  , len;.    int f
5730: 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d 20  lags..        = 
5740: 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20  TLS_TCL_INIT;.  
5750: 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20 20    int server..  
5760: 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69 73        = 0;./* is
5770: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f   connection inco
5780: 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67  ming or outgoing
5790: 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b  ? */.    char *k
57a0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
57b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
57c0: 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20 20  *certfile.      
57d0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e    = NULL;.    un
57e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
57f0: 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69    .= NULL;.    i
5800: 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20  nt key_len      
5810: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
5820: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
5830: 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20 20  r *cert         
5840: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
5850: 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20  cert_len        
5860: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
5870: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20   char *ciphers. 
5880: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
5890: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
58a0: 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20  uites.        = 
58b0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
58c0: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  CAfile.        =
58d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
58e0: 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20  *CAdir..        
58f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
5900: 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20   *DHparams.     
5910: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
5920: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20  har *model..    
5930: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e      = NULL;.#ifn
5940: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  def OPENSSL_NO_T
5950: 4c 53 45 58 54 0a 20 20 20 20 63 68 61 72 20 2a  LSEXT.    char *
5960: 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20  servername.     
5970: 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f     = NULL;./* ho
5980: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65  stname for Serve
5990: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f  r Name Indicatio
59a0: 6e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  n */.    Tcl_Obj
59b0: 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a   *alpn..= NULL;.
59c0: 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 74 20 73  #endif.    int s
59d0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
59e0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
59f0: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
5a00: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
5a10: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
5a20: 20 70 72 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20   proto = 0;.    
5a30: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
5a40: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
5a50: 75 65 73 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64  uest = 1;..    d
5a60: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5a70: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
5a80: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
5a90: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
5aa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
5ab0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69  NO_SSL2) && defi
5ac0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
5ad0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
5ae0: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  1) && defined(NO
5af0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69  _TLS1_2) && defi
5b00: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
5b10: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  & defined(NO_SSL
5b20: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  3) && !defined(N
5b30: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 73 73 6c 32  O_SSL2).    ssl2
5b40: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 1;.#endif.#if
5b50: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
5b60: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65  L_NO_SSL3) && de
5b70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
5b80: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  & defined(NO_TLS
5b90: 31 5f 31 29 20 26 26 20 64 65 66 69 6e 65 64 28  1_1) && defined(
5ba0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65  NO_TLS1_2) && de
5bb0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
5bc0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   && defined(NO_S
5bd0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
5be0: 28 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 73 73  (NO_SSL3).    ss
5bf0: 6c 33 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23  l3 = 1;.#endif.#
5c00: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
5c10: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
5c20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
5c30: 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65      tls1 = 0;.#e
5c40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
5c50: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
5c60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
5c70: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c  O_TLS1_1).    tl
5c80: 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_1 = 0;.#endif
5c90: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
5ca0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
5cb0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
5cc0: 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32  S1_2).    tls1_2
5cd0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
5ce0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
5cf0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
5d00: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
5d10: 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30  ).    tls1_3 = 0
5d20: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
5d30: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
5d40: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5d50: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
5d60: 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f   "channel ?optio
5d70: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ns?");..return T
5d80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
5d90: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
5da0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
5db0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
5dc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
5dd0: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
5de0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
5df0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
5e00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
5e10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5e20: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b     /*.     * Mak
5e30: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
5e40: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
5e50: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f   channel.     */
5e60: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
5e70: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
5e80: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
5e90: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
5ea0: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
5eb0: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
5ec0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
5ed0: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b  bjv[idx], NULL);
5ee0: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
5ef0: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
5f00: 3b 0a 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64  ;...OPTSTR("-cad
5f10: 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50  ir", CAdir);..OP
5f20: 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20  TSTR("-cafile", 
5f30: 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  CAfile);..OPTSTR
5f40: 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65  ("-certfile", ce
5f50: 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  rtfile);..OPTSTR
5f60: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68  ("-cipher", ciph
5f70: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ers);..OPTSTR("-
5f80: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63  ciphersuites", c
5f90: 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f  iphersuites);..O
5fa0: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22  PTOBJ("-command"
5fb0: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53  , script);..OPTS
5fc0: 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20  TR("-dhparams", 
5fd0: 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53  DHparams);..OPTS
5fe0: 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b  TR("-keyfile", k
5ff0: 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  eyfile);..OPTSTR
6000: 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c  ("-model", model
6010: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73  );..OPTOBJ("-pas
6020: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64  sword", password
6030: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
6040: 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29  quire", require)
6050: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71  ;..OPTBOOL("-req
6060: 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b  uest", request);
6070: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76  ..OPTBOOL("-serv
6080: 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 23 69  er", server);.#i
6090: 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f  fndef OPENSSL_NO
60a0: 5f 54 4c 53 45 58 54 0a 09 4f 50 54 53 54 52 28  _TLSEXT..OPTSTR(
60b0: 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73  "-servername", s
60c0: 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54  ervername);..OPT
60d0: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70  OBJ("-alpn", alp
60e0: 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 4f 50 54  n);.#endif...OPT
60f0: 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73  BOOL("-ssl2", ss
6100: 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l2);..OPTBOOL("-
6110: 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f  ssl3", ssl3);..O
6120: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20  PTBOOL("-tls1", 
6130: 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  tls1);..OPTBOOL(
6140: 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f  "-tls1.1", tls1_
6150: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  1);..OPTBOOL("-t
6160: 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b  ls1.2", tls1_2);
6170: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
6180: 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f  .3", tls1_3);..O
6190: 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20  PTBYTE("-cert", 
61a0: 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b  cert, cert_len);
61b0: 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22  ..OPTBYTE("-key"
61c0: 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b  , key, key_len);
61d0: 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f  ...OPTBAD("optio
61e0: 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64  n", "-alpn, -cad
61f0: 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65  ir, -cafile, -ce
6200: 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d  rt, -certfile, -
6210: 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73  cipher, -ciphers
6220: 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c  uites, -command,
6230: 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79   -dhparams, -key
6240: 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64  , -keyfile, -mod
6250: 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d  el, -password, -
6260: 72 65 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73  require, -reques
6270: 74 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72  t, -server, -ser
6280: 76 65 72 6e 61 6d 65 2c 20 2d 73 73 6c 32 2c 20  vername, -ssl2, 
6290: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74  -ssl3, -tls1, -t
62a0: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20  ls1.1, -tls1.2, 
62b0: 6f 72 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09  or -tls1.3");...
62c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
62d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
62e0: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72  request).    ver
62f0: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
6300: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20  Y_CLIENT_ONCE | 
6310: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b  SSL_VERIFY_PEER;
6320: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
6330: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72   && require) ver
6340: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
6350: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
6360: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28  R_CERT;.    if (
6370: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72  verify == 0).ver
6380: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
6390: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
63a0: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
63b0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
63c0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
63d0: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
63e0: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
63f0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
6400: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
6410: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
6420: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
6430: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
6440: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
6450: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
6460: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
6470: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
6480: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
6490: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
64a0: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
64b0: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
64c0: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
64d0: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
64e0: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
64f0: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
6500: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
6510: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
6520: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
6530: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
6540: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
6550: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
6560: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
6570: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
6580: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
6590: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
65a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
65b0: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
65c0: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
65d0: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
65e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
65f0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
6600: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
6610: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
6620: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
6630: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
6640: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
6650: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
6660: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
6670: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
6680: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
6690: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
66a0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
66b0: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
66c0: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
66d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
66e0: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
66f0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
6700: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
6710: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
6720: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
6730: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
6740: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
6750: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
6760: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
6770: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
6780: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
6790: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
67a0: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
67b0: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
67c0: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
67d0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
67e0: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
67f0: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
6800: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
6810: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
6820: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
6830: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
6840: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
6850: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
6860: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
6870: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
6880: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
6890: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
68a0: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
68b0: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
68c0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
68d0: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
68e0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
68f0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
6900: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
6910: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
6920: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
6930: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
6940: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
6950: 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55   if (model != NU
6960: 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b  LL) {..int mode;
6970: 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f  ../* Get the "mo
6980: 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  del" context */.
6990: 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43  .chan = Tcl_GetC
69a0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d  hannel(interp, m
69b0: 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69  odel, &mode);..i
69c0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
69d0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
69e0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
69f0: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
6a00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
6a10: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
6a20: 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20  *.. * Make sure 
6a30: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
6a40: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
6a50: 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  l.. */..chan = T
6a60: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
6a70: 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c  (chan);..if (Tcl
6a80: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
6a90: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
6aa0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20  nnelType()) {.. 
6ab0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6ac0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
6ad0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
6ae0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6af0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
6b00: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
6b10: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  ", NULL);..    T
6b20: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
6b30: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
6b40: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
6b50: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
6b60: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
6b70: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
6b80: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
6b90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
6ba0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
6bb0: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65  (statePtr, serve
6bc0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c  r, proto, keyfil
6bd0: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79  e, certfile, key
6be0: 2c 20 63 65 72 74 2c 0a 09 20 20 20 20 6b 65 79  , cert,..    key
6bf0: 5f 6c 65 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20  _len, cert_len, 
6c00: 43 41 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63  CAdir, CAfile, c
6c10: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75  iphers, ciphersu
6c20: 69 74 65 73 2c 20 44 48 70 61 72 61 6d 73 29 29  ites, DHparams))
6c30: 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 29   == (SSL_CTX*)0)
6c40: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
6c50: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
6c60: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
6c70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
6c80: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
6c90: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a  tr->ctx = ctx;..
6ca0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
6cb0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
6cc0: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  re that the chan
6cd0: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e  nel works in bin
6ce0: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20  ary (for the.   
6cf0: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e    * encryption n
6d00: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64  ot to get goofed
6d10: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20   up)..     * We 
6d20: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a  only want to adj
6d30: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e  ust the bufferin
6d40: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e  g in pre-v2 chan
6d50: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20  nels, where.    
6d60: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20   * each channel 
6d70: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69  in the stack mai
6d80: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20  ntained its own 
6d90: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f  buffers..     */
6da0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
6db0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
6dc0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
6dd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
6de0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
6df0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
6e00: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
6e10: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
6e20: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
6e30: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
6e40: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
6e50: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
6e60: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
6e70: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63  rp, chan, "-eofc
6e80: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e  har", &upperChan
6e90: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
6ea0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
6eb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
6ec0: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  an, "-encoding",
6ed0: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e   &upperChannelEn
6ee0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
6ef0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
6f00: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
6f10: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
6f20: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
6f30: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
6f40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
6f50: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
6f60: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26  , "-blocking", &
6f70: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
6f80: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53  king);.    Tcl_S
6f90: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
6fa0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
6fb0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
6fc0: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
6fd0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
6fe0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
6ff0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72  "-blocking", "tr
7000: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ue");.    dprint
7010: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c  f("Consuming Tcl
7020: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63   channel %s", Tc
7030: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
7040: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61  (chan));.    sta
7050: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
7060: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
7070: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e  nterp, Tls_Chann
7080: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e  elType(), (Clien
7090: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
70a0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
70b0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
70c0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
70d0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
70e0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
70f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
7100: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
7110: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
7120: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
7130: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
7140: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
7150: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
7160: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
7170: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
7180: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
7190: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20  .Tls_Free((char 
71a0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72  *) statePtr);..r
71b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
71c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
71d0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
71e0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
71f0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
7200: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
7210: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
7220: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
7230: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
7240: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
7250: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
7260: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
7270: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
7280: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
7290: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
72a0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
72b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
72c0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
72d0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
72e0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
72f0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
7300: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
7310: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
7320: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
7330: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
7340: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
7350: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
7360: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20  Blocking));..   
7370: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49   /*.     * SSL I
7380: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
7390: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50     */.    stateP
73a0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
73b0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
73c0: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
73d0: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
73e0: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
73f0: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
7400: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7410: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
7420: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
7430: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
7440: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
7450: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
7460: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
7470: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7480: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45    }..#ifndef OPE
7490: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20  NSSL_NO_TLSEXT. 
74a0: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d     if (servernam
74b0: 65 29 20 7b 0a 09 69 66 20 28 21 53 53 4c 5f 73  e) {..if (!SSL_s
74c0: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e  et_tlsext_host_n
74d0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
74e0: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26  l, servername) &
74f0: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20  & require) {..  
7500: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7510: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74  lt(interp, "sett
7520: 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d  ing TLS host nam
7530: 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c  e extension fail
7540: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
7550: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
7560: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
7570: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  *) statePtr);.  
7580: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7590: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
75a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
75b0: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20  if (alpn) {../* 
75c0: 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 6c 69  Convert a Tcl li
75d0: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63  st into a protoc
75e0: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d  ol-list in wire-
75f0: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67  format */..unsig
7600: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73  ned char *protos
7610: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , *p;..unsigned 
7620: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  int protos_len =
7630: 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c   0;..int i, len,
7640: 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a   cnt;..Tcl_Obj *
7650: 2a 6c 69 73 74 3b 0a 09 69 66 20 28 54 63 6c 5f  *list;..if (Tcl_
7660: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
7670: 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c  ts(interp, alpn,
7680: 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d   &cnt, &list) !=
7690: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
76a0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
76b0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
76c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
76d0: 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 44 65 74 65 72  OR;..}../* Deter
76e0: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
76f0: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
7700: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
7710: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
7720: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
7730: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
7740: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
7750: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
7760: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
7770: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7780: 74 28 69 6e 74 65 72 70 2c 20 22 61 6c 70 6e 20  t(interp, "alpn 
7790: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f  protocol name to
77a0: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a  o long", (char *
77b0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46  ) NULL);...Tls_F
77c0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
77d0: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
77e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
77f0: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
7800: 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09  en += 1 + len;..
7810: 7d 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  }../* Build the 
7820: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f  complete protoco
7830: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f  l-list */..proto
7840: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74  s = ckalloc(prot
7850: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f  os_len);../* pro
7860: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73  tocol-lists cons
7870: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e  ist of 8-bit len
7880: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79  gth-prefixed, by
7890: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66  te strings */..f
78a0: 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70  or (i = 0, p = p
78b0: 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20  rotos; i < cnt; 
78c0: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  i++) {..    char
78d0: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53   *str = Tcl_GetS
78e0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
78f0: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[i], &len);..  
7900: 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20    *p++ = len;.. 
7910: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72     memcpy(p, str
7920: 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b  , len);..    p +
7930: 3d 20 6c 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 4e 6f  = len;..}../* No
7940: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  te: This functio
7950: 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20  ns reverses the 
7960: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
7970: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
7980: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
7990: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
79a0: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
79b0: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
79c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
79d0: 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20  interp, "failed 
79e0: 74 6f 20 73 65 74 20 61 6c 70 6e 20 70 72 6f 74  to set alpn prot
79f0: 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29  ocols", (char *)
7a00: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
7a10: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
7a20: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
7a30: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
7a40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7a50: 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 53 53 4c  RROR;..}../* SSL
7a60: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
7a70: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66   makes a copy of
7a80: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69   the protocol-li
7a90: 73 74 20 2a 2f 0a 09 63 6b 66 72 65 65 28 70 72  st */..ckfree(pr
7aa0: 6f 74 6f 73 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  otos);.    }.#en
7ab0: 64 69 66 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  dif..    /*.    
7ac0: 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73   * SSL Callbacks
7ad0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c  .     */.    SSL
7ae0: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74  _set_app_data(st
7af0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
7b00: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09  id *)statePtr);.
7b10: 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f  /* point back to
7b20: 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73   us */.    SSL_s
7b30: 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50  et_verify(stateP
7b40: 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c  tr->ssl, verify,
7b50: 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29   VerifyCallback)
7b60: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ;.    SSL_CTX_se
7b70: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28  t_info_callback(
7b80: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49  statePtr->ctx, I
7b90: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  nfoCallback);.. 
7ba0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
7bb0: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
7bc0: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
7bd0: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
7be0: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
7bf0: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
7c00: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
7c10: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
7c20: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
7c30: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
7c40: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
7c50: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45  |= TLS_TCL_SERVE
7c60: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65  R;..SSL_set_acce
7c70: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  pt_state(statePt
7c80: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
7c90: 6c 73 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63  lse {..SSL_set_c
7ca0: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61  onnect_state(sta
7cb0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
7cc0: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62   }.    SSL_set_b
7cd0: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  io(statePtr->ssl
7ce0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
7cf0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  o, statePtr->p_b
7d00: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74  io);.    BIO_set
7d10: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _ssl(statePtr->b
7d20: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  io, statePtr->ss
7d30: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  l, BIO_NOCLOSE);
7d40: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
7d50: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a  End of SSL Init.
7d60: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69       */.    dpri
7d70: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25  ntf("Returning %
7d80: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
7d90: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
7da0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c  >self));.    Tcl
7db0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
7dc0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f  p, (char *) Tcl_
7dd0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
7de0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
7df0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a  TCL_VOLATILE);..
7e00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
7e10: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
7e20: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
7e30: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
7e80: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
7e90: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
7ea0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
7eb0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
7ec0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
7ed0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
7ee0: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
7ef0: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
7f00: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7f10: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
7f20: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
7f30: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
7f40: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
7f90: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
7fa0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
7fb0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
7fc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7fd0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
7fe0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
7ff0: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
8000: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
8010: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
8020: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
8030: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
8040: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
8050: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8060: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8070: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8080: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
8090: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
80a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
80b0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
80c0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
80d0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
80e0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
80f0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
8100: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
8110: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8120: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8130: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72  .     * Make sur
8140: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
8150: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
8160: 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nel.     */.    
8170: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
8180: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
8190: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
81a0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
81b0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
81c0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
81d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81e0: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
81f0: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
8200: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
8210: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
8220: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
8230: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8240: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8250: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43  if (Tcl_UnstackC
8260: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
8270: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
8280: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  R) {..return TCL
8290: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
82a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
82b0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
82c0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
82d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
82e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
82f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
8320: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
8330: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
8340: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
8350: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
8360: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
8370: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
8380: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
8390: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
83a0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
83b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8400: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
8410: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
8420: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
8430: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
8440: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
8450: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
8460: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
8470: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
8480: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74   char *cert, int
8490: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65   key_len, int ce
84a0: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  rt_len, char *CA
84b0: 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43  dir,.    char *C
84c0: 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70  Afile, char *cip
84d0: 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68  hers, char *ciph
84e0: 65 72 73 75 69 74 65 73 2c 20 63 68 61 72 20 2a  ersuites, char *
84f0: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20  DHparams) {.    
8500: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8510: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp = statePtr->i
8520: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43  nterp;.    SSL_C
8530: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
8540: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
8550: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ds;.    Tcl_DStr
8560: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74  ing ds1;.    int
8570: 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e   off = 0;.    in
8580: 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  t load_private_k
8590: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  ey;.    const SS
85a0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64  L_METHOD *method
85b0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
85c0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
85d0: 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63  f (!proto) {..Tc
85e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
85f0: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64  nterp, "no valid
8600: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
8610: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
8620: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
8630: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8640: 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65  create SSL conte
8650: 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  xt */.#if OPENSS
8660: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
8670: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20   >= 0x10100000L 
8680: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  || defined(NO_SS
8690: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L2) || defined(O
86a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
86b0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
86c0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
86d0: 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL2)) {..Tcl_A
86e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
86f0: 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63  rp, "SSL2 protoc
8700: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
8710: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
8720: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
8730: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
8740: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
8750: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
8760: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20  NSSL_NO_SSL3).  
8770: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
8780: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
8790: 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL3)) {..Tcl_App
87a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
87b0: 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c  , "SSL3 protocol
87c0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
87d0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
87e0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
87f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
8800: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
8810: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
8820: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
8830: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
8840: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
8850: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
8860: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8870: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f  "TLS 1.0 protoco
8880: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
8890: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
88a0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20   (SSL_CTX *)0;. 
88b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
88c0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
88d0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
88e0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
88f0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
8900: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
8910: 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63  O_TLS1_1)) {..Tc
8920: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8930: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20  nterp, "TLS 1.1 
8940: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
8950: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
8960: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58  .return (SSL_CTX
8970: 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   *)0;.    }.#end
8980: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
8990: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
89a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
89b0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28  TLS1_2).    if (
89c0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
89d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
89e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
89f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
8a00: 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.2 protocol 
8a10: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
8a20: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28  NULL);..return (
8a30: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20  SSL_CTX *)0;.   
8a40: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
8a50: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
8a60: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
8a70: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
8a80: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
8a90: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
8aa0: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_3)) {..Tcl_
8ab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8ac0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72  erp, "TLS 1.3 pr
8ad0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
8ae0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
8af0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
8b00: 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  )0;.    }.#endif
8b10: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72  ..    switch (pr
8b20: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53  oto) {.#if OPENS
8b30: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
8b40: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
8b50: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
8b60: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
8b70: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
8b80: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
8b90: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68  ROTO_SSL2:..meth
8ba0: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
8bb0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
8bc0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8bd0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
8be0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8bf0: 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20  _SSL3).    case 
8c00: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a  TLS_PROTO_SSL3:.
8c10: 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f  .method = SSLv3_
8c20: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
8c30: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8c40: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
8c50: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8c60: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
8c70: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
8c80: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 54  LS1:..method = T
8c90: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  LSv1_method();..
8ca0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
8cb0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8cc0: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
8cd0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8ce0: 31 5f 31 29 0a 20 20 20 20 63 61 73 65 20 54 4c  1_1).    case TL
8cf0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
8d00: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f  .method = TLSv1_
8d10: 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  1_method();..bre
8d20: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
8d30: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
8d40: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
8d50: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
8d60: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
8d70: 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65  ROTO_TLS1_2:..me
8d80: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d  thod = TLSv1_2_m
8d90: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
8da0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8db0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
8dc0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8dd0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
8de0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
8df0: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 0a 09 20  O_TLS1_3:../*.. 
8e00: 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 72 61  * The version ra
8e10: 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69 6e  nge is constrain
8e20: 65 64 20 62 65 6c 6f 77 2c 0a 09 20 2a 20 61 66  ed below,.. * af
8e30: 74 65 72 20 74 68 65 20 63 6f 6e 74 65 78 74 20  ter the context 
8e40: 69 73 20 63 72 65 61 74 65 64 2e 20 20 55 73 65  is created.  Use
8e50: 20 74 68 65 0a 09 20 2a 20 67 65 6e 65 72 69 63   the.. * generic
8e60: 20 6d 65 74 68 6f 64 20 68 65 72 65 2e 0a 09 20   method here... 
8e70: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53  */..method = TLS
8e80: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
8e90: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65  k;.#endif.    de
8ea0: 66 61 75 6c 74 3a 0a 23 69 66 20 4f 50 45 4e 53  fault:.#if OPENS
8eb0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
8ec0: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c  R >= 0x10100000L
8ed0: 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68  ../* Negotiate h
8ee0: 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65  ighest available
8ef0: 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e   SSL/TLS version
8f00: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c   */..method = TL
8f10: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 65 6c 73  S_method();.#els
8f20: 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76  e..method = SSLv
8f30: 32 33 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 65 6e  23_method();.#en
8f40: 64 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  dif.#if OPENSSL_
8f50: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
8f60: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
8f70: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
8f80: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8f90: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09  ENSSL_NO_SSL2)..
8fa0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
8fb0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
8fc0: 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53  _SSL2)   ? 0 : S
8fd0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b  SL_OP_NO_SSLv2);
8fe0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8ff0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
9000: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
9010: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20  L_NO_SSL3)..off 
9020: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
9030: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
9040: 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  3)   ? 0 : SSL_O
9050: 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e  P_NO_SSLv3);.#en
9060: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
9070: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
9080: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
9090: 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28  _TLS1)..off |= (
90a0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
90b0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20  LS_PROTO_TLS1)  
90c0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
90d0: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a  _TLSv1);.#endif.
90e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
90f0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
9100: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9110: 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_1)..off |= (
9120: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
9130: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29  LS_PROTO_TLS1_1)
9140: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
9150: 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69  _TLSv1_1);.#endi
9160: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
9170: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
9180: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
9190: 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d  _TLS1_2)..off |=
91a0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
91b0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
91c0: 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  2) ? 0 : SSL_OP_
91d0: 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e  NO_TLSv1_2);.#en
91e0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
91f0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
9200: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9210: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20  NO_TLS1_3)..off 
9220: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
9230: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
9240: 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_3) ? 0 : SSL_O
9250: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23  P_NO_TLSv1_3);.#
9260: 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20  endif..break;.  
9270: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53    }..    ctx = S
9280: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
9290: 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63 74  d);..    if (!ct
92a0: 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c  x) {..return(NUL
92b0: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  L);.    }..    i
92c0: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59  f (getenv(SSLKEY
92d0: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c  LOGFILE)) {..SSL
92e0: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f  _CTX_set_keylog_
92f0: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65  callback(ctx, Ke
9300: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  yLogCallback);. 
9310: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
9320: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
9330: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
9340: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
9350: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c   if (proto == TL
9360: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
9370: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  {..SSL_CTX_set_m
9380: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
9390: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
93a0: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  SION);..SSL_CTX_
93b0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
93c0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
93d0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 69 66  3_VERSION);...if
93e0: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
93f0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
9400: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
9410: 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45  _OP_CIPHER_SERVE
9420: 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 09  R_PREFERENCE);..
9430: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
9440: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
9450: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76  app_data(ctx, (v
9460: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a  oid*)interp);./*
9470: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e   remember the in
9480: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20  terpreter */.   
9490: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
94a0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
94b0: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53  _ALL);./* all SS
94c0: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
94d0: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
94e0: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
94f0: 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61  , off);../* disa
9500: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72  ble protocol ver
9510: 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45  sions */.#if OPE
9520: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
9530: 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30  BER < 0x10101000
9540: 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  L.    SSL_CTX_se
9550: 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f  t_mode(ctx, SSL_
9560: 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59 29  MODE_AUTO_RETRY)
9570: 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20  ;./* handle new 
9580: 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62 61  handshakes in ba
9590: 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e 64  ckground */.#end
95a0: 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  if.    SSL_CTX_s
95b0: 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69  ess_set_cache_si
95c0: 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20  ze(ctx, 128);.. 
95d0: 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64     /* Set user d
95e0: 65 66 69 6e 65 64 20 63 69 70 68 65 72 73 20 61  efined ciphers a
95f0: 6e 64 20 63 69 70 68 65 72 20 73 75 69 74 65 73  nd cipher suites
9600: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 28 63 69   */.    if (((ci
9610: 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26  phers != NULL) &
9620: 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  & !SSL_CTX_set_c
9630: 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20  ipher_list(ctx, 
9640: 63 69 70 68 65 72 73 29 29 20 7c 7c 20 5c 0a 09  ciphers)) || \..
9650: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
9660: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
9670: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
9680: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
9690: 73 75 69 74 65 73 29 29 29 20 7b 0a 09 20 20 20  suites))) {..   
96a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
96b0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
96c0: 69 70 68 65 72 73 20 66 61 69 6c 65 64 22 2c 20  iphers failed", 
96d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
96e0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
96f0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
9700: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
9710: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
9720: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63  set some callbac
9730: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ks */.    SSL_CT
9740: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
9750: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73  sswd_cb(ctx, Pas
9760: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a  swordCallback);.
9770: 0a 23 69 66 6e 64 65 66 20 42 53 41 46 45 0a 20  .#ifndef BSAFE. 
9780: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
9790: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
97a0: 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20 28  _userdata(ctx, (
97b0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
97c0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
97d0: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
97e0: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
97f0: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
9800: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
9810: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  */.#ifdef OPENSS
9820: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
9830: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
9840: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
9850: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
9860: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
9870: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
9880: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
9890: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
98a0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
98b0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
98c0: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
98d0: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
98e0: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
98f0: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
9900: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
9910: 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20 20 20  gInit(&ds);..   
9920: 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66   bio = BIO_new_f
9930: 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73  ile(F2N(DHparams
9940: 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20  , &ds), "r");.. 
9950: 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09     if (!bio) {..
9960: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
9970: 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70  (&ds);...Tcl_App
9980: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9990: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  , "Could not fin
99a0: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
99b0: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
99c0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
99d0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
99e0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
99f0: 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  0;..    }...    
9a00: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
9a10: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
9a20: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
9a30: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
9a40: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
9a50: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
9a60: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
9a70: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
9a80: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
9a90: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
9aa0: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
9ab0: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
9ac0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
9ad0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
9ae0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
9af0: 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73  0;..    }..} els
9b00: 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20 67 65  e {..    dh = ge
9b10: 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d  t_dhParams();..}
9b20: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d  ..SSL_CTX_set_tm
9b30: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09  p_dh(ctx, dh);..
9b40: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20 20 20  DH_free(dh);.   
9b50: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
9b60: 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74 69 66  * set our certif
9b70: 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61  icate */.    loa
9b80: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
9b90: 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  0;.    if (certf
9ba0: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
9bb0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
9bc0: 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72   = 1;...Tcl_DStr
9bd0: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09  ingInit(&ds);...
9be0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
9bf0: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
9c00: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
9c10: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
9c20: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
9c30: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
9c40: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
9c50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9c60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
9c70: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
9c80: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
9c90: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
9ca0: 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29  ...     REASON()
9cb0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9cc0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
9cd0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
9ce0: 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a  eturn (SSL_CTX *
9cf0: 29 30 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  )0;..}.    } els
9d00: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
9d10: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
9d20: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
9d30: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
9d40: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
9d50: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
9d60: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
9d70: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
9d80: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
9d90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9da0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
9db0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
9dc0: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
9dd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
9de0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
9df0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
9e00: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43     return (SSL_C
9e10: 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d  TX *)0;..}.    }
9e20: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c   else {..certfil
9e30: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f  e = (char*)X509_
9e40: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74  get_default_cert
9e50: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53  _file();...if (S
9e60: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
9e70: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
9e80: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46   certfile, SSL_F
9e90: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
9ea0: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20  0) {.#if 0..    
9eb0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
9ec0: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41  &ds);..    Tcl_A
9ed0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9ee0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75  rp, "unable to u
9ef0: 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69  se default certi
9f00: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
9f10: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
9f20: 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c  ..     REASON(),
9f30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9f40: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
9f50: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
9f60: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
9f70: 30 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  0;.#endif..}.   
9f80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
9f90: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
9fa0: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
9fb0: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
9fc0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
9fd0: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
9fe0: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
9ff0: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
a000: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
a010: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
a020: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
a030: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
a040: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
a050: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
a060: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
a070: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
a080: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
a090: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
a0a0: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
a0b0: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
a0c0: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
a0d0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
a0e0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
a0f0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
a100: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
a110: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
a120: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
a130: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
a140: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
a150: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
a160: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
a170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a180: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
a190: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
a1a0: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
a1b0: 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20  e, " ",....     
a1c0: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
a1d0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
a1e0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
a1f0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c  );...return (SSL
a200: 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d  _CTX *)0;..    }
a210: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
a220: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20  gFree(&ds);...} 
a230: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20  else if (key != 
a240: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
a250: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
a260: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50  vateKey_ASN1(EVP
a270: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20  _PKEY_RSA, ctx, 
a280: 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20  key,key_len) <= 
a290: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  0) {...Tcl_DStri
a2a0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f  ngFree(&ds);.../
a2b0: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
a2c0: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
a2d0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
a2e0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
a2f0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
a300: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
a310: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
a320: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a330: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
a340: 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20   public key: ", 
a350: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
a360: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
a370: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
a380: 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58  .return (SSL_CTX
a390: 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a   *)0;..    }..}.
a3a0: 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
a3b0: 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
a3c0: 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
a3d0: 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
a3e0: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
a3f0: 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
a400: 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
a410: 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
a420: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a430: 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
a440: 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
a450: 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
a460: 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
a470: 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
a480: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
a490: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
a4a0: 09 20 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c  .    return (SSL
a4b0: 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20  _CTX *)0;..}.   
a4c0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 76   }..    /* Set v
a4d0: 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41 73 20  erification CAs 
a4e0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
a4f0: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20 20 20  ngInit(&ds);.   
a500: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a510: 28 26 64 73 31 29 3b 0a 20 20 20 20 69 66 20 28  (&ds1);.    if (
a520: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
a530: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
a540: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
a550: 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c  &ds), F2N(CAdir,
a560: 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c   &ds1)) ||..!SSL
a570: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
a580: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
a590: 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c  x)) {.#if 0..Tcl
a5a0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
a5b0: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
a5c0: 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44  ree(&ds1);../* D
a5d0: 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63  on't currently c
a5e0: 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c  are if this fail
a5f0: 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  s */..Tcl_Append
a600: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a610: 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69  SSL default veri
a620: 66 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41  fy paths: ", REA
a630: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
a640: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
a650: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
a660: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
a670: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
a680: 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f     /* https://so
a690: 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f  urceforge.net/p/
a6a0: 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a  tls/bugs/57/ */.
a6b0: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a      /* XXX:TODO:
a6c0: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75   Let the user su
a6d0: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65  pply values here
a6e0: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65   instead of some
a6f0: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74  thing that exist
a700: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73  s on the filesys
a710: 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43  tem */.    if (C
a720: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
a730: 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f  ..STACK_OF(X509_
a740: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73  NAME) *certNames
a750: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65   = SSL_load_clie
a760: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43  nt_CA_file(F2N(C
a770: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69  Afile, &ds));..i
a780: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
a790: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
a7a0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
a7b0: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
a7c0: 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20  tNames);..}.    
a7d0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
a7e0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20  ngFree(&ds);.   
a7f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
a800: 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75  (&ds1);.    retu
a810: 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn ctx;.}.../*. 
a820: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a860: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75  ----. *. * Statu
a870: 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  sObjCmd -- retur
a880: 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  n certificate fo
a890: 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72  r connected peer
a8a0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
a8b0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
a8c0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
a8d0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
a8e0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
a8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
a940: 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69  StatusObjCmd(Cli
a950: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
a960: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
a970: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
a980: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
a990: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53   objv[]) {.    S
a9a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
a9b0: 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a      X509 *peer;.
a9c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
a9d0: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  Ptr;.    Tcl_Cha
a9e0: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63  nnel chan;.    c
a9f0: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65  har *channelName
aa00: 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20  , *ciphers;.    
aa10: 69 6e 74 20 6d 6f 64 65 3b 0a 23 69 66 6e 64 65  int mode;.#ifnde
aa20: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  f OPENSSL_NO_TLS
aa30: 45 58 54 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  EXT.    const un
aa40: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
aa50: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  to;.    unsigned
aa60: 20 69 6e 74 20 6c 65 6e 3b 0a 23 65 6e 64 69 66   int len;.#endif
aa70: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
aa80: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 73 77  alled");..    sw
aa90: 69 74 63 68 20 28 6f 62 6a 63 29 20 7b 0a 09 63  itch (objc) {..c
aaa0: 61 73 65 20 32 3a 0a 09 20 20 20 20 63 68 61 6e  ase 2:..    chan
aab0: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
aac0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
aad0: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 3b 0a 09  bjv[1], NULL);..
aae0: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 63 61 73      break;...cas
aaf0: 65 20 33 3a 0a 09 20 20 20 20 69 66 20 28 21 73  e 3:..    if (!s
ab00: 74 72 63 6d 70 20 28 54 63 6c 5f 47 65 74 53 74  trcmp (Tcl_GetSt
ab10: 72 69 6e 67 20 28 6f 62 6a 76 5b 31 5d 29 2c 20  ring (objv[1]), 
ab20: 22 2d 6c 6f 63 61 6c 22 29 29 20 7b 0a 09 09 63  "-local")) {...c
ab30: 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c  hannelName = Tcl
ab40: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ab50: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29  j(objv[2], NULL)
ab60: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20  ;...break;..    
ab70: 7d 0a 09 20 20 20 20 2f 2a 20 65 6c 73 65 20 66  }..    /* else f
ab80: 61 6c 6c 2d 74 68 72 6f 75 67 68 20 2e 2e 2e 20  all-through ... 
ab90: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
aba0: 5f 47 4e 55 43 5f 5f 29 0a 09 20 20 20 20 5f 5f  _GNUC__)..    __
abb0: 61 74 74 72 69 62 75 74 65 5f 5f 28 28 66 61 6c  attribute__((fal
abc0: 6c 74 68 72 6f 75 67 68 29 29 3b 0a 23 65 6e 64  lthrough));.#end
abd0: 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20 20  if..default:..  
abe0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
abf0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
ac00: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68  jv, "?-local? ch
ac10: 61 6e 6e 65 6c 22 29 3b 0a 09 20 20 20 20 72 65  annel");..    re
ac20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ac30: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
ac40: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
ac50: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c  (interp, channel
ac60: 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20  Name, &mode);.  
ac70: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
ac80: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
ac90: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
aca0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
acb0: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
acc0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
acd0: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
ace0: 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20  hannel.     */. 
acf0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
ad00: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
ad10: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
ad20: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
ad30: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
ad40: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
ad50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ad60: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
ad70: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
ad80: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
ad90: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
ada0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
adb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
adc0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
add0: 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
ade0: 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61  te *) Tcl_GetCha
adf0: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
ae00: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
ae10: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65  objc == 2) {..pe
ae20: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  er = SSL_get_pee
ae30: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  r_certificate(st
ae40: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
ae50: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72    } else {..peer
ae60: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69   = SSL_get_certi
ae70: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
ae80: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  >ssl);.    }.   
ae90: 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62   if (peer) {..ob
aea0: 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35  jPtr = Tls_NewX5
aeb0: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65  09Obj(interp, pe
aec0: 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d  er);..if (objc =
aed0: 3d 20 32 29 20 7b 20 58 35 30 39 5f 66 72 65 65  = 2) { X509_free
aee0: 28 70 65 65 72 29 3b 20 7d 0a 20 20 20 20 7d 20  (peer); }.    } 
aef0: 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d  else {..objPtr =
af00: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
af10: 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  0, NULL);.    }.
af20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
af30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
af40: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
af50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
af60: 73 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 20 20  sbits", -1));.  
af70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
af80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
af90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
afa0: 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 67 65 74  ewIntObj(SSL_get
afb0: 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61  _cipher_bits(sta
afc0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c  tePtr->ssl, NULL
afd0: 29 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  )));..    cipher
afe0: 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
aff0: 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
b000: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66  tr->ssl);.    if
b010: 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55   ((ciphers != NU
b020: 4c 4c 29 20 26 26 20 28 73 74 72 63 6d 70 28 63  LL) && (strcmp(c
b030: 69 70 68 65 72 73 2c 20 22 28 4e 4f 4e 45 29 22  iphers, "(NONE)"
b040: 29 20 21 3d 20 30 29 29 20 7b 0a 09 54 63 6c 5f  ) != 0)) {..Tcl_
b050: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b060: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
b070: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
b080: 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22 2c 20  ngObj("cipher", 
b090: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
b0a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b0b0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
b0c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b0d0: 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28  (SSL_get_cipher(
b0e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
b0f0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  -1));.    }..#if
b100: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
b110: 54 4c 53 45 58 54 0a 20 20 20 20 2f 2a 20 52 65  TLSEXT.    /* Re
b120: 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
b130: 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
b140: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
b150: 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
b160: 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
b170: 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
b180: 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
b190: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  len);.    Tcl_Li
b1a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b1b0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
b1c0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
b1d0: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
b1e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
b1f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
b200: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
b210: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b220: 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
b230: 69 6e 74 29 6c 65 6e 29 29 3b 0a 23 65 6e 64 69  int)len));.#endi
b240: 66 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  f.    Tcl_ListOb
b250: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
b260: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
b270: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b280: 22 76 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  "version", -1));
b290: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
b2a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
b2b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
b2c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
b2d0: 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
b2e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
b2f0: 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  1));..    Tcl_Se
b300: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b310: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
b320: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
b330: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
b340: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
b350: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
b360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b390: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
b3a0: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
b3b0: 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
b3c0: 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
b3d0: 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
b3e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
b3f0: 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
b400: 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
b410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
b450: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
b460: 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
b470: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
b480: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
b490: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
b4a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
b4b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
b4c0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
b4d0: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
b4e0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
b4f0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
b500: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
b510: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
b520: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
b530: 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  t */.    Tcl_Obj
b540: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 63 6f   *objPtr;.    co
b550: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
b560: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
b570: 45 52 20 2a 63 69 70 68 65 72 3b 0a 0a 23 69 66  ER *cipher;..#if
b580: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
b590: 4c 5f 4e 4f 5f 54 4c 53 45 58 54 29 20 26 26 20  L_NO_TLSEXT) && 
b5a0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
b5b0: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 30 30  NUMBER >= 0x1000
b5c0: 32 30 30 30 4c 0a 20 20 20 20 63 6f 6e 73 74 20  2000L.    const 
b5d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
b5e0: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  roto;.    unsign
b5f0: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 23 65 6e 64  ed int len;.#end
b600: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
b610: 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
b620: 49 4f 4e 29 20 26 26 20 4f 50 45 4e 53 53 4c 5f  ION) && OPENSSL_
b630: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
b640: 3d 20 30 78 31 30 30 30 32 30 30 30 4c 0a 20 20  = 0x10002000L.  
b650: 20 20 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54    const COMP_MET
b660: 48 4f 44 20 2a 63 6f 6d 70 3b 0a 23 65 6e 64 69  HOD *comp;.#endi
b670: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  f..    if (objc 
b680: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
b690: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
b6a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
b6b0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
b6c0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
b6d0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
b6e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
b6f0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b700: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
b710: 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  , NULL), NULL);.
b720: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
b730: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
b740: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43  LL) {..return(TC
b750: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
b760: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
b770: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
b780: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
b790: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20  st channel.     
b7a0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
b7b0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
b7c0: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
b7d0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
b7e0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
b7f0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
b800: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b810: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
b820: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
b830: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
b840: 68 61 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61  han), "\": not a
b850: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
b860: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  ULL);..return(TC
b870: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
b880: 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
b890: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
b8a0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  NULL);..    /* G
b8b0: 65 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  et connection st
b8c0: 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ate */.    state
b8d0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
b8e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
b8f0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
b900: 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65  .    ssl = state
b910: 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 54 63  Ptr->ssl;.    Tc
b920: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b930: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
b940: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
b950: 72 69 6e 67 4f 62 6a 28 22 73 74 61 74 65 22 2c  ringObj("state",
b960: 20 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 53   -1));.    if (S
b970: 53 4c 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73  SL_is_init_finis
b980: 68 65 64 28 73 73 6c 29 29 20 7b 0a 09 54 63 6c  hed(ssl)) {..Tcl
b990: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b9a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
b9b0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
b9c0: 69 6e 67 4f 62 6a 28 22 65 73 74 61 62 6c 69 73  ingObj("establis
b9d0: 68 65 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  hed", -1));.    
b9e0: 7d 20 65 6c 73 65 20 69 66 20 28 53 53 4c 5f 69  } else if (SSL_i
b9f0: 6e 5f 69 6e 69 74 28 73 73 6c 29 29 20 7b 0a 09  n_init(ssl)) {..
ba00: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ba10: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
ba20: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
ba30: 53 74 72 69 6e 67 4f 62 6a 28 22 68 61 6e 64 73  StringObj("hands
ba40: 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20  hake", -1));.   
ba50: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c   } else {..Tcl_L
ba60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
ba70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
ba80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
ba90: 67 4f 62 6a 28 22 69 6e 69 74 69 61 6c 69 7a 69  gObj("initializi
baa0: 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  ng", -1));.    }
bab0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 65 72  ..    /* Get ser
bac0: 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ver name */.    
bad0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
bae0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
baf0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
bb00: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 72 76 65  StringObj("serve
bb10: 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  r", -1));.    Tc
bb20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
bb30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
bb40: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
bb50: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
bb60: 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
bb70: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
bb80: 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 29  host_name), -1))
bb90: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 70 72  ;..    /* Get pr
bba0: 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 54 63  otocol */.    Tc
bbb0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
bbc0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
bbd0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
bbe0: 72 69 6e 67 4f 62 6a 28 22 70 72 6f 74 6f 63 6f  ringObj("protoco
bbf0: 6c 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  l", -1));.    Tc
bc00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
bc10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
bc20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
bc30: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
bc40: 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31  version(ssl), -1
bc50: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  ));..    /* Get 
bc60: 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 63 69  cipher */.    ci
bc70: 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  pher = SSL_get_c
bc80: 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73  urrent_cipher(ss
bc90: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  l);.    if (ciph
bca0: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  er != NULL) {..c
bcb0: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20  har buf[BUFSIZ] 
bcc0: 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73  = {0};..int bits
bcd0: 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 54 63  , alg_bits;...Tc
bce0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
bcf0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
bd00: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
bd10: 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65 72 22  ringObj("cipher"
bd20: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
bd30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
bd40: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
bd50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
bd60: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  bj(SSL_CIPHER_ge
bd70: 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  t_name(cipher), 
bd80: 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f  -1));..Tcl_ListO
bd90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
bda0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
bdb0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
bdc0: 28 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22  ("standard_name"
bdd0: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
bde0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
bdf0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
be00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
be10: 62 6a 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74  bj(SSL_CIPHER_st
be20: 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68  andard_name(ciph
be30: 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 62 69 74  er), -1));...bit
be40: 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  s = SSL_CIPHER_g
be50: 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20  et_bits(cipher, 
be60: 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 54 63 6c  &alg_bits);..Tcl
be70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
be80: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
be90: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
bea0: 69 6e 67 4f 62 6a 28 22 62 69 74 73 22 2c 20 2d  ingObj("bits", -
beb0: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
bec0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
bed0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
bee0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 69 74  cl_NewIntObj(bit
bef0: 73 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  s));..Tcl_ListOb
bf00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
bf10: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
bf20: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
bf30: 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 2d  "secret_bits", -
bf40: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
bf50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
bf60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
bf70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6c 67  cl_NewIntObj(alg
bf80: 5f 62 69 74 73 29 29 3b 0a 09 2f 2a 20 61 6c 67  _bits));../* alg
bf90: 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20  _bits is actual 
bfa0: 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e  key secret bits.
bfb0: 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64   If use bits and
bfc0: 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74   secret (algorit
bfd0: 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c  hm) bits differ,
bfe0: 0a 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20  .           the 
bff0: 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73  rest of the bits
c000: 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e   are fixed, i.e.
c010: 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70   for limited exp
c020: 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74  ort ciphers (bit
c030: 73 20 3c 20 35 36 29 20 2a 2f 0a 09 54 63 6c 5f  s < 56) */..Tcl_
c040: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
c050: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
c060: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
c070: 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76 65 72 73 69  ngObj("min_versi
c080: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
c090: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
c0a0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
c0b0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
c0c0: 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45 52  ngObj(SSL_CIPHER
c0d0: 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70  _get_version(cip
c0e0: 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a 09 69 66  her), -1));...if
c0f0: 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73   (SSL_CIPHER_des
c100: 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c  cription(cipher,
c110: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
c120: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) != NULL) {.. 
c130: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
c140: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
c150: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
c160: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 64 65  NewStringObj("de
c170: 73 63 72 69 70 74 69 6f 6e 22 2c 20 2d 31 29 29  scription", -1))
c180: 3b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  ;..    Tcl_ListO
c190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
c1a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
c1b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c1c0: 28 62 75 66 2c 20 2d 31 29 29 3b 0a 09 7d 0a 20  (buf, -1));..}. 
c1d0: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69     }..    Tcl_Li
c1e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
c1f0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
c200: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
c210: 4f 62 6a 28 22 72 65 6e 65 67 6f 74 69 61 74 69  Obj("renegotiati
c220: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  on", -1));.    T
c230: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
c240: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
c250: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
c260: 74 72 69 6e 67 4f 62 6a 28 0a 09 53 53 4c 5f 67  tringObj(..SSL_g
c270: 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f  et_secure_renego
c280: 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28  tiation_support(
c290: 73 73 6c 29 20 3f 20 22 61 6c 6c 6f 77 65 64 22  ssl) ? "allowed"
c2a0: 20 3a 20 22 64 69 73 61 6c 6c 6f 77 65 64 22 2c   : "disallowed",
c2b0: 20 2d 31 29 29 3b 0a 0a 23 69 66 20 21 64 65 66   -1));..#if !def
c2c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c2d0: 54 4c 53 45 58 54 29 20 26 26 20 4f 50 45 4e 53  TLSEXT) && OPENS
c2e0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
c2f0: 52 20 3e 3d 20 30 78 31 30 30 30 32 30 30 30 4c  R >= 0x10002000L
c300: 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74  .    /* Report t
c310: 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
c320: 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
c330: 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74   of the negotiat
c340: 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67  ion */.    SSL_g
c350: 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
c360: 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
c370: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  len);.    Tcl_Li
c380: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
c390: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
c3a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
c3b0: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
c3c0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
c3d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
c3e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
c3f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
c400: 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28  (char *)proto, (
c410: 69 6e 74 29 6c 65 6e 29 29 3b 0a 23 65 6e 64 69  int)len));.#endi
c420: 66 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  f..    /* Sessio
c430: 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 54 63  n info */.    Tc
c440: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c450: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
c460: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
c470: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
c480: 5f 72 65 75 73 65 64 22 2c 20 2d 31 29 29 3b 0a  _reused", -1));.
c490: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
c4a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
c4b0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
c4c0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c 5f 73  _NewIntObj(SSL_s
c4d0: 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
c4e0: 6c 29 29 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  l)));..#if defin
c4f0: 65 64 28 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50  ed(HAVE_SSL_COMP
c500: 52 45 53 53 49 4f 4e 29 20 26 26 20 4f 50 45 4e  RESSION) && OPEN
c510: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
c520: 45 52 20 3e 3d 20 30 78 31 30 30 30 32 30 30 30  ER >= 0x10002000
c530: 4c 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73  L.    /* Compres
c540: 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
c550: 20 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f   comp = SSL_get_
c560: 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73  current_compress
c570: 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  ion(ssl);.    if
c580: 20 28 63 6f 6d 70 20 21 3d 20 4e 55 4c 4c 29 20   (comp != NULL) 
c590: 7b 0a 09 65 78 70 61 6e 73 69 6f 6e 20 3d 20 53  {..expansion = S
c5a0: 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65  SL_get_current_e
c5b0: 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  xpansion(ssl);..
c5c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
c5d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
c5e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
c5f0: 53 74 72 69 6e 67 4f 62 6a 28 22 63 6f 6d 70 72  StringObj("compr
c600: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  ession", -1));..
c610: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
c620: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
c630: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
c640: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 4f  StringObj(SSL_CO
c650: 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70  MP_get_name(comp
c660: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
c670: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
c680: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
c690: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
c6a0: 4f 62 6a 28 22 65 78 70 61 6e 73 69 6f 6e 22 2c  Obj("expansion",
c6b0: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
c6c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c6d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
c6e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
c6f0: 6a 28 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  j(SSL_COMP_get_n
c700: 61 6d 65 28 65 78 70 61 6e 73 69 6f 6e 29 2c 20  ame(expansion), 
c710: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  -1));.    }.#end
c720: 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  if..    Tcl_SetO
c730: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c740: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
c750: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
c760: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
c770: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
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 2d  ----------------
c7c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f  ---. *. * Versio
c7d0: 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  nObjCmd -- retur
c7e0: 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  n version string
c7f0: 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
c800: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
c810: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
c820: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
c830: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
c840: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
c890: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
c8a0: 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  sionObjCmd(Clien
c8b0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
c8c0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
c8d0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
c8e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
c8f0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
c900: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20  _Obj *objPtr;.. 
c910: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
c920: 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
c930: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
c940: 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
c950: 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
c960: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
c970: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
c980: 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  Ptr);..    retur
c990: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
c9a0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
c9b0: 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63  ta;..objc = objc
c9c0: 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a  ;..objv = objv;.
c9d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
c9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
ca20: 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d   * MiscObjCmd --
ca30: 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20   misc commands. 
ca40: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
ca50: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
ca60: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
ca70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
ca80: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
ca90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
caa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
cad0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73  /.static int.Mis
cae0: 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  cObjCmd(ClientDa
caf0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
cb00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
cb10: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
cb20: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
cb30: 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  []) {.    static
cb40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d   const char *com
cb50: 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65  mands [] = { "re
cb60: 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55  q", "strreq", NU
cb70: 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63  LL };.    enum c
cb80: 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20  ommand { C_REQ, 
cb90: 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d  C_STRREQ, C_DUMM
cba0: 59 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64  Y };.    int cmd
cbb0: 2c 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  , isStr;.    cha
cbc0: 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
cbd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
cbe0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
cbf0: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
cc00: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
cc10: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
cc20: 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72   "subcommand ?ar
cc30: 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  gs?");..return T
cc40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cc50: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
cc60: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
cc70: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d  rp, objv[1], com
cc80: 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22  mands, "command"
cc90: 2c 20 30 2c 26 63 6d 64 29 20 21 3d 20 54 43 4c  , 0,&cmd) != TCL
cca0: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
ccb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ccc0: 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
ccd0: 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
cce0: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
ccf0: 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
cd00: 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
cd10: 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
cd20: 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
cd30: 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
cd40: 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
cd50: 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
cd60: 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
cd70: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
cd80: 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63  ;..    int listc
cd90: 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f  ,i;...    BIO *o
cda0: 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63  ut=NULL;...    c
cdb0: 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53  har *k_C="",*k_S
cdc0: 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f  T="",*k_L="",*k_
cdd0: 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b  O="",*k_OU="",*k
cde0: 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d  _CN="",*k_Email=
cdf0: 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  "";..    char *k
ce00: 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73  eyout,*pemout,*s
ce10: 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79  tr;..    int key
ce20: 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61  size,serial=0,da
ce30: 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45  ys=365;..#if OPE
ce40: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
ce50: 42 45 52 20 3c 3d 20 30 78 31 30 31 30 30 30 30  BER <= 0x1010000
ce60: 30 4c 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61  0L..    RSA *rsa
ce70: 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 69 66 20 4f   = NULL;.#elif O
ce80: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
ce90: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
cea0: 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
ceb0: 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
cec0: 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
ced0: 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
cee0: 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
cef0: 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
cf00: 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
cf10: 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
cf20: 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
cf30: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
cf40: 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
cf50: 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
cf60: 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
cf70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
cf80: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
cf90: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cfa0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
cfb0: 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
cfc0: 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
cfd0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
cfe0: 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
cff0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d000: 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
d010: 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
d020: 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
d030: 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
d040: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
d050: 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
d060: 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
d070: 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
d080: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
d090: 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
d0a0: 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
d0b0: 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
d0c0: 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c  , objv[5],....&l
d0d0: 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d  istc, &listv) !=
d0e0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20   TCL_OK) {...   
d0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d100: 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c  R;...}....if ((l
d110: 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a  istc%2) != 0) {.
d120: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
d130: 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f  ult(interp,"Info
d140: 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73  rmation list mus
d150: 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62  t have even numb
d160: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22  er of arguments"
d170: 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
d180: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d190: 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20  ..}...for (i=0; 
d1a0: 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b  i<listc; i+=2) {
d1b0: 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47  ...    str=Tcl_G
d1c0: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
d1d0: 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74  ]);...    if (st
d1e0: 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29  rcmp(str,"days")
d1f0: 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
d200: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d210: 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
d220: 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b  ],&days)!=TCL_OK
d230: 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
d240: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
d250: 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
d260: 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29  mp(str,"serial")
d270: 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63  ==0) {....if (Tc
d280: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
d290: 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31  interp,listv[i+1
d2a0: 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f  ],&serial)!=TCL_
d2b0: 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72  OK)....    retur
d2c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
d2d0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
d2e0: 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30  rcmp(str,"C")==0
d2f0: 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47  ) {....k_C=Tcl_G
d300: 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
d310: 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
d320: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
d330: 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"ST")==0) {...
d340: 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72  .k_ST=Tcl_GetStr
d350: 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
d360: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
d370: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22   (strcmp(str,"L"
d380: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54  )==0) {....k_L=T
d390: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
d3a0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
d3b0: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
d3c0: 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b  p(str,"O")==0) {
d3d0: 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53  ....k_O=Tcl_GetS
d3e0: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
d3f0: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
d400: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
d410: 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  OU")==0) {....k_
d420: 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  OU=Tcl_GetString
d430: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
d440: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
d450: 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d  trcmp(str,"CN")=
d460: 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63  =0) {....k_CN=Tc
d470: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
d480: 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
d490: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
d4a0: 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30  (str,"Email")==0
d4b0: 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54  ) {....k_Email=T
d4c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
d4d0: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
d4e0: 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f  } else {....Tcl_
d4f0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
d500: 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65  ,"Unknown parame
d510: 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72  ter",NULL);....r
d520: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d530: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20  ...    }...}..  
d540: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
d550: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
d560: 3c 3d 20 30 78 31 30 31 30 30 30 30 30 4c 0a 09  <= 0x10100000L..
d570: 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50      pkey = EVP_P
d580: 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20  KEY_new();..    
d590: 72 73 61 20 3d 20 52 53 41 5f 67 65 6e 65 72 61  rsa = RSA_genera
d5a0: 74 65 5f 6b 65 79 28 6b 65 79 73 69 7a 65 2c 20  te_key(keysize, 
d5b0: 30 78 31 30 30 30 31 2c 20 4e 55 4c 4c 2c 20 4e  0x10001, NULL, N
d5c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70  ULL);..    if (p
d5d0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72  key == NULL || r
d5e0: 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45  sa == NULL || !E
d5f0: 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52  VP_PKEY_assign_R
d600: 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b  SA(pkey, rsa)) {
d610: 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
d620: 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41  (pkey);.../* RSA
d630: 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65  _free(rsa); free
d640: 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72  d by EVP_PKEY_fr
d650: 65 65 20 2a 2f 0a 23 65 6c 69 66 20 4f 50 45 4e  ee */.#elif OPEN
d660: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
d670: 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
d680: 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e  ..    bne = BN_n
d690: 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d  ew();..    rsa =
d6a0: 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20   RSA_new();..   
d6b0: 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59   pkey = EVP_PKEY
d6c0: 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20  _new();..    if 
d6d0: 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (bne == NULL || 
d6e0: 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70  rsa == NULL || p
d6f0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  key == NULL || !
d700: 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c  BN_set_word(bne,
d710: 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53  RSA_F4) ||...!RS
d720: 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65  A_generate_key_e
d730: 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20  x(rsa, keysize, 
d740: 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45  bne, NULL) || !E
d750: 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52  VP_PKEY_assign_R
d760: 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b  SA(pkey, rsa)) {
d770: 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
d780: 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41  (pkey);.../* RSA
d790: 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72 65 65  _free(rsa); free
d7a0: 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72  d by EVP_PKEY_fr
d7b0: 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28  ee */...BN_free(
d7c0: 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20  bne);.#else..   
d7d0: 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f   pkey = EVP_RSA_
d7e0: 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e  gen((unsigned in
d7f0: 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20  t) keysize);..  
d800: 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59    ctx = EVP_PKEY
d810: 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55  _CTX_new(pkey,NU
d820: 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b  LL);..    if (pk
d830: 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74  ey == NULL || ct
d840: 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56  x == NULL || !EV
d850: 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e  P_PKEY_keygen_in
d860: 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56  it(ctx) ||...!EV
d870: 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72  P_PKEY_CTX_set_r
d880: 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63  sa_keygen_bits(c
d890: 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20  tx, keysize) || 
d8a0: 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e  !EVP_PKEY_keygen
d8b0: 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a  (ctx, &pkey)) {.
d8c0: 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
d8d0: 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45  pkey);...EVP_PKE
d8e0: 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  Y_CTX_free(ctx);
d8f0: 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65  .#endif...Tcl_Se
d900: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
d910: 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67  Error generating
d920: 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55   private key",NU
d930: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  LL);...return TC
d940: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20  L_ERROR;..    } 
d950: 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53  else {...if (isS
d960: 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
d970: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
d980: 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
d990: 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74  write_bio_Privat
d9a0: 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55  eKey(out,pkey,NU
d9b0: 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e  LL,NULL,0,NULL,N
d9c0: 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ULL);...    i=BI
d9d0: 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
d9e0: 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
d9f0: 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
da00: 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
da10: 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
da20: 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
da30: 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74  ar(interp,keyout
da40: 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
da50: 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
da60: 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
da70: 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
da80: 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
da90: 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
daa0: 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
dab0: 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
dac0: 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  keyout);...    P
dad0: 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69  EM_write_bio_Pri
dae0: 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79  vateKey(out,pkey
daf0: 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c  ,NULL,NULL,0,NUL
db00: 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f  L,NULL);...    /
db10: 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f  * PEM_write_bio_
db20: 52 53 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75  RSAPrivateKey(ou
db30: 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55  t, rsa, NULL, NU
db40: 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c  LL, 0, NULL, NUL
db50: 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f  L); */...    BIO
db60: 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a  _free_all(out);.
db70: 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72  . .}....if ((cer
db80: 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e  t=X509_new())==N
db90: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
dba0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
dbb0: 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74  p,"Error generat
dbc0: 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 20  ing certificate 
dbd0: 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a  request",NULL);.
dbe0: 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
dbf0: 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
dc00: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
dc10: 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 30 30  UMBER > 0x101000
dc20: 30 30 4c 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56  00L && OPENSSL_V
dc30: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
dc40: 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
dc50: 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
dc60: 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74  #endif...    ret
dc70: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
dc80: 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  ..}....X509_set_
dc90: 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b  version(cert,2);
dca0: 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f  ...ASN1_INTEGER_
dcb0: 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72  set(X509_get_ser
dcc0: 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c  ialNumber(cert),
dcd0: 73 65 72 69 61 6c 29 3b 0a 23 69 66 20 4f 50 45  serial);.#if OPE
dce0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
dcf0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
dd00: 4c 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  L...X509_gmtime_
dd10: 61 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74  adj(X509_get_not
dd20: 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b  Before(cert),0);
dd30: 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61  ...X509_gmtime_a
dd40: 64 6a 28 58 35 30 39 5f 67 65 74 5f 6e 6f 74 41  dj(X509_get_notA
dd50: 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67  fter(cert),(long
dd60: 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b  )60*60*24*days);
dd70: 0a 23 65 6c 73 65 0a 09 09 58 35 30 39 5f 67 6d  .#else...X509_gm
dd80: 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
dd90: 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72  tm_notBefore(cer
dda0: 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d  t),0);...X509_gm
ddb0: 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
ddc0: 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74  tm_notAfter(cert
ddd0: 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34  ),(long)60*60*24
dde0: 2a 64 61 79 73 29 3b 0a 23 65 6e 64 69 66 0a 09  *days);.#endif..
ddf0: 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
de00: 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
de10: 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
de20: 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
de30: 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
de40: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
de50: 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
de60: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
de70: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
de80: 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
de90: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
dea0: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
deb0: 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
dec0: 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
ded0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
dee0: 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
def0: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
df00: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
df10: 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
df20: 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
df30: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
df40: 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
df50: 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
df60: 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
df70: 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
df80: 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
df90: 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
dfa0: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
dfb0: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
dfc0: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
dfd0: 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
dfe0: 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
dff0: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
e000: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
e010: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
e020: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
e030: 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
e040: 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
e050: 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
e060: 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
e070: 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
e080: 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
e090: 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
e0a0: 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
e0b0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
e0c0: 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
e0d0: 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
e0e0: 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
e0f0: 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
e100: 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
e110: 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
e120: 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
e130: 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
e140: 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
e150: 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
e160: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
e170: 52 20 3e 20 30 78 31 30 31 30 30 30 30 30 4c 20  R > 0x10100000L 
e180: 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  && OPENSSL_VERSI
e190: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
e1a0: 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e  000000L...    BN
e1b0: 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
e1c0: 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  if...    Tcl_Set
e1d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
e1e0: 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72  rror signing cer
e1f0: 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b  tificate",NULL);
e200: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
e210: 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
e220: 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
e230: 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
e240: 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
e250: 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
e260: 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
e270: 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
e280: 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
e290: 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
e2a0: 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
e2b0: 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
e2c0: 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
e2d0: 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
e2e0: 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66  terp,pemout,buff
e2f0: 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
e300: 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
e310: 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
e320: 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
e330: 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
e340: 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
e350: 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
e360: 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75  lename(out,pemou
e370: 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
e380: 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
e390: 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49  ,cert);...    BI
e3a0: 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
e3b0: 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65  ...}....X509_fre
e3c0: 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50  e(cert);...EVP_P
e3d0: 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
e3e0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e3f0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31  ION_NUMBER > 0x1
e400: 30 31 30 30 30 30 30 4c 20 26 26 20 4f 50 45 4e  0100000L && OPEN
e410: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
e420: 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
e430: 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
e440: 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
e450: 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
e460: 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
e470: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
e480: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
e490: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
e4a0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
e4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
e4f0: 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
e500: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
e510: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
e520: 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
e530: 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
e540: 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
e550: 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
e560: 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
e570: 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
e580: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
e590: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
e5a0: 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
e5b0: 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
e600: 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
e610: 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20  char *blockPtr) 
e620: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
e630: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
e640: 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20  )blockPtr;..    
e650: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
e660: 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61  );..    Tls_Clea
e670: 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
e680: 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72   ckfree(blockPtr
e690: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
e6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
e6e0: 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20   *. * Tls_Clean 
e6f0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
e700: 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
e710: 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
e720: 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
e730: 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
e740: 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
e750: 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
e760: 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75  ow 1.  This shou
e770: 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20  ld. *.be called 
e780: 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79  synchronously by
e790: 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20   the CloseProc, 
e7a0: 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76  not in the. *.Ev
e7b0: 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c  entuallyFree cal
e7c0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
e7d0: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
e7e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
e7f0: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
e800: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
e810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e850: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43  -. */.void Tls_C
e860: 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74  lean(State *stat
e870: 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69  ePtr) {.    dpri
e880: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
e890: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65      /*.     * we
e8a0: 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72  're assuming her
e8b0: 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e  e that we're sin
e8c0: 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20  gle-threaded.   
e8d0: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61    */.    if (sta
e8e0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
e8f0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
e900: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
e910: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
e920: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
e930: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
e940: 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  mer = NULL;.    
e950: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
e960: 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20  Ptr->bio) {../* 
e970: 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53  This will call S
e980: 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67  SL_shutdown. Bug
e990: 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72   1414045 */..dpr
e9a0: 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61  intf("BIO_free_a
e9b0: 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ll(%p)", statePt
e9c0: 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72  r->bio);..BIO_fr
e9d0: 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d  ee_all(statePtr-
e9e0: 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72  >bio);..statePtr
e9f0: 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->bio = NULL;.  
ea00: 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
ea10: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70  ePtr->ssl) {..dp
ea20: 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28  rintf("SSL_free(
ea30: 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
ea40: 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28  ssl);..SSL_free(
ea50: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
ea60: 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d  .statePtr->ssl =
ea70: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
ea80: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
ea90: 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66  tx) {..SSL_CTX_f
eaa0: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ree(statePtr->ct
eab0: 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  x);..statePtr->c
eac0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  tx = NULL;.    }
ead0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
eae0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  r->callback) {..
eaf0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
eb00: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
eb10: 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ack);..statePtr-
eb20: 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c  >callback = NULL
eb30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
eb40: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
eb50: 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  rd) {..Tcl_DecrR
eb60: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
eb70: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74  ->password);..st
eb80: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
eb90: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
eba0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
ebb0: 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a  urning");.}.../*
ebc0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
ec10: 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Init --. *. *.T
ec20: 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65  his is a package
ec30: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
ec40: 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68  procedure, which
ec50: 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79   is called. *.by
ec60: 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70   Tcl when this p
ec70: 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20  ackage is to be 
ec80: 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  added to an inte
ec90: 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52  rpreter.. *. * R
eca0: 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e  esults:  Ssl con
ecb0: 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64  figured and load
ecc0: 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ed. *. * Side ef
ecd0: 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74  fects:. *. creat
ece0: 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  e the ssl comman
ecf0: 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73  d, initialize ss
ed00: 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d  l context. *. *-
ed10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed50: 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  --. */.DLLEXPORT
ed60: 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63   int Tls_Init(Tc
ed70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ed80: 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ) {.    const ch
ed90: 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  ar tlsTclInitScr
eda0: 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75  ipt[] = {.#inclu
edb0: 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09  de "tls.tcl.h"..
edc0: 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  0x00.    };..   
edd0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
ede0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
edf0: 20 2a 20 57 65 20 6f 6e 6c 79 20 73 75 70 70 6f   * We only suppo
ee00: 72 74 20 54 63 6c 20 38 2e 34 20 6f 72 20 6e 65  rt Tcl 8.4 or ne
ee10: 77 65 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  wer.     */.    
ee20: 69 66 20 28 0a 23 69 66 64 65 66 20 55 53 45 5f  if (.#ifdef USE_
ee30: 54 43 4c 5f 53 54 55 42 53 0a 09 54 63 6c 5f 49  TCL_STUBS..Tcl_I
ee40: 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
ee50: 20 22 38 2e 34 22 2c 20 30 29 0a 23 65 6c 73 65   "8.4", 0).#else
ee60: 0a 09 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65  ..Tcl_PkgRequire
ee70: 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
ee80: 22 38 2e 34 2d 22 2c 20 30 29 0a 23 65 6e 64 69  "8.4-", 0).#endi
ee90: 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f.. == NULL) {..
eea0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
eeb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
eec0: 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21  (TlsLibInit(0) !
eed0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c  = TCL_OK) {..Tcl
eee0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eef0: 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74  terp, "could not
ef00: 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20   initialize SSL 
ef10: 6c 69 62 72 61 72 79 22 2c 20 4e 55 4c 4c 29 3b  library", NULL);
ef20: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ef30: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
ef40: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
ef50: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
ef60: 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70 68  ::ciphers", Ciph
ef70: 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ersObjCmd, (Clie
ef80: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
ef90: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
efa0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
efb0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
efc0: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63  (interp, "tls::c
efd0: 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e  onnection", Conn
efe0: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
eff0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
f000: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
f010: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
f020: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
f030: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
f040: 22 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22  "tls::handshake"
f050: 2c 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  , HandshakeObjCm
f060: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
f070: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
f080: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
f090: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
f0a0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
f0b0: 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20   "tls::import", 
f0c0: 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  ImportObjCmd, (C
f0d0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
f0e0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
f0f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
f100: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
f110: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
f120: 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
f130: 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
f140: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
f150: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
f160: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
f170: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
f180: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
f190: 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73  :status", Status
f1a0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
f1b0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
f1c0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
f1d0: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
f1e0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
f1f0: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73  terp, "tls::vers
f200: 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a  ion", VersionObj
f210: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
f220: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
f230: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
f240: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
f250: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
f260: 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20  p, "tls::misc", 
f270: 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MiscObjCmd, (Cli
f280: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
f290: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
f2a0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
f2b0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
f2c0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
f2d0: 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
f2e0: 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  ocolsObjCmd, (Cl
f2f0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
f300: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
f310: 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  *) NULL);..    i
f320: 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63  f (interp) {..Tc
f330: 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  l_Eval(interp, t
f340: 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29  lsTclInitScript)
f350: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
f360: 75 72 6e 28 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn(Tcl_PkgProvi
f370: 64 65 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 22  de(interp, "tls"
f380: 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
f390: 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  N));.}../*. *---
f3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3d0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53  ---*. *. *.Tls_S
f3e0: 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  afeInit --. *. *
f3f0: 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
f400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f420: 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70  -*. *.Standard p
f430: 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65  rocedure require
f440: 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09  d by 'load'.. *.
f450: 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73  Initializes this
f460: 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61   extension for a
f470: 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
f480: 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.. *.----------
f490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f4b0: 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
f4c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
f4d0: 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  As of 'Tls_Init'
f4e0: 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
f4f0: 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63  *..A standard Tc
f500: 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  l error code.. *
f510: 0a 20 2a 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 2f 0a 44  ---------*. */.D
f550: 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
f560: 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
f570: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
f580: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
f590: 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
f5a0: 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72  n(Tls_Init(inter
f5b0: 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  p));.}../*. *---
f5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5f0: 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69  ---*. *. *.TlsLi
f600: 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  bInit --. *. *.-
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
f640: 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
f650: 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65  SSL library once
f660: 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e   per application
f670: 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f6a0: 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
f6b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e   effects:. *..in
f6c0: 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69  itializes SSL li
f6d0: 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75  brary. *. *.Resu
f6e0: 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a  lt:. *..none. *.
f6f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
f700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f720: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74  --------*. */.st
f730: 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49  atic int TlsLibI
f740: 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61  nit(int uninitia
f750: 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74  lize) {.    stat
f760: 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a  ic int initializ
f770: 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ed = 0;.    int 
f780: 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b  status = TCL_OK;
f790: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
f7a0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
f7b0: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
f7c0: 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74  EADS).    size_t
f7d0: 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64   num_locks;.#end
f7e0: 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e  if..    if (unin
f7f0: 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20  itialize) {.    
f800: 20 20 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c      if (!initial
f810: 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20  ized) {.        
f820: 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b      dprintf("Ask
f830: 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
f840: 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e  ze, but we are n
f850: 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29  ot initialized")
f860: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ;..            r
f870: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20  eturn(TCL_OK);. 
f880: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
f890: 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
f8a0: 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   to uninitialize
f8b0: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
f8c0: 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
f8d0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
f8e0: 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 20 20  _THREADS).      
f8f0: 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28    Tcl_MutexLock(
f900: 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 23 69 66 20  &init_mx);..#if 
f910: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
f920: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 30 30 30  NUMBER < 0x10000
f930: 30 30 30 4c 0a 20 20 20 20 20 20 20 20 43 52 59  000L.        CRY
f940: 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f  PTO_set_locking_
f950: 63 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a  callback(NULL);.
f960: 20 20 20 20 20 20 20 20 43 52 59 50 54 4f 5f 73          CRYPTO_s
f970: 65 74 5f 69 64 5f 63 61 6c 6c 62 61 63 6b 28 4e  et_id_callback(N
f980: 55 4c 4c 29 3b 0a 23 65 6c 69 66 20 4f 50 45 4e  ULL);.#elif OPEN
f990: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
f9a0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
f9b0: 0a 20 20 20 20 20 20 20 20 43 52 59 50 54 4f 5f  .        CRYPTO_
f9c0: 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c  set_locking_call
f9d0: 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a 20 20 20 20  back(NULL);.    
f9e0: 20 20 20 20 43 52 59 50 54 4f 5f 54 48 52 45 41      CRYPTO_THREA
f9f0: 44 49 44 5f 73 65 74 5f 63 61 6c 6c 62 61 63 6b  DID_set_callback
fa00: 28 4e 55 4c 4c 29 0a 23 65 6e 64 69 66 0a 0a 20  (NULL).#endif.. 
fa10: 20 20 20 20 20 20 20 69 66 20 28 6c 6f 63 6b 73         if (locks
fa20: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
fa30: 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 20 20 20  free(locks);.   
fa40: 20 20 20 20 20 20 20 20 20 6c 6f 63 6b 73 20 3d           locks =
fa50: 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20   NULL;.         
fa60: 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
fa70: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  0;.        }.#en
fa80: 64 69 66 0a 20 20 20 20 20 20 20 20 69 6e 69 74  dif.        init
fa90: 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69  ialized = 0;..#i
faa0: 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
fab0: 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
fac0: 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
fad0: 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d  S).        Tcl_M
fae0: 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
faf0: 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  _mx);.#endif..  
fb00: 20 20 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c        return(TCL
fb10: 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _OK);.    }..   
fb20: 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64   if (initialized
fb30: 29 20 7b 0a 20 20 20 20 20 20 20 20 64 70 72 69  ) {.        dpri
fb40: 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74  ntf("Called, but
fb50: 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61   using cached va
fb60: 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 20 20 72  lue");.        r
fb70: 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20  eturn(status);. 
fb80: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
fb90: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
fba0: 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
fbb0: 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
fbc0: 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
fbd0: 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78  S).    Tcl_Mutex
fbe0: 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  Lock(&init_mx);.
fbf0: 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69  #endif.    initi
fc00: 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66  alized = 1;..#if
fc10: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
fc20: 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
fc30: 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
fc40: 29 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ).#if OPENSSL_VE
fc50: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
fc60: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 6e  x10100000L.    n
fc70: 75 6d 5f 6c 6f 63 6b 73 20 3d 20 43 52 59 50 54  um_locks = CRYPT
fc80: 4f 5f 6e 75 6d 5f 6c 6f 63 6b 73 28 29 3b 0a 23  O_num_locks();.#
fc90: 65 6c 73 65 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63  else.    num_loc
fca0: 6b 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 20  ks = 1;.#endif. 
fcb0: 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
fcc0: 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
fcd0: 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
fce0: 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
fcf0: 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
fd00: 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
fd10: 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
fd20: 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
fd30: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  );..#if OPENSSL_
fd40: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
fd50: 20 30 78 31 30 30 30 30 30 30 30 4c 0a 20 20 20   0x10000000L.   
fd60: 20 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b   CRYPTO_set_lock
fd70: 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 43 72 79  ing_callback(Cry
fd80: 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c  ptoThreadLockCal
fd90: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 43 52 59 50  lback);.    CRYP
fda0: 54 4f 5f 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61  TO_set_id_callba
fdb0: 63 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 49  ck(CryptoThreadI
fdc0: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6c 69  dCallback);.#eli
fdd0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
fde0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
fdf0: 30 30 30 30 30 4c 0a 20 20 20 20 43 52 59 50 54  00000L.    CRYPT
fe00: 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61  O_set_locking_ca
fe10: 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72  llback(CryptoThr
fe20: 65 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 29  eadLockCallback)
fe30: 3b 0a 20 20 20 20 43 52 59 50 54 4f 5f 54 48 52  ;.    CRYPTO_THR
fe40: 45 41 44 49 44 5f 73 65 74 5f 63 61 6c 6c 62 61  EADID_set_callba
fe50: 63 6b 28 43 72 79 70 74 6f 54 68 72 65 61 64 49  ck(CryptoThreadI
fe60: 64 43 61 6c 6c 62 61 63 6b 29 0a 23 65 6e 64 69  dCallback).#endi
fe70: 66 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 4f  f.#endif..# if O
fe80: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
fe90: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
fea0: 30 30 4c 0a 20 20 20 20 69 66 20 28 53 53 4c 5f  00L.    if (SSL_
feb0: 6c 69 62 72 61 72 79 5f 69 6e 69 74 28 29 20 21  library_init() !
fec0: 3d 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 73  = 1) {.        s
fed0: 74 61 74 75 73 20 3d 20 54 43 4c 5f 45 52 52 4f  tatus = TCL_ERRO
fee0: 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  R;.        goto 
fef0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  done;.    }.#els
ff00: 65 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c  e.    /* Initial
ff10: 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70  ize BOTH libcryp
ff20: 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a  to and libssl. *
ff30: 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e  /.    OPENSSL_in
ff40: 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49  it_ssl(OPENSSL_I
ff50: 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52  NIT_LOAD_SSL_STR
ff60: 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  INGS | OPENSSL_I
ff70: 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f  NIT_LOAD_CRYPTO_
ff80: 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53  STRINGS..| OPENS
ff90: 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
ffa0: 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53  CIPHERS | OPENSS
ffb0: 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44  L_INIT_ADD_ALL_D
ffc0: 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 23  IGESTS, NULL);.#
ffd0: 65 6e 64 69 66 0a 0a 23 20 69 66 20 4f 50 45 4e  endif..# if OPEN
ffe0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
fff0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
10000 0a 20 20 20 20 53 53 4c 5f 6c 6f 61 64 5f 65 72  .    SSL_load_er
10010 72 6f 72 5f 73 74 72 69 6e 67 73 28 29 3b 0a 20  ror_strings();. 
10020 20 20 20 45 52 52 5f 6c 6f 61 64 5f 63 72 79 70     ERR_load_cryp
10030 74 6f 5f 73 74 72 69 6e 67 73 28 29 3b 0a 23 65  to_strings();.#e
10040 6c 73 65 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20  lse.    /* Only 
10050 69 6e 69 74 69 61 6c 69 7a 65 20 6c 69 62 63 72  initialize libcr
10060 79 70 74 6f 20 20 2a 2f 0a 20 20 20 20 4f 50 45  ypto  */.    OPE
10070 4e 53 53 4c 5f 69 6e 69 74 5f 63 72 79 70 74 6f  NSSL_init_crypto
10080 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f  (OPENSSL_INIT_LO
10090 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47  AD_CRYPTO_STRING
100a0 53 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  S, NULL);.#endif
100b0 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63  ..    BIO_new_tc
100c0 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66  l(NULL, 0);..#if
100d0 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   0.    /*.     *
100e0 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76   XXX:TODO: Remov
100f0 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20  e this code and 
10100 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
10110 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66  a check.     * f
10120 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70  or enough entrop
10130 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79  y and do not try
10140 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
10150 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62  wn.     * terrib
10160 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20  le entropy.     
10170 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  */.    /*.     *
10180 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   Seed the random
10190 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
101a0 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
101b0 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69  rary,.     * usi
101c0 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20  ng the do/while 
101d0 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73  construct becaus
101e0 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74  e of the bug not
101f0 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  e in the.     * 
10200 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68  OpenSSL FAQ at h
10210 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73  ttp://www.openss
10220 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61  l.org/support/fa
10230 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20  q.html#USER1.   
10240 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63    *.     * The c
10250 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c  rux of the probl
10260 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72  em is that Solar
10270 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61  is 7 does not ha
10280 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76  ve a.     * /dev
10290 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f  /random or /dev/
102a0 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73  urandom device s
102b0 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68  o it cannot gath
102c0 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a  er enough.     *
102d0 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68   entropy from th
102e0 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68  e RAND_seed() wh
102f0 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a  en TLS initializ
10300 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20  es and refuses. 
10310 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74      * to go furt
10320 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72  her. Earlier ver
10330 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c  sions of OpenSSL
10340 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61   carried on rega
10350 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a  rdless..     */.
10360 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67      srand((unsig
10370 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74  ned int) time((t
10380 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b  ime_t *) NULL));
10390 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28  .    do {..for (
103a0 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69  i = 0; i < 16; i
103b0 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73  ++) {..    rnd_s
103c0 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68  eed[i] = 1 + (ch
103d0 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e  ar) (255.0 * ran
103e0 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e  d()/(RAND_MAX+1.
103f0 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65  0));..}..RAND_se
10400 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a  ed(rnd_seed, siz
10410 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a  eof(rnd_seed));.
10420 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e      } while (RAN
10430 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29  D_status() != 1)
10440 3b 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20 4f  ;.#endif..# if O
10450 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
10460 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
10470 30 30 4c 0a 64 6f 6e 65 3a 0a 23 65 6e 64 69 66  00L.done:.#endif
10480 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
10490 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
104a0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
104b0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
104c0 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
104d0 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
104e0 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a           n(status);.}.