Hex Artifact Content

Artifact 138bbe9b6474e9609a948e8c9208fd04eb180805b63bd3125e0d22a2ff9a32ba:


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 44 48 70 61 72 61  rs, char *DHpara
0570: 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  ms);..static int
0580: 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20  .TlsLibInit(int 
0590: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a  uninitialize);..
05a0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
05b0: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65  O_SSL2..0x01.#de
05c0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
05d0: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e  SL3..0x02.#defin
05e0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
05f0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54  ..0x04.#define T
0600: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09  LS_PROTO_TLS1_1.
0610: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x08.#define TLS
0620: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78  _PROTO_TLS1_2.0x
0630: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  10.#define TLS_P
0640: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30  ROTO_TLS1_3.0x20
0650: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44  .#define ENABLED
0660: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28  (flag, mask).(((
0670: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20  flag) & (mask)) 
0680: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66  == (mask))..#def
0690: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  ine SSLKEYLOGFIL
06a0: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  E.."SSLKEYLOGFIL
06b0: 45 22 0a 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63  E"../*. * Static
06c0: 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 73   data structures
06d0: 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50  . */..#ifndef OP
06e0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63  ENSSL_NO_DH.#inc
06f0: 6c 75 64 65 20 22 64 68 5f 70 61 72 61 6d 73 2e  lude "dh_params.
0700: 68 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a  h".#endif../*. *
0710: 20 57 65 20 6c 6f 73 65 20 74 68 65 20 74 63 6c   We lose the tcl
0720: 20 70 61 73 73 77 6f 72 64 20 63 61 6c 6c 62 61   password callba
0730: 63 6b 20 77 68 65 6e 20 77 65 20 75 73 65 20 74  ck when we use t
0740: 68 65 20 52 53 41 20 42 53 41 46 45 20 53 53 4c  he RSA BSAFE SSL
0750: 2d 43 20 31 2e 31 2e 32 0a 20 2a 20 6c 69 62 72  -C 1.1.2. * libr
0760: 61 72 69 65 73 20 69 6e 73 74 65 61 64 20 6f 66  aries instead of
0770: 20 74 68 65 20 63 75 72 72 65 6e 74 20 4f 70 65   the current Ope
0780: 6e 53 53 4c 20 6c 69 62 72 61 72 69 65 73 2e 0a  nSSL libraries..
0790: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 42 53 41 46   */..#ifdef BSAF
07a0: 45 0a 23 64 65 66 69 6e 65 20 50 52 45 5f 4f 50  E.#define PRE_OP
07b0: 45 4e 53 53 4c 5f 30 5f 39 5f 34 20 31 0a 23 65  ENSSL_0_9_4 1.#e
07c0: 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 50 72 65 20  ndif../*. * Pre 
07d0: 4f 70 65 6e 53 53 4c 20 30 2e 39 2e 34 20 43 6f  OpenSSL 0.9.4 Co
07e0: 6d 70 61 74 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65  mpat. */..#ifnde
07f0: 66 20 53 54 41 43 4b 5f 4f 46 0a 23 64 65 66 69  f STACK_OF.#defi
0800: 6e 65 20 53 54 41 43 4b 5f 4f 46 28 78 29 09 09  ne STACK_OF(x)..
0810: 09 53 54 41 43 4b 0a 23 64 65 66 69 6e 65 20 73  .STACK.#define s
0820: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
0830: 28 73 6b 29 09 09 73 6b 5f 6e 75 6d 28 28 73 6b  (sk)..sk_num((sk
0840: 29 29 0a 23 64 65 66 69 6e 65 20 73 6b 5f 53 53  )).#define sk_SS
0850: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
0860: 6b 2c 20 69 6e 64 65 78 29 09 28 53 53 4c 5f 43  k, index).(SSL_C
0870: 49 50 48 45 52 2a 29 73 6b 5f 76 61 6c 75 65 28  IPHER*)sk_value(
0880: 28 73 6b 29 2c 20 28 69 6e 64 65 78 29 29 0a 23  (sk), (index)).#
0890: 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68 72  endif../*. * Thr
08a0: 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64  ead-Safe TLS Cod
08b0: 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43  e. */..#ifdef TC
08c0: 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e  L_THREADS.#defin
08d0: 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  e OPENSSL_THREAD
08e0: 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64  _DEFINES.#includ
08f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73  e <openssl/opens
0900: 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65  slconf.h>..#ifde
0910: 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  f OPENSSL_THREAD
0920: 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  S.#include <open
0930: 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 2f 2a  ssl/crypto.h>./*
0940: 20 41 64 64 65 64 20 2a 2f 0a 23 69 6e 63 6c 75   Added */.#inclu
0950: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e  de <openssl/ssl.
0960: 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64  h>../*. * Thread
0970: 65 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71  ed operation req
0980: 75 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61  uires locking ca
0990: 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64  llbacks. * Based
09a0: 20 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72   from /crypto/cr
09b0: 79 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e  yptlib.c of Open
09c0: 53 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53  SSL and NSOpenSS
09d0: 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54  L.. */..static T
09e0: 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20  cl_Mutex *locks 
09f0: 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69  = NULL;.static i
0a00: 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20  nt locksCount = 
0a10: 30 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75  0;.static Tcl_Mu
0a20: 74 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 0a 23 20  tex init_mx;..# 
0a30: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
0a40: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
0a50: 31 30 30 30 30 30 4c 0a 0a 76 6f 69 64 20 43 72  100000L..void Cr
0a60: 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61  yptoThreadLockCa
0a70: 6c 6c 62 61 63 6b 28 69 6e 74 20 6d 6f 64 65 2c  llback(int mode,
0a80: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
0a90: 61 72 20 2a 66 69 6c 65 2c 20 69 6e 74 20 6c 69  ar *file, int li
0aa0: 6e 65 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 6d  ne) {..    if (m
0ab0: 6f 64 65 20 26 20 43 52 59 50 54 4f 5f 4c 4f 43  ode & CRYPTO_LOC
0ac0: 4b 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 64 65  K) {../* This de
0ad0: 62 75 67 67 69 6e 67 20 69 73 20 74 75 72 6e 65  bugging is turne
0ae0: 64 20 6f 66 66 20 62 79 20 64 65 66 61 75 6c 74  d off by default
0af0: 20 2d 2d 20 69 74 27 73 20 74 6f 6f 20 6e 6f 69   -- it's too noi
0b00: 73 79 2e 20 2a 2f 0a 09 2f 2a 20 64 70 72 69 6e  sy. */../* dprin
0b10: 74 66 28 22 43 61 6c 6c 65 64 20 74 6f 20 6c 6f  tf("Called to lo
0b20: 63 6b 20 28 6e 3d 25 69 20 6f 66 20 25 69 29 22  ck (n=%i of %i)"
0b30: 2c 20 6e 2c 20 6c 6f 63 6b 73 43 6f 75 6e 74 29  , n, locksCount)
0b40: 3b 20 2a 2f 0a 09 54 63 6c 5f 4d 75 74 65 78 4c  ; */..Tcl_MutexL
0b50: 6f 63 6b 28 26 6c 6f 63 6b 73 5b 6e 5d 29 3b 0a  ock(&locks[n]);.
0b60: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
0b70: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
0b80: 20 74 6f 20 75 6e 6c 6f 63 6b 20 28 6e 3d 25 69   to unlock (n=%i
0b90: 20 6f 66 20 25 69 29 22 2c 20 6e 2c 20 6c 6f 63   of %i)", n, loc
0ba0: 6b 73 43 6f 75 6e 74 29 3b 20 2a 2f 0a 09 54 63  ksCount); */..Tc
0bb0: 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 6c  l_MutexUnlock(&l
0bc0: 6f 63 6b 73 5b 6e 5d 29 3b 0a 20 20 20 20 7d 0a  ocks[n]);.    }.
0bd0: 0a 20 20 20 20 2f 2a 20 64 70 72 69 6e 74 66 28  .    /* dprintf(
0be0: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 20 2a 2f  "Returning"); */
0bf0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ..    return;.  
0c00: 20 20 66 69 6c 65 20 3d 20 66 69 6c 65 3b 0a 20    file = file;. 
0c10: 20 20 20 6c 69 6e 65 20 3d 20 6c 69 6e 65 3b 0a     line = line;.
0c20: 7d 0a 0a 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  }..unsigned long
0c30: 20 43 72 79 70 74 6f 54 68 72 65 61 64 49 64 43   CryptoThreadIdC
0c40: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 29 20 7b 0a  allback(void) {.
0c50: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
0c60: 67 20 72 65 74 3b 0a 0a 20 20 20 20 64 70 72 69  g ret;..    dpri
0c70: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
0c80: 20 20 20 20 72 65 74 20 3d 20 28 75 6e 73 69 67      ret = (unsig
0c90: 6e 65 64 20 6c 6f 6e 67 29 20 54 63 6c 5f 47 65  ned long) Tcl_Ge
0ca0: 74 43 75 72 72 65 6e 74 54 68 72 65 61 64 28 29  tCurrentThread()
0cb0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0cc0: 52 65 74 75 72 6e 69 6e 67 20 25 6c 75 22 2c 20  Returning %lu", 
0cd0: 72 65 74 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ret);..    retur
0ce0: 6e 28 72 65 74 29 3b 0a 7d 0a 0a 23 65 6e 64 69  n(ret);.}..#endi
0cf0: 66 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e  f.#endif /* OPEN
0d00: 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23  SSL_THREADS */.#
0d10: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52  endif /* TCL_THR
0d20: 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 0a 20 2a  EADS */..../*. *
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d40: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61  ---. *. * InfoCa
0d80: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
0d90: 6d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e  monitors SSL con
0da0: 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a  nection process.
0db0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0dc0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
0dd0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
0de0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
0df0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 2d 2d 2d 2d   defined). *----
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
0e40: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a   */.static void.
0e50: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  InfoCallback(con
0e60: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74  st SSL *ssl, int
0e70: 20 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29   where, int ret)
0e80: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
0e90: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
0ea0: 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74  )SSL_get_app_dat
0eb0: 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20  a((SSL *)ssl);. 
0ec0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
0ed0: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61  tr;.    char *ma
0ee0: 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72  jor; char *minor
0ef0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0f00: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0f10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0f20: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0f30: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
0f40: 3b 0a 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  ;..    cmdPtr = 
0f50: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
0f60: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
0f70: 61 63 6b 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20  ack);..#if 0.   
0f80: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
0f90: 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 73 65  _CB_ALERT) {..se
0fa0: 76 20 3d 20 53 53 4c 5f 61 6c 65 72 74 5f 74 79  v = SSL_alert_ty
0fb0: 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  pe_string_long(r
0fc0: 65 74 29 3b 0a 09 69 66 20 28 73 74 72 63 6d 70  et);..if (strcmp
0fd0: 28 73 65 76 2c 20 22 66 61 74 61 6c 22 29 3d 3d  (sev, "fatal")==
0fe0: 30 29 20 7b 09 2f 2a 20 4d 61 70 20 74 6f 20 65  0) {./* Map to e
0ff0: 72 72 6f 72 20 2a 2f 0a 09 20 20 20 20 54 6c 73  rror */..    Tls
1000: 5f 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2c  _Error(statePtr,
1010: 20 53 53 4c 5f 45 52 52 4f 52 28 73 73 6c 2c 20   SSL_ERROR(ssl, 
1020: 30 29 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  0));..    return
1030: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ;..}.    }.#endi
1040: 66 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  f.    if (where 
1050: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1060: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
1070: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1080: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1090: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
10a0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
10b0: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
10c0: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
10d0: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
10e0: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
10f0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
1100: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
1110: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
1120: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
1130: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
1140: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
1150: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
1160: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1170: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1180: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1190: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
11a0: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
11b0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
11c0: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
11d0: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
11e0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
11f0: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
1200: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
1210: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1220: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
1230: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
1240: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1250: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
1260: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
1270: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1280: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1290: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
12a0: 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50  ndElement(stateP
12b0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50  tr->interp, cmdP
12c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
12d0: 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29  gObj("info", -1)
12e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
12f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1300: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1310: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1320: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1330: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1340: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1350: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1370: 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d  lement(statePtr-
1380: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1390: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13a0: 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20  j(major, -1));. 
13b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
13c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74  pendElement(stat
13d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
13e0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
13f0: 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31  ingObj(minor, -1
1400: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65  ));..    if (whe
1410: 72 65 20 26 20 28 53 53 4c 5f 43 42 5f 4c 4f 4f  re & (SSL_CB_LOO
1420: 50 7c 53 53 4c 5f 43 42 5f 45 58 49 54 29 29 20  P|SSL_CB_EXIT)) 
1430: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
1440: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74  pendElement(stat
1450: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
1460: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1470: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1480: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1490: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20 20  g(ssl), -1));.  
14a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65    } else if (whe
14b0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
14c0: 54 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72  T) {..const char
14d0: 20 2a 63 70 20 3d 20 28 63 68 61 72 20 2a 29 20   *cp = (char *) 
14e0: 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73  SSL_alert_desc_s
14f0: 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 3b  tring_long(ret);
1500: 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
1510: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 61 74  pendElement(stat
1520: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d  ePtr->interp, cm
1530: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
1540: 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29 3b  ingObj(cp, -1));
1550: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
1560: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1570: 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72  Element(statePtr
1580: 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  ->interp, cmdPtr
1590: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15a0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74  ringObj(SSL_stat
15b0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
15c0: 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  l), -1));.    }.
15d0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
15e0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
15f0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b  atePtr->interp);
1600: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
1610: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
1620: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 54  tatePtr);..    T
1630: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1640: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 28 76 6f  cmdPtr);.    (vo
1650: 69 64 29 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  id) Tcl_EvalObjE
1660: 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  x(statePtr->inte
1670: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
1680: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
1690: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
16a0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
16b0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
16c0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
16d0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
16e0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
16f0: 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  ) statePtr->inte
1700: 72 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  rp);.}.../*. *--
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1720: 2d 2d 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 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
1760: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
1770: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
1780: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
1790: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 0a 20 2a 09  ion process.. *.
17a0: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 77  This is called w
17b0: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66  henever a certif
17c0: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74  icate is inspect
17d0: 65 64 0a 20 2a 09 6f 72 20 64 65 63 69 64 65 64  ed. *.or decided
17e0: 20 69 6e 76 61 6c 69 64 2e 0a 20 2a 0a 20 2a 20   invalid.. *. * 
17f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61  Results:. *.A ca
1800: 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20  llback bound to 
1810: 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72  the socket may r
1820: 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a  eturn one of:. *
1830: 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63  .    0...- the c
1840: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65  ertificate is de
1850: 65 6d 65 64 20 69 6e 76 61 6c 69 64 0a 20 2a 09  emed invalid. *.
1860: 20 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65      1...- the ce
1870: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
1880: 6d 65 64 20 76 61 6c 69 64 0a 20 2a 09 20 20 20  med valid. *.   
1890: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09 2d 20   empty string.- 
18a0: 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63 65 72  no change to cer
18b0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
18c0: 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ion. *. * Side e
18d0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65  ffects:. *.The e
18e0: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  rr field of the 
18f0: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74  currently operat
1900: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74  ive State is set
1910: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e  . *.  to a strin
1920: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
1930: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
1940: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a   failure reason.
1950: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
19a0: 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62   int.VerifyCallb
19b0: 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39  ack(int ok, X509
19c0: 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29  _STORE_CTX *ctx)
19d0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
19e0: 63 6d 64 50 74 72 2c 20 2a 72 65 73 75 6c 74 3b  cmdPtr, *result;
19f0: 0a 20 20 20 20 63 68 61 72 20 2a 65 72 72 53 74  .    char *errSt
1a00: 72 2c 20 2a 73 74 72 69 6e 67 3b 0a 20 20 20 20  r, *string;.    
1a10: 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 20 20 20 20  int length;.    
1a20: 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28 53  SSL   *ssl..= (S
1a30: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43  SL*)X509_STORE_C
1a40: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63  TX_get_ex_data(c
1a50: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64  tx, SSL_get_ex_d
1a60: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43  ata_X509_STORE_C
1a70: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58  TX_idx());.    X
1a80: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
1a90: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
1aa0: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
1ab0: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
1ac0: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
1ad0: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
1ae0: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 69 6e 74  ta(ssl);.    int
1af0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
1b00: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
1b10: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
1b20: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
1b30: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
1b40: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 20 20 20  _error(ctx);.   
1b50: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20   int code;..    
1b60: 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a  dprintf("Verify:
1b70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20   %d", ok);..    
1b80: 69 66 20 28 21 6f 6b 29 20 7b 0a 09 65 72 72 53  if (!ok) {..errS
1b90: 74 72 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39  tr = (char*)X509
1ba0: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
1bb0: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 3b 0a  or_string(err);.
1bc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 65 72      } else {..er
1bd0: 72 53 74 72 20 3d 20 28 63 68 61 72 20 2a 29 30  rStr = (char *)0
1be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
1bf0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1c00: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1c10: 29 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74  )NULL) {..if (st
1c20: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
1c30: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
1c40: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
1c50: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
1c60: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
1c70: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
1c80: 20 20 20 20 7d 0a 20 20 20 20 63 6d 64 50 74 72      }.    cmdPtr
1c90: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
1ca0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
1cb0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63  llback);..    Tc
1cc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1cd0: 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d  lement(statePtr-
1ce0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
1cf0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1d00: 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29  j("verify", -1))
1d10: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1d20: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  jAppendElement(s
1d30: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1d40: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1d50: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
1d60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
1d70: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
1d80: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
1d90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1da0: 65 6d 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  ement(statePtr->
1db0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
1dc0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
1dd0: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
1de0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1df0: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ent(statePtr->in
1e00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
1e10: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 73 74 61  s_NewX509Obj(sta
1e20: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63  tePtr->interp, c
1e30: 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  ert));.    Tcl_L
1e40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1e50: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ent(statePtr->in
1e60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1e70: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29  l_NewIntObj(ok))
1e80: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1e90: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73  jAppendElement(s
1ea0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
1eb0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1ec0: 53 74 72 69 6e 67 4f 62 6a 28 65 72 72 53 74 72  StringObj(errStr
1ed0: 20 3f 20 65 72 72 53 74 72 20 3a 20 22 22 2c 20   ? errStr : "", 
1ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  -1));..    Tcl_P
1ef0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
1f00: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
1f10: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
1f20: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
1f30: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
1f40: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
1f50: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
1f60: 5f 43 41 4c 4c 42 41 43 4b 3b 0a 0a 20 20 20 20  _CALLBACK;..    
1f70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
1f80: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
1f90: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
1fa0: 45 78 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  Ex(statePtr->int
1fb0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c  erp, cmdPtr, TCL
1fc0: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20  _EVAL_GLOBAL);. 
1fd0: 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20 54     if (code != T
1fe0: 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 49 74 20  CL_OK) {../* It 
1ff0: 67 6f 74 20 61 6e 20 65 72 72 6f 72 20 2d 20 72  got an error - r
2000: 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66  eject the certif
2010: 69 63 61 74 65 2e 09 09 2a 2f 0a 23 69 66 20 28  icate...*/.#if (
2020: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
2030: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
2040: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
2050: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
2060: 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50 74 72  ndError(statePtr
2070: 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  ->interp);.#else
2080: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
2090: 45 78 63 65 70 74 69 6f 6e 28 73 74 61 74 65 50  Exception(stateP
20a0: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f 64 65  tr->interp, code
20b0: 29 3b 0a 23 65 6e 64 69 66 0a 09 6f 6b 20 3d 20  );.#endif..ok = 
20c0: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  0;.    } else {.
20d0: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  .result = Tcl_Ge
20e0: 74 4f 62 6a 52 65 73 75 6c 74 28 73 74 61 74 65  tObjResult(state
20f0: 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 09 73  Ptr->interp);..s
2100: 74 72 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53  tring = Tcl_GetS
2110: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 73  tringFromObj(res
2120: 75 6c 74 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 09  ult, &length);..
2130: 2f 2a 20 41 6e 20 65 6d 70 74 79 20 72 65 73 75  /* An empty resu
2140: 6c 74 20 6c 65 61 76 65 73 20 76 65 72 69 66 69  lt leaves verifi
2150: 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64  cation unchanged
2160: 2e 09 2a 2f 0a 09 69 66 20 28 73 74 72 69 6e 67  ..*/..if (string
2170: 20 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 65 6e 67   != NULL && leng
2180: 74 68 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 63  th > 0) {..    c
2190: 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 49 6e 74  ode = Tcl_GetInt
21a0: 46 72 6f 6d 4f 62 6a 28 73 74 61 74 65 50 74 72  FromObj(statePtr
21b0: 2d 3e 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  ->interp, result
21c0: 2c 20 26 6f 6b 29 3b 0a 09 20 20 20 20 69 66 20  , &ok);..    if 
21d0: 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29  (code != TCL_OK)
21e0: 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f   {.#if (TCL_MAJO
21f0: 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20  R_VERSION == 8) 
2200: 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45  && (TCL_MINOR_VE
2210: 52 53 49 4f 4e 20 3c 20 36 29 0a 09 09 54 63 6c  RSION < 6)...Tcl
2220: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
2230: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2240: 70 29 3b 0a 23 65 6c 73 65 0a 09 09 54 63 6c 5f  p);.#else...Tcl_
2250: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
2260: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ion(statePtr->in
2270: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
2280: 64 69 66 0a 09 09 6f 6b 20 3d 20 30 3b 0a 09 20  dif...ok = 0;.. 
2290: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
22a0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
22b0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
22c0: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
22d0: 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41   &= ~(TLS_TCL_CA
22e0: 4c 4c 42 41 43 4b 29 3b 0a 0a 20 20 20 20 54 63  LLBACK);..    Tc
22f0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
2300: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
2310: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
2320: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
2330: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29  tatePtr->interp)
2340: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  ;.    return(ok)
2350: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2360: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2370: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 09 2a  ion unchanged..*
2380: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20  --------------. 
23d0: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
23e0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
23f0: 6c 6c 62 61 63 6b 20 77 69 74 68 20 24 66 64 20  llback with $fd 
2400: 61 6e 64 20 24 6d 73 67 20 2d 20 73 6f 20 74 68  and $msg - so th
2410: 65 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 64  e callback can d
2420: 65 63 69 64 65 0a 20 2a 09 77 68 61 74 20 74 6f  ecide. *.what to
2430: 20 64 6f 20 77 69 74 68 20 65 72 72 6f 72 73 2e   do with errors.
2440: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2450: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20  cts:. *.The err 
2460: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
2470: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65  rently operative
2480: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a   State is set. *
2490: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64  .  to a string d
24a0: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53  escribing the SS
24b0: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61  L negotiation fa
24c0: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 2d  ilure reason. *-
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
24e0: 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
2520: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61  Error(State *sta
2530: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67  tePtr, char *msg
2540: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
2550: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
2560: 20 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69   code;..    dpri
2570: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
2580: 20 20 20 20 69 66 20 28 6d 73 67 20 26 26 20 2a      if (msg && *
2590: 6d 73 67 29 20 7b 0a 09 54 63 6c 5f 53 65 74 45  msg) {..Tcl_SetE
25a0: 72 72 6f 72 43 6f 64 65 28 73 74 61 74 65 50 74  rrorCode(statePt
25b0: 72 2d 3e 69 6e 74 65 72 70 2c 20 22 53 53 4c 22  r->interp, "SSL"
25c0: 2c 20 6d 73 67 2c 20 28 63 68 61 72 20 2a 29 4e  , msg, (char *)N
25d0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ULL);.    } else
25e0: 20 7b 0a 09 6d 73 67 20 3d 20 54 63 6c 5f 47 65   {..msg = Tcl_Ge
25f0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
2600: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
2610: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
2620: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  ), NULL);.    }.
2630: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
2640: 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 69 66  r = msg;..    if
2650: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
2660: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
2670: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  *)NULL) {..char 
2680: 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 09 73 70  buf[BUFSIZ];..sp
2690: 72 69 6e 74 66 28 62 75 66 2c 20 22 53 53 4c 20  rintf(buf, "SSL 
26a0: 63 68 61 6e 6e 65 6c 20 5c 22 25 73 5c 22 3a 20  channel \"%s\": 
26b0: 65 72 72 6f 72 3a 20 25 73 22 2c 0a 09 20 20 20  error: %s",..   
26c0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
26d0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
26e0: 6c 66 29 2c 20 6d 73 67 29 3b 0a 09 54 63 6c 5f  lf), msg);..Tcl_
26f0: 53 65 74 52 65 73 75 6c 74 28 73 74 61 74 65 50  SetResult(stateP
2700: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 62 75 66 2c  tr->interp, buf,
2710: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
2720: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
2730: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
2740: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
2750: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
2760: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 73 74 61  kgroundError(sta
2770: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a  tePtr->interp);.
2780: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
2790: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 73  roundException(s
27a0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c  tatePtr->interp,
27b0: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 23 65 6e   TCL_ERROR);.#en
27c0: 64 69 66 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20  dif..return;.   
27d0: 20 7d 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20   }.    cmdPtr = 
27e0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
27f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
2800: 61 63 6b 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c  ack);..    Tcl_L
2810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2820: 65 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e  ent(statePtr->in
2830: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
2840: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
2850: 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29  Obj("error", -1)
2860: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  );..    Tcl_List
2870: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2880: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72  (statePtr->inter
2890: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
28a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
28b0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
28c0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
28d0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  lf), -1));..    
28e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
28f0: 64 45 6c 65 6d 65 6e 74 28 73 74 61 74 65 50 74  dElement(statePt
2900: 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  r->interp, cmdPt
2910: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2920: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
2930: 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65  ));..    Tcl_Pre
2940: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
2950: 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  a) statePtr->int
2960: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
2970: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
2980: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
2990: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
29a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
29b0: 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61    code = Tcl_Eva
29c0: 6c 4f 62 6a 45 78 28 73 74 61 74 65 50 74 72 2d  lObjEx(statePtr-
29d0: 3e 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  >interp, cmdPtr,
29e0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
29f0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  );.    if (code 
2a00: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66  != TCL_OK) {.#if
2a10: 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53   (TCL_MAJOR_VERS
2a20: 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43  ION == 8) && (TC
2a30: 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MINOR_VERSION 
2a40: 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72  < 6)..Tcl_Backgr
2a50: 6f 75 6e 64 45 72 72 6f 72 28 73 74 61 74 65 50  oundError(stateP
2a60: 74 72 2d 3e 69 6e 74 65 72 70 29 3b 0a 23 65 6c  tr->interp);.#el
2a70: 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  se..Tcl_Backgrou
2a80: 6e 64 45 78 63 65 70 74 69 6f 6e 28 73 74 61 74  ndException(stat
2a90: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 63 6f  ePtr->interp, co
2aa0: 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  de);.#endif.    
2ab0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
2ac0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2ad0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
2ae0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
2af0: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
2b00: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
2b10: 61 74 61 29 20 73 74 61 74 65 50 74 72 2d 3e 69  ata) statePtr->i
2b20: 6e 74 65 72 70 29 3b 0a 7d 0a 0c 0a 76 6f 69 64  nterp);.}...void
2b30: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28   KeyLogCallback(
2b40: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
2b50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65  const char *line
2b60: 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74  ) {.    char *st
2b70: 72 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45  r = getenv(SSLKE
2b80: 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46  YLOGFILE);.    F
2b90: 49 4c 45 20 2a 66 64 3b 0a 20 20 20 20 69 66 20  ILE *fd;.    if 
2ba0: 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f  (str) {..fd = fo
2bb0: 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09  pen(str, "a");..
2bc0: 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c  fprintf(fd, "%s\
2bd0: 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73  n",line);..fclos
2be0: 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c  e(fd);.    }.}..
2bf0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20  ---------. *. * 
2c40: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
2c50: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64   --. *. *.Called
2c60: 20 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64   when a password
2c70: 20 69 73 20 6e 65 65 64 65 64 20 74 6f 20 75 6e   is needed to un
2c80: 70 61 63 6b 20 52 53 41 20 61 6e 64 20 50 45 4d  pack RSA and PEM
2c90: 20 6b 65 79 73 2e 0a 20 2a 09 45 76 61 6c 73 20   keys.. *.Evals 
2ca0: 61 6e 79 20 62 6f 75 6e 64 20 70 61 73 73 77 6f  any bound passwo
2cb0: 72 64 20 73 63 72 69 70 74 20 61 6e 64 20 72 65  rd script and re
2cc0: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
2cd0: 20 61 73 0a 20 2a 09 74 68 65 20 70 61 73 73 77   as. *.the passw
2ce0: 6f 72 64 20 73 74 72 69 6e 67 2e 0a 20 2a 2d 2d  ord string.. *--
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d00: 2d 2d 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 0a 20 2a 2f 0a 23 69 66 64 65 66 20 50 52 45  -. */.#ifdef PRE
2d40: 5f 4f 50 45 4e 53 53 4c 5f 30 5f 39 5f 34 0a 2f  _OPENSSL_0_9_4./
2d50: 2a 0a 20 2a 20 4e 6f 20 77 61 79 20 74 6f 20 68  *. * No way to h
2d60: 61 6e 64 6c 65 20 75 73 65 72 2d 64 61 74 61 20  andle user-data 
2d70: 74 68 65 72 65 66 6f 72 65 20 6e 6f 20 77 61 79  therefore no way
2d80: 20 77 69 74 68 6f 75 74 20 61 20 67 6c 6f 62 61   without a globa
2d90: 6c 0a 20 2a 20 76 61 72 69 61 62 6c 65 20 74 6f  l. * variable to
2da0: 20 61 63 63 65 73 73 20 74 68 65 20 54 63 6c 20   access the Tcl 
2db0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a  interpreter..*/.
2dc0: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77  static int.Passw
2dd0: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72  ordCallback(char
2de0: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c   *buf, int size,
2df0: 20 69 6e 74 20 76 65 72 69 66 79 29 20 7b 0a 20   int verify) {. 
2e00: 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 62     return -1;..b
2e10: 75 66 20 3d 20 62 75 66 3b 0a 09 73 69 7a 65 20  uf = buf;..size 
2e20: 3d 20 73 69 7a 65 3b 0a 09 76 65 72 69 66 79 20  = size;..verify 
2e30: 3d 20 76 65 72 69 66 79 3b 0a 7d 0a 23 65 6c 73  = verify;.}.#els
2e40: 65 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73  e.static int.Pas
2e50: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68  swordCallback(ch
2e60: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a  ar *buf, int siz
2e70: 65 2c 20 69 6e 74 20 76 65 72 69 66 79 2c 20 76  e, int verify, v
2e80: 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20  oid *udata) {.  
2e90: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
2ea0: 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64  r.= (State *) ud
2eb0: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  ata;.    Tcl_Int
2ec0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
2ed0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
2ee0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
2ef0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
2f00: 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  e;..    dprintf(
2f10: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
2f20: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
2f30: 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20  ssword == NULL) 
2f40: 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45  {..if (Tcl_EvalE
2f50: 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  x(interp, "tls::
2f60: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54  password", -1, T
2f70: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20  CL_EVAL_GLOBAL) 
2f80: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  == TCL_OK) {..  
2f90: 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63    char *ret = (c
2fa0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
2fb0: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
2fc0: 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79  p);..    strncpy
2fd0: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
2fe0: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20  _t) size);..    
2ff0: 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c  return (int)strl
3000: 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65  en(ret);..} else
3010: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d   {..    return -
3020: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  1;..}.    }..   
3030: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
3040: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
3050: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
3060: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
3070: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3080: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
3090: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
30a0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
30b0: 0a 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
30c0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
30d0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
30e0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
30f0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
3100: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69  L_GLOBAL);.    i
3110: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f  f (code != TCL_O
3120: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  K) {.#if (TCL_MA
3130: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
3140: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
3150: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
3160: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
3170: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
3180: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3190: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
31a0: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
31b0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
31c0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
31d0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c  r);..    Tcl_Rel
31e0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
31f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
3200: 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54 43    if (code == TC
3210: 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 2a 72  L_OK) {..char *r
3220: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3230: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3240: 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66 20 28  t(interp);..if (
3250: 73 74 72 6c 65 6e 28 72 65 74 29 20 3c 20 73 69  strlen(ret) < si
3260: 7a 65 20 2d 20 31 29 20 7b 0a 09 20 20 20 20 73  ze - 1) {..    s
3270: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
3280: 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29 3b   (size_t) size);
3290: 0a 09 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
32a0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
32b0: 6e 74 65 72 70 29 3b 0a 09 20 20 20 20 72 65 74  nterp);..    ret
32c0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  urn (int)strlen(
32d0: 72 65 74 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  ret);..}.    }. 
32e0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
32f0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3300: 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rp);.    return 
3310: 2d 31 3b 0a 09 76 65 72 69 66 79 20 3d 20 76 65  -1;..verify = ve
3320: 72 69 66 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  rify;.}.#endif..
3330: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
3380: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d  CiphersObjCmd --
3390: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
33a0: 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68  ciphers. *. *.Th
33b0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
33c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
33d0: 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70  ss the "tls::cip
33e0: 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  hers" command. *
33f0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
3400: 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65  le ciphers, base
3410: 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20  d upon protocol 
3420: 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20  selected.. *. * 
3430: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
3440: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
3450: 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69  t list.. *. * Si
3460: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
3470: 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65  onstructs and de
3480: 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65  stroys SSL conte
3490: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  -. */.static con
34f0: 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f  st char *protoco
3500: 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22  ls[] = {.."ssl2"
3510: 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22  , "ssl3", "tls1"
3520: 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73  , "tls1.1", "tls
3530: 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20  1.2", "tls1.3", 
3540: 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f  NULL.};.enum pro
3550: 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f  tocol {.    TLS_
3560: 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20  SSL2, TLS_SSL3, 
3570: 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c  TLS_TLS1, TLS_TL
3580: 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32  S1_1, TLS_TLS1_2
3590: 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c  , TLS_TLS1_3, TL
35a0: 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69  S_NONE.};..stati
35b0: 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a  c int.CiphersObj
35c0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
35d0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
35e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
35f0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
3600: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
3610: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
3620: 62 6a 50 74 72 3b 0a 20 20 20 20 53 53 4c 5f 43  bjPtr;.    SSL_C
3630: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
3640: 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e      SSL *ssl = N
3650: 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f  ULL;.    STACK_O
3660: 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73  F(SSL_CIPHER) *s
3670: 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c  k;.    char *cp,
3680: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20   buf[BUFSIZ];.  
3690: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72    int index, ver
36a0: 62 6f 73 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64  bose = 0;..    d
36b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
36c0: 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ;..    if ((objc
36d0: 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e   < 2) || (objc >
36e0: 20 33 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e   3)) {..Tcl_Wron
36f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
3700: 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f   1, objv, "proto
3710: 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f 22 29 3b  col ?verbose?");
3720: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
3730: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
3740: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
3750: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
3760: 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73  jv[1], protocols
3770: 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c  , "protocol", 0,
3780: 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f   &index) != TCL_
3790: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
37a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
37b0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32     if ((objc > 2
37c0: 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c  ) && Tcl_GetBool
37d0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
37e0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72  p, objv[2], &ver
37f0: 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  bose) != TCL_OK)
3800: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
3810: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
3820: 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72  switch ((enum pr
3830: 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a  otocol)index) {.
3840: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a  .case TLS_SSL2:.
3850: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
3860: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
3870: 31 30 31 30 31 30 30 30 4c 20 7c 7c 20 64 65 66  10101000L || def
3880: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c  ined(NO_SSL2) ||
3890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
38a0: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54  _NO_SSL2)..    T
38b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
38c0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
38d0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
38e0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
38f0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
3900: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
3910: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63  OR;.#else..    c
3920: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
3930: 28 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 29  (SSLv2_method())
3940: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
3950: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a  .case TLS_SSL3:.
3960: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
3970: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
3980: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
3990: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
39a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
39b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
39c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
39d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
39e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
39f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
3a00: 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
3a10: 43 54 58 5f 6e 65 77 28 53 53 4c 76 33 5f 6d 65  CTX_new(SSLv3_me
3a20: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
3a30: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
3a40: 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e  _TLS1:.#if defin
3a50: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
3a60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
3a70: 4f 5f 54 4c 53 31 29 0a 09 20 20 20 20 54 63 6c  O_TLS1)..    Tcl
3a80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3a90: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
3aa0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
3ab0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
3ac0: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
3ad0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3ae0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 63 74 78  ;.#else..    ctx
3af0: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54   = SSL_CTX_new(T
3b00: 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20  LSv1_method()); 
3b10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
3b20: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a  ase TLS_TLS1_1:.
3b30: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
3b40: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
3b50: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
3b60: 31 5f 31 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  1_1)..    Tcl_Ap
3b70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
3b80: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
3b90: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
3ba0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
3bb0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
3bc0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
3bd0: 65 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20  else..    ctx = 
3be0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76  SSL_CTX_new(TLSv
3bf0: 31 5f 31 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62  1_1_method()); b
3c00: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
3c10: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23  se TLS_TLS1_2:.#
3c20: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
3c30: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
3c40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
3c50: 5f 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  _2)..    Tcl_App
3c60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3c70: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
3c80: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
3c90: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
3ca0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
3cb0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
3cc0: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53  lse..    ctx = S
3cd0: 53 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31  SL_CTX_new(TLSv1
3ce0: 5f 32 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72  _2_method()); br
3cf0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
3d00: 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69  e TLS_TLS1_3:.#i
3d10: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
3d20: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
3d30: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
3d40: 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  3)..    Tcl_Appe
3d50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
3d60: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
3d70: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
3d80: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
3d90: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
3da0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
3db0: 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53  se..    ctx = SS
3dc0: 4c 5f 43 54 58 5f 6e 65 77 28 54 4c 53 5f 6d 65  L_CTX_new(TLS_me
3dd0: 74 68 6f 64 28 29 29 3b 0a 20 20 20 20 20 20 20  thod());.       
3de0: 20 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74       SSL_CTX_set
3df0: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
3e00: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
3e10: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53  ERSION);..    SS
3e20: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
3e30: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
3e40: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
3e50: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65  ;..    break;.#e
3e60: 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09  ndif..default:..
3e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3e80: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20  .    if (ctx == 
3e90: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
3ea0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3eb0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c  , REASON(), NULL
3ec0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
3ed0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
3ee0: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74  ssl = SSL_new(ct
3ef0: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  x);.    if (ssl 
3f00: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
3f10: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
3f20: 65 72 70 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  erp, REASON(), N
3f30: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
3f40: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
3f50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
3f60: 20 7d 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20   }.    objPtr = 
3f70: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
3f80: 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  , NULL);..    if
3f90: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 66   (!verbose) {..f
3fa0: 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b 20 3b  or (index = 0; ;
3fb0: 20 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20 20   index++) {..   
3fc0: 20 63 70 20 3d 20 28 63 68 61 72 2a 29 53 53 4c   cp = (char*)SSL
3fd0: 5f 67 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _get_cipher_list
3fe0: 28 73 73 6c 2c 20 69 6e 64 65 78 29 3b 0a 09 20  (ssl, index);.. 
3ff0: 20 20 20 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c     if (cp == NUL
4000: 4c 29 20 62 72 65 61 6b 3b 0a 09 20 20 20 20 54  L) break;..    T
4010: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4020: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4030: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
4040: 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29  tringObj(cp, -1)
4050: 29 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  );..}.    } else
4060: 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74   {..sk = SSL_get
4070: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 0a  _ciphers(ssl);..
4080: 09 66 6f 72 20 28 69 6e 64 65 78 20 3d 20 30 3b  .for (index = 0;
4090: 20 69 6e 64 65 78 20 3c 20 73 6b 5f 53 53 4c 5f   index < sk_SSL_
40a0: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
40b0: 69 6e 64 65 78 2b 2b 29 20 7b 0a 09 20 20 20 20  index++) {..    
40c0: 72 65 67 69 73 74 65 72 20 73 69 7a 65 5f 74 20  register size_t 
40d0: 69 3b 0a 09 20 20 20 20 53 53 4c 5f 43 49 50 48  i;..    SSL_CIPH
40e0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 73  ER_description(s
40f0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
4100: 75 65 28 73 6b 2c 20 69 6e 64 65 78 29 2c 20 62  ue(sk, index), b
4110: 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
4120: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20  ;..    for (i = 
4130: 73 74 72 6c 65 6e 28 62 75 66 29 20 2d 20 31 3b  strlen(buf) - 1;
4140: 20 69 20 3b 20 69 2d 2d 29 20 7b 0a 09 09 69 66   i ; i--) {...if
4150: 20 28 28 62 75 66 5b 69 5d 20 3d 3d 20 27 20 27   ((buf[i] == ' '
4160: 29 20 7c 7c 20 28 62 75 66 5b 69 5d 20 3d 3d 20  ) || (buf[i] == 
4170: 27 5c 6e 27 29 20 7c 7c 20 28 62 75 66 5b 69 5d  '\n') || (buf[i]
4180: 20 3d 3d 20 27 5c 72 27 29 20 7c 7c 20 28 62 75   == '\r') || (bu
4190: 66 5b 69 5d 20 3d 3d 20 27 5c 74 27 29 29 20 7b  f[i] == '\t')) {
41a0: 0a 09 09 20 20 20 20 62 75 66 5b 69 5d 20 3d 20  ...    buf[i] = 
41b0: 27 5c 30 27 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  '\0';...} else {
41c0: 0a 09 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 09  ...    break;...
41d0: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  }..    }..    Tc
41e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
41f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
4200: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
4210: 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29  ringObj(buf, -1)
4220: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20  );..}.    }.    
4230: 53 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20  SSL_free(ssl);. 
4240: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
4250: 63 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  ctx);..    Tcl_S
4260: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
4270: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
4280: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4290: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
42a0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
42b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42f0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f  ------. *. * Pro
4300: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20  tocolsObjCmd -- 
4310: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
4320: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54  rotocols. *. *.T
4330: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
4340: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
4350: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72  ess the "tls::pr
4360: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64  otocols" command
4370: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
4380: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e  lable protocols.
4390: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
43a0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
43b0: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
43c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
43d0: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4420: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4430: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  nt.ProtocolsObjC
4440: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
4450: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
4460: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
4470: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
4480: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
4490: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
44a0: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  jPtr;..    dprin
44b0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
44c0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31     if (objc != 1
44d0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
44e0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
44f0: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74   objv, "");..ret
4500: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
4510: 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72     }..    objPtr
4520: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
4530: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66  j(0, NULL);..#if
4540: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
4550: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
4560: 31 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  1000L && !define
4570: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
4580: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
4590: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
45a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
45b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
45c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
45d0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
45e0: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b  TLS_SSL2], -1));
45f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
4600: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
4610: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
4620: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 54  L_NO_SSL3).    T
4630: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4640: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4650: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
4660: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
4670: 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31  ls[TLS_SSL3], -1
4680: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
4690: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
46a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
46b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
46c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
46d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
46e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
46f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
4700: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c  ocols[TLS_TLS1],
4710: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
4720: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
4730: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
4740: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
4750: 31 5f 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_1).    Tcl_Lis
4760: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4770: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
4780: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4790: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
47a0: 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_1], -1));.
47b0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
47c0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
47d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
47e0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
47f0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4800: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4810: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
4820: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
4830: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32  ocols[TLS_TLS1_2
4840: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
4850: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
4860: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
4870: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
4880: 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c  LS1_3).    Tcl_L
4890: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
48a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
48b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
48c0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
48d0: 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29  LS_TLS1_3], -1))
48e0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
48f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
4900: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
4910: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
4920: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
4930: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
4940: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4990: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20  HandshakeObjCmd 
49a0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f  --. *. *.This co
49b0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
49c0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20   verify whether 
49d0: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73  the handshake is
49e0: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20   complete. *.or 
49f0: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  not.. *. * Resul
4a00: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
4a10: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20  d Tcl result. 1 
4a20: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20  means handshake 
4a30: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e  complete, 0 mean
4a40: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a  s pending.. *. *
4a50: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4a60: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20  *.May force SSL 
4a70: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74  negotiation to t
4a80: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a  ake place.. *. *
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4ae0: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43  nt HandshakeObjC
4af0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
4b00: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
4b10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
4b20: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
4b30: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
4b40: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
4b50: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a   chan;        /*
4b60: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
4b70: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
4b80: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
4b90: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a  tePtr;        /*
4ba0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
4bb0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
4bc0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
4bd0: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  errStr = NULL;. 
4be0: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a     int ret = 1;.
4bf0: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b      int err = 0;
4c00: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4c10: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4c20: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
4c30: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
4c40: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
4c50: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
4c60: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
4c70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
4c80: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
4c90: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
4ca0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4cb0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20  objv[1], NULL), 
4cc0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
4cd0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
4ce0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
4cf0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
4d00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
4d10: 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20      * Make sure 
4d20: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
4d30: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
4d40: 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68  l.     */.    ch
4d50: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
4d60: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
4d70: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
4d80: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
4d90: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
4da0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
4db0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4dc0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
4dd0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
4de0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22  lName(chan), "\"
4df0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
4e00: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  nel", NULL);..re
4e10: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
4e20: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
4e30: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
4e40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
4e50: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
4e60: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4e70: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46  alling Tls_WaitF
4e80: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20  orConnect");.   
4e90: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46   ret = Tls_WaitF
4ea0: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
4eb0: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20  tr, &err, 1);.  
4ec0: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57    dprintf("Tls_W
4ed0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65  aitForConnect re
4ee0: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74  turned: %i", ret
4ef0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20  );..    if (ret 
4f00: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74  < 0 && ((statePt
4f10: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
4f20: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72  CL_ASYNC) && (er
4f30: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b  r == EAGAIN))) {
4f40: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63  ..dprintf("Async
4f50: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45   set and err = E
4f60: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20  AGAIN");..ret = 
4f70: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  0;.    } else if
4f80: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 65 72   (ret < 0) {..er
4f90: 72 53 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d  rStr = statePtr-
4fa0: 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74  >err;..Tcl_Reset
4fb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
4fc0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72  .Tcl_SetErrno(er
4fd0: 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74  r);...if (!errSt
4fe0: 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d  r || (*errStr ==
4ff0: 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53   0)) {..    errS
5000: 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72  tr = Tcl_PosixEr
5010: 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a  ror(interp);..}.
5020: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
5030: 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64  lt(interp, "hand
5040: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c  shake failed: ",
5050: 20 65 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a   errStr, (char *
5060: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
5070: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
5080: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
5090: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
50a0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
50b0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
50c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
50d0: 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20   (err != 0) {.. 
50e0: 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20     dprintf("Got 
50f0: 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20  an error with a 
5100: 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68  completed handsh
5110: 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20  ake: err = %i", 
5120: 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20  err);..}..ret = 
5130: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  1;.    }..    dp
5140: 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
5150: 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74   TCL_OK with dat
5160: 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b  a \"%i\"", ret);
5170: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
5180: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
5190: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29  l_NewIntObj(ret)
51a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43  );.    return(TC
51b0: 4c 5f 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61  L_OK);..clientDa
51c0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
51d0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5220: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   * ImportObjCmd 
5230: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
5240: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
5250: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
5260: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a  e "ssl" command.
5270: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f   *. *.The ssl co
5280: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c  mmand pushes SSL
5290: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63   over a (newly c
52a0: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f  onnected) tcp so
52b0: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cket. *. * Resul
52c0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
52d0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
52e0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
52f0: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
5300: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
5310: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
5320: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5370: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a  ic int.ImportObj
5380: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
5390: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
53a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
53b0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
53c0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
53d0: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
53e0: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
53f0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
5400: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
5410: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
5420: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
5430: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
5440: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  t */.    SSL_CTX
5450: 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20   *ctx.        = 
5460: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
5470: 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20 20  j *script.      
5480: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63    = NULL;.    Tc
5490: 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09  l_Obj *password.
54a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
54b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
54c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
54d0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
54e0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
54f0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
5500: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
5510: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
5520: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20  t idx, len;.    
5530: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20  int flags..     
5540: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49     = TLS_TCL_INI
5550: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
5560: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09  r..        = 0;.
5570: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
5580: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
5590: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
55a0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20  ar *keyfile.    
55b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
55c0: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20  char *certfile. 
55d0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
55e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
55f0: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a   *key  .= NULL;.
5600: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20      int key_len 
5610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5620: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
5630: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20  d char *cert    
5640: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
5650: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20   int cert_len   
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
5670: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
5680: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
5690: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
56a0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
56b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
56c0: 41 64 69 72 09 09 20 20 20 20 20 20 20 20 3d 20  Adir..        = 
56d0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
56e0: 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 20 20  DHparams.       
56f0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
5700: 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20  r *model..      
5710: 20 20 3d 20 4e 55 4c 4c 3b 0a 23 69 66 6e 64 65    = NULL;.#ifnde
5720: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  f OPENSSL_NO_TLS
5730: 45 58 54 0a 20 20 20 20 63 68 61 72 20 2a 73 65  EXT.    char *se
5740: 72 76 65 72 6e 61 6d 65 09 20 20 20 20 20 20 20  rvername.       
5750: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74   = NULL;./* host
5760: 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20  name for Server 
5770: 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20  Name Indication 
5780: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
5790: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 23 65  alpn..= NULL;.#e
57a0: 6e 64 69 66 0a 20 20 20 20 69 6e 74 20 73 73 6c  ndif.    int ssl
57b0: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
57c0: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
57d0: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
57e0: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
57f0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
5800: 72 6f 74 6f 20 3d 20 30 3b 0a 20 20 20 20 69 6e  roto = 0;.    in
5810: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65  t verify = 0, re
5820: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65  quire = 0, reque
5830: 73 74 20 3d 20 31 3b 0a 0a 20 20 20 20 64 70 72  st = 1;..    dpr
5840: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5850: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
5860: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
5870: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
5880: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
5890: 5f 53 53 4c 32 29 20 26 26 20 64 65 66 69 6e 65  _SSL2) && define
58a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 64 65  d(NO_TLS1) && de
58b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
58c0: 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54   && defined(NO_T
58d0: 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69 6e 65  LS1_2) && define
58e0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
58f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
5900: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
5910: 53 53 4c 32 29 0a 20 20 20 20 73 73 6c 32 20 3d  SSL2).    ssl2 =
5920: 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21   1;.#endif.#if !
5930: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
5940: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 64 65 66 69  NO_SSL3) && defi
5950: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
5960: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
5970: 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f  1) && defined(NO
5980: 5f 54 4c 53 31 5f 32 29 20 26 26 20 64 65 66 69  _TLS1_2) && defi
5990: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
59a0: 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  & defined(NO_SSL
59b0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  2) && !defined(N
59c0: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 73 73 6c 33  O_SSL3).    ssl3
59d0: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 1;.#endif.#if
59e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
59f0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
5a00: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
5a10: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64    tls1 = 0;.#end
5a20: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
5a30: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
5a40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
5a50: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31  TLS1_1).    tls1
5a60: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _1 = 0;.#endif.#
5a70: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
5a80: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
5a90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
5aa0: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d  _2).    tls1_2 =
5ab0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
5ac0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
5ad0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
5ae0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
5af0: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
5b00: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
5b10: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
5b20: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
5b30: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
5b40: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
5b50: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
5b60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
5b70: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5b80: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
5b90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
5ba0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e  omObj(objv[1], N
5bb0: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ULL), NULL);.   
5bc0: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
5bd0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
5be0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
5bf0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
5c00: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20   /*.     * Make 
5c10: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
5c20: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
5c30: 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20  hannel.     */. 
5c40: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
5c50: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
5c60: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
5c70: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
5c80: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
5c90: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
5ca0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
5cb0: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a  v[idx], NULL);..
5cc0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
5cd0: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
5ce0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69 72  ..OPTSTR("-cadir
5cf0: 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54 53  ", CAdir);..OPTS
5d00: 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41  TR("-cafile", CA
5d10: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
5d20: 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72 74  -certfile", cert
5d30: 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  file);..OPTSTR("
5d40: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72  -cipher", cipher
5d50: 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f  s);..OPTOBJ("-co
5d60: 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b  mmand", script);
5d70: 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72  ..OPTSTR("-dhpar
5d80: 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b  ams", DHparams);
5d90: 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69  ..OPTSTR("-keyfi
5da0: 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09  le", keyfile);..
5db0: 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c  OPTSTR("-model",
5dc0: 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a   model);..OPTOBJ
5dd0: 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61  ("-password", pa
5de0: 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f  ssword);..OPTBOO
5df0: 4c 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65  L("-require", re
5e00: 71 75 69 72 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quire);..OPTBOOL
5e10: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71  ("-request", req
5e20: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
5e30: 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65  "-server", serve
5e40: 72 29 3b 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e  r);.#ifndef OPEN
5e50: 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 09 4f  SSL_NO_TLSEXT..O
5e60: 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61  PTSTR("-serverna
5e70: 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  me", servername)
5e80: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e  ;..OPTOBJ("-alpn
5e90: 22 2c 20 61 6c 70 6e 29 3b 0a 23 65 6e 64 69 66  ", alpn);.#endif
5ea0: 0a 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ...OPTBOOL("-ssl
5eb0: 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54 42  2", ssl2);..OPTB
5ec0: 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73 6c  OOL("-ssl3", ssl
5ed0: 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  3);..OPTBOOL("-t
5ee0: 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f 50  ls1", tls1);..OP
5ef0: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22 2c  TBOOL("-tls1.1",
5f00: 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42 4f   tls1_1);..OPTBO
5f10: 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74 6c  OL("-tls1.2", tl
5f20: 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  s1_2);..OPTBOOL(
5f30: 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31 5f  "-tls1.3", tls1_
5f40: 33 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 63  3);..OPTBYTE("-c
5f50: 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72 74  ert", cert, cert
5f60: 5f 6c 65 6e 29 3b 0a 09 4f 50 54 42 59 54 45 28  _len);..OPTBYTE(
5f70: 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79  "-key", key, key
5f80: 5f 6c 65 6e 29 3b 0a 0a 09 4f 50 54 42 41 44 28  _len);...OPTBAD(
5f90: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e  "option", "-alpn
5fa0: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c  , -cadir, -cafil
5fb0: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66  e, -cert, -certf
5fc0: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
5fd0: 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d  ommand, -dhparam
5fe0: 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c  s, -key, -keyfil
5ff0: 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73  e, -model, -pass
6000: 77 6f 72 64 2c 20 2d 72 65 71 75 69 72 65 2c 20  word, -require, 
6010: 2d 72 65 71 75 65 73 74 2c 20 2d 73 65 72 76 65  -request, -serve
6020: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
6030: 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74  -ssl2, -ssl3, -t
6040: 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74  ls1, -tls1.1, -t
6050: 6c 73 31 2e 32 2c 20 6f 72 20 2d 74 6c 73 31 2e  ls1.2, or -tls1.
6060: 33 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43  3");...return TC
6070: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6080: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09     if (request).
6090: 20 20 20 20 76 65 72 69 66 79 20 7c 3d 20 53 53      verify |= SS
60a0: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
60b0: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
60c0: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
60d0: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
60e0: 72 65 29 20 76 65 72 69 66 79 20 7c 3d 20 53 53  re) verify |= SS
60f0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
6100: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
6110: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d     if (verify ==
6120: 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53 4c   0).verify = SSL
6130: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20  _VERIFY_NONE;.. 
6140: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
6150: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  2 ? TLS_PROTO_SS
6160: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L2 : 0);.    pro
6170: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c  to |= (ssl3 ? TL
6180: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30  S_PROTO_SSL3 : 0
6190: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
61a0: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54  (tls1 ? TLS_PROT
61b0: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20  O_TLS1 : 0);.   
61c0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
61d0: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  1 ? TLS_PROTO_TL
61e0: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  S1_1 : 0);.    p
61f0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20  roto |= (tls1_2 
6200: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
6210: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _2 : 0);.    pro
6220: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20  to |= (tls1_3 ? 
6230: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
6240: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72   : 0);..    /* r
6250: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20  eset to NULL if 
6260: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f  blank string pro
6270: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20  vided */.    if 
6280: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29  (cert && !*cert)
6290: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20  ..        cert. 
62a0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
62b0: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a     if (key && !*
62c0: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65  key)..        ke
62d0: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  y.        = NULL
62e0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69  ;.    if (certfi
62f0: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65  le && !*certfile
6300: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69  )         certfi
6310: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  le.= NULL;.    i
6320: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a  f (keyfile && !*
6330: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c  keyfile)..keyfil
6340: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
6350: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ;.    if (cipher
6360: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09  s && !*ciphers).
6370: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09          ciphers.
6380: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
6390: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26      if (CAfile &
63a0: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20  & !*CAfile).    
63b0: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20      CAfile.     
63c0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
63d0: 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41  f (CAdir && !*CA
63e0: 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64  dir).        CAd
63f0: 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ir.        = NUL
6400: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  L;.    if (DHpar
6410: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d  ams && !*DHparam
6420: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72  s).        DHpar
6430: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ams        = NUL
6440: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53  L;..    /* new S
6450: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  SL state */.    
6460: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61  statePtr..= (Sta
6470: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  te *) ckalloc((u
6480: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28  nsigned) sizeof(
6490: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d  State));.    mem
64a0: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c  set(statePtr, 0,
64b0: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b   sizeof(State));
64c0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
64d0: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20  flags.= flags;. 
64e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74     statePtr->int
64f0: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp.= interp;.  
6500: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61    statePtr->vfla
6510: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20  gs.= verify;.   
6520: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d   statePtr->err.=
6530: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c   "";..    /* all
6540: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a  ocate script */.
6550: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20      if (script) 
6560: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
6570: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73  tStringFromObj(s
6580: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69  cript, &len);..i
6590: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
65a0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
65b0: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20  k = script;..   
65c0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
65d0: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
65e0: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  back);..}.    }.
65f0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
6600: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20   password */.   
6610: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b   if (password) {
6620: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
6630: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61  StringFromObj(pa
6640: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09  ssword, &len);..
6650: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
6660: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
6670: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09  rd = password;..
6680: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6690: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70  ount(statePtr->p
66a0: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20  assword);..}.   
66b0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
66c0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
66d0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
66e0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
66f0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
6700: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
6710: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
6720: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
6730: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
6740: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
6750: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
6760: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
6770: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6780: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
6790: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
67a0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
67b0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
67c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
67d0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
67e0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
67f0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
6800: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
6810: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
6820: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
6830: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
6840: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
6850: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
6860: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
6870: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
6880: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
6890: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
68a0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
68b0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74  CL_ERROR;..}..ct
68c0: 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54 63  x = ((State *)Tc
68d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
68e0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29 2d  anceData(chan))-
68f0: 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65  >ctx;.    } else
6900: 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20 43   {..if ((ctx = C
6910: 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72  TX_Init(statePtr
6920: 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c  , server, proto,
6930: 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66 69   keyfile, certfi
6940: 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 0a 09  le, key, cert,..
6950: 20 20 20 20 6b 65 79 5f 6c 65 6e 2c 20 63 65 72      key_len, cer
6960: 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41  t_len, CAdir, CA
6970: 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 44  file, ciphers, D
6980: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 28 53 53  Hparams)) == (SS
6990: 4c 5f 43 54 58 2a 29 30 29 20 7b 0a 09 20 20 20  L_CTX*)0) {..   
69a0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
69b0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
69c0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
69d0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
69e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78     statePtr->ctx
69f0: 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a   = ctx;..    /*.
6a00: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74       * We need t
6a10: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
6a20: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72   the channel wor
6a30: 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f  ks in binary (fo
6a40: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63  r the.     * enc
6a50: 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67  ryption not to g
6a60: 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20  et goofed up).. 
6a70: 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61      * We only wa
6a80: 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  nt to adjust the
6a90: 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72   buffering in pr
6aa0: 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77  e-v2 channels, w
6ab0: 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68  here.     * each
6ac0: 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20   channel in the 
6ad0: 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64  stack maintained
6ae0: 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73   its own buffers
6af0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  ..     */.    Tc
6b00: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
6b10: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
6b20: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
6b30: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
6b40: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
6b50: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
6b60: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
6b70: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
6b80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
6b90: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
6ba0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
6bb0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
6bc0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
6bd0: 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26  n, "-eofchar", &
6be0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
6bf0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  har);.    Tcl_Ge
6c00: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
6c10: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
6c20: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72  ncoding", &upper
6c30: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
6c40: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
6c50: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
6c60: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
6c70: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43  lation", &upperC
6c80: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
6c90: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  n);.    Tcl_GetC
6ca0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
6cb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
6cc0: 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  cking", &upperCh
6cd0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
6ce0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
6cf0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
6d00: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
6d10: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29  tion", "binary")
6d20: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
6d30: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
6d40: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
6d50: 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20  ing", "true");. 
6d60: 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73     dprintf("Cons
6d70: 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65  uming Tcl channe
6d80: 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  l %s", Tcl_GetCh
6d90: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29  annelName(chan))
6da0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
6db0: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b  self = Tcl_Stack
6dc0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
6dd0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
6de0: 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ), (ClientData) 
6df0: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52  statePtr, (TCL_R
6e00: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
6e10: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
6e20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
6e30: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
6e40: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
6e50: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
6e60: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
6e70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
6e80: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
6e90: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
6ea0: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
6eb0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
6ec0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
6ed0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
6ee0: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
6ef0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
6f00: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
6f10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6f20: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
6f30: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
6f40: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
6f50: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
6f60: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
6f70: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
6f80: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20  Translation));. 
6f90: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
6fa0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
6fb0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
6fc0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
6fd0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
6fe0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
6ff0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ing));.    Tcl_S
7000: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
7010: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
7020: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61  ->self, "-eofcha
7030: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
7040: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
7050: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
7060: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
7070: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
7080: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
7090: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
70a0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
70b0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
70c0: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  g));..    /*.   
70d0: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
70e0: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
70f0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
7100: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
7110: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
7120: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
7130: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
7140: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
7150: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7160: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
7170: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
7180: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53  session: ", REAS
7190: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
71a0: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28  ULL);..Tls_Free(
71b0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
71c0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
71d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 23 69  ERROR;.    }..#i
71e0: 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f  fndef OPENSSL_NO
71f0: 5f 54 4c 53 45 58 54 0a 20 20 20 20 69 66 20 28  _TLSEXT.    if (
7200: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 69  servername) {..i
7210: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65  f (!SSL_set_tlse
7220: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61  xt_host_name(sta
7230: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
7240: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69  ername) && requi
7250: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  re) {..    Tcl_A
7260: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7270: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53  rp, "setting TLS
7280: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e   host name exten
7290: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63  sion failed", (c
72a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  har *) NULL);.  
72b0: 20 20 20 20 20 20 20 20 20 20 54 6c 73 5f 46 72            Tls_Fr
72c0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
72d0: 65 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ePtr);.         
72e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
72f0: 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ROR;.        }. 
7300: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 61 6c 70     }.    if (alp
7310: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74  n) {../* Convert
7320: 20 61 20 54 63 6c 20 6c 69 73 74 20 69 6e 74 6f   a Tcl list into
7330: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74   a protocol-list
7340: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20   in wire-format 
7350: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
7360: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09  r *protos, *p;..
7370: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f  unsigned int pro
7380: 74 6f 73 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74  toslen = 0;..int
7390: 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54   i, len, cnt;..T
73a0: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 09  cl_Obj **list;..
73b0: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
73c0: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
73d0: 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26  p, alpn, &cnt, &
73e0: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  list) != TCL_OK)
73f0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
7400: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
7410: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
7420: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
7430: 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
7440: 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
7450: 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63 6f   for the protoco
7460: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28  l-list */..for (
7470: 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20  i = 0; i < cnt; 
7480: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  i++) {..    Tcl_
7490: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
74a0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
74b0: 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20  ..    if (len > 
74c0: 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  255) {...Tcl_App
74d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
74e0: 2c 20 22 61 6c 70 6e 20 70 72 6f 74 6f 63 6f 6c  , "alpn protocol
74f0: 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c   name too long",
7500: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7510: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ...Tls_Free((cha
7520: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
7530: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7540: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
7550: 70 72 6f 74 6f 73 6c 65 6e 20 2b 3d 20 31 20 2b  protoslen += 1 +
7560: 20 6c 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 42 75 69   len;..}../* Bui
7570: 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ld the complete 
7580: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
7590: 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c  ..protos = ckall
75a0: 6f 63 28 70 72 6f 74 6f 73 6c 65 6e 29 3b 0a 09  oc(protoslen);..
75b0: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  /* protocol-list
75c0: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62  s consist of 8-b
75d0: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78  it length-prefix
75e0: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73  ed, byte strings
75f0: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c   */..for (i = 0,
7600: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c   p = protos; i <
7610: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
7620: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63    char *str = Tc
7630: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
7640: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e  bj(list[i], &len
7650: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c  );..    *p++ = l
7660: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28  en;..    memcpy(
7670: 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20  p, str, len);.. 
7680: 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a     p += len;..}.
7690: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
76a0: 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73 65  unctions reverse
76b0: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
76c0: 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f  ue convention */
76d0: 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c  ..if (SSL_set_al
76e0: 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50  pn_protos(stateP
76f0: 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c  tr->ssl, protos,
7700: 20 70 72 6f 74 6f 73 6c 65 6e 29 29 20 7b 0a 09   protoslen)) {..
7710: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
7720: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 66 61  sult(interp, "fa
7730: 69 6c 65 64 20 74 6f 20 73 65 74 20 61 6c 70 6e  iled to set alpn
7740: 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68   protocols", (ch
7750: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7760: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
7770: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
7780: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f      ckfree(proto
7790: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  s);..    return 
77a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 2f  TCL_ERROR;..}../
77b0: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
77c0: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
77d0: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
77e0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 63 6b 66 72  ol-list */..ckfr
77f0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 20 20 20 20  ee(protos);.    
7800: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
7810: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
7820: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
7830: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
7840: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
7850: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
7860: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
7870: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
7880: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
7890: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
78a0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
78b0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43  back);.    SSL_C
78c0: 54 58 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  TX_set_info_call
78d0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
78e0: 74 78 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  tx, InfoCallback
78f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
7900: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49  e Tcl_Channel BI
7910: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20  O Handler */.   
7920: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
7930: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73  .= BIO_new_tcl(s
7940: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43  tatePtr, BIO_NOC
7950: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65  LOSE);.    state
7960: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e  Ptr->bio.= BIO_n
7970: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b  ew(BIO_f_ssl());
7980: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
7990: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 66  ) {..statePtr->f
79a0: 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f  lags |= TLS_TCL_
79b0: 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74  SERVER;..SSL_set
79c0: 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74  _accept_state(st
79d0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
79e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 53 53 4c 5f    } else {..SSL_
79f0: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74  set_connect_stat
7a00: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
7a10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
7a20: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72  set_bio(statePtr
7a30: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d  ->ssl, statePtr-
7a40: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72  >p_bio, statePtr
7a50: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49  ->p_bio);.    BI
7a60: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
7a70: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
7a80: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c  r->ssl, BIO_NOCL
7a90: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  OSE);..    /*.  
7aa0: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20     * End of SSL 
7ab0: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20  Init.     */.   
7ac0: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
7ad0: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  ing %s", Tcl_Get
7ae0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
7af0: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
7b00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
7b10: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
7b20: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
7b30: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
7b40: 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  lf), TCL_VOLATIL
7b50: 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  E);..    return 
7b60: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
7b70: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
7b80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
7b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7bd0: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
7be0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
7bf0: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
7c00: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
7c10: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
7c20: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
7c30: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
7c40: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
7c50: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
7c60: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
7c70: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
7c80: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
7c90: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
7ce0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
7cf0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
7d00: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
7d10: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
7d20: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
7d30: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
7d40: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
7d50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
7d60: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
7d70: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
7d80: 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69  on. */..    dpri
7d90: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
7da0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
7db0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
7dc0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
7dd0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
7de0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7df0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7e00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
7e10: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
7e20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
7e30: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
7e40: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
7e50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
7e60: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
7e70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7e80: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b     /*.     * Mak
7e90: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
7ea0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
7eb0: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f   channel.     */
7ec0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
7ed0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
7ee0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63  an);..    if (Tc
7ef0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
7f00: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
7f10: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
7f20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7f30: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
7f40: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
7f50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
7f60: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
7f70: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
7f80: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7f90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7fa0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
7fb0: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
7fc0: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
7fd0: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
7fe0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7ff0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
8000: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
8010: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
8020: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8070: 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20  . * CTX_Init -- 
8080: 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f  construct a SSL_
8090: 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a  CTX instance. *.
80a0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
80b0: 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69   valid SSL_CTX i
80c0: 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e  nstance or NULL.
80d0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
80e0: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63  cts:. *.construc
80f0: 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ts SSL context (
8100: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8150: 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58  /.static SSL_CTX
8160: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74   *.CTX_Init(Stat
8170: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74  e *statePtr, int
8180: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70   isServer, int p
8190: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66  roto, char *keyf
81a0: 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66  ile, char *certf
81b0: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65  ile,.    unsigne
81c0: 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73  d char *key, uns
81d0: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
81e0: 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69  , int key_len, i
81f0: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61  nt cert_len, cha
8200: 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68  r *CAdir,.    ch
8210: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72  ar *CAfile, char
8220: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
8230: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
8240: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
8250: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
8260: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
8270: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
8280: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
8290: 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74   ds;.    Tcl_DSt
82a0: 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e  ring ds1;.    in
82b0: 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  t off = 0;.    i
82c0: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  nt load_private_
82d0: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  key;.    const S
82e0: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
82f0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
8300: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
8310: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54  if (!proto) {..T
8320: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8330: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69  interp, "no vali
8340: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  d protocol selec
8350: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
8360: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
8370: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
8380: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74   create SSL cont
8390: 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ext */.#if OPENS
83a0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
83b0: 52 20 3e 3d 20 30 78 31 30 31 30 31 30 30 30 4c  R >= 0x10101000L
83c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   || defined(NO_S
83d0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL2) || defined(
83e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
83f0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
8400: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
8410: 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL2)) {..Tcl_
8420: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8430: 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f  erp, "SSL2 proto
8440: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
8450: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
8460: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
8470: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
8480: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c  f defined(NO_SSL
8490: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
84a0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20  ENSSL_NO_SSL3). 
84b0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
84c0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
84d0: 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  SSL3)) {..Tcl_Ap
84e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
84f0: 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f  p, "SSL3 protoco
8500: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
8510: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
8520: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20   (SSL_CTX *)0;. 
8530: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
8540: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
8550: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
8560: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
8570: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
8580: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
8590: 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  S1)) {..Tcl_Appe
85a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
85b0: 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63   "TLS 1.0 protoc
85c0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
85d0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
85e0: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
85f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
8600: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
8610: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
8620: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
8630: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
8640: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
8650: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
8660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8670: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
8680: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
8690: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
86a0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
86b0: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e  X *)0;.    }.#en
86c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
86d0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
86e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
86f0: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20  _TLS1_2).    if 
8700: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
8710: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
8720: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
8730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8740: 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c  TLS 1.2 protocol
8750: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
8760: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
8770: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
8780: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
8790: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
87a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
87b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
87c0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
87d0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
87e0: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
87f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8800: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
8810: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
8820: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
8830: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
8840: 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  *)0;.    }.#endi
8850: 66 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  f..    switch (p
8860: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
8870: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
8880: 45 52 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c  ER < 0x10101000L
8890: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
88a0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
88b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
88c0: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
88d0: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
88e0: 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68  hod = SSLv2_meth
88f0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
8900: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8910: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
8920: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8930: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65  O_SSL3).    case
8940: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a   TLS_PROTO_SSL3:
8950: 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33  ..method = SSLv3
8960: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
8970: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
8980: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
8990: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
89a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
89b0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
89c0: 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  TLS1:..method = 
89d0: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 0a  TLSv1_method();.
89e0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
89f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8a00: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
8a10: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8a20: 53 31 5f 31 29 0a 20 20 20 20 63 61 73 65 20 54  S1_1).    case T
8a30: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a  LS_PROTO_TLS1_1:
8a40: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31  ..method = TLSv1
8a50: 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  _1_method();..br
8a60: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
8a70: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8a80: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
8a90: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8aa0: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
8ab0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d  PROTO_TLS1_2:..m
8ac0: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f  ethod = TLSv1_2_
8ad0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
8ae0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8af0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
8b00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8b10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
8b20: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
8b30: 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 0a 09  TO_TLS1_3:../*..
8b40: 20 2a 20 54 68 65 20 76 65 72 73 69 6f 6e 20 72   * The version r
8b50: 61 6e 67 65 20 69 73 20 63 6f 6e 73 74 72 61 69  ange is constrai
8b60: 6e 65 64 20 62 65 6c 6f 77 2c 0a 09 20 2a 20 61  ned below,.. * a
8b70: 66 74 65 72 20 74 68 65 20 63 6f 6e 74 65 78 74  fter the context
8b80: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 55 73   is created.  Us
8b90: 65 20 74 68 65 0a 09 20 2a 20 67 65 6e 65 72 69  e the.. * generi
8ba0: 63 20 6d 65 74 68 6f 64 20 68 65 72 65 2e 0a 09  c method here...
8bb0: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c   */..method = TL
8bc0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  S_method();..bre
8bd0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
8be0: 65 66 61 75 6c 74 3a 0a 23 69 66 20 4f 50 45 4e  efault:.#if OPEN
8bf0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
8c00: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30  ER >= 0x10100000
8c10: 4c 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  L../* Negotiate 
8c20: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
8c30: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
8c40: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 54  n */..method = T
8c50: 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 65 6c  LS_method();.#el
8c60: 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20 53 53 4c  se..method = SSL
8c70: 76 32 33 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 65  v23_method();.#e
8c80: 6e 64 69 66 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ndif.#if OPENSSL
8c90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
8ca0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
8cb0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8cc0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
8cd0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
8ce0: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
8cf0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
8d00: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
8d10: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
8d20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8d30: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
8d40: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8d50: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
8d60: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
8d70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
8d80: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
8d90: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
8da0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8db0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
8dc0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8dd0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
8de0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
8df0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
8e00: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
8e10: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
8e20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8e30: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
8e40: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8e50: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
8e60: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
8e70: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
8e80: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
8e90: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
8ea0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
8eb0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
8ec0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8ed0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
8ee0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
8ef0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
8f00: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
8f10: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
8f20: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8f30: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
8f40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8f50: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
8f60: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
8f70: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
8f80: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
8f90: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
8fa0: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
8fb0: 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20     }..    ctx = 
8fc0: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
8fd0: 6f 64 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 63  od);..    if (!c
8fe0: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55  tx) {..return(NU
8ff0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
9000: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
9010: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
9020: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
9030: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
9040: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
9050: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
9060: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
9070: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
9080: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9090: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
90a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
90b0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
90c0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
90d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
90e0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
90f0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
9100: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
9110: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 0a 09 69  _3_VERSION);...i
9120: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a  f (!isServer) {.
9130: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
9140: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
9150: 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56  L_OP_CIPHER_SERV
9160: 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a  ER_PREFERENCE);.
9170: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
9180: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
9190: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
91a0: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
91b0: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
91c0: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
91d0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
91e0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
91f0: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
9200: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
9210: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
9220: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
9230: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73  x, off);../* dis
9240: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65  able protocol ve
9250: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50  rsions */.#if OP
9260: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
9270: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30  MBER < 0x1010100
9280: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  0L.    SSL_CTX_s
9290: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c  et_mode(ctx, SSL
92a0: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59  _MODE_AUTO_RETRY
92b0: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77  );./* handle new
92c0: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62   handshakes in b
92d0: 61 63 6b 67 72 6f 75 6e 64 20 2a 2f 0a 23 65 6e  ackground */.#en
92e0: 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  dif.    SSL_CTX_
92f0: 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f 73  sess_set_cache_s
9300: 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a  ize(ctx, 128);..
9310: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20      if (ciphers 
9320: 21 3d 20 4e 55 4c 4c 29 0a 09 53 53 4c 5f 43 54  != NULL)..SSL_CT
9330: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  X_set_cipher_lis
9340: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 3b  t(ctx, ciphers);
9350: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
9360: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
9370: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
9380: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
9390: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
93a0: 6c 6c 62 61 63 6b 29 3b 0a 0a 23 69 66 6e 64 65  llback);..#ifnde
93b0: 66 20 42 53 41 46 45 0a 20 20 20 20 53 53 4c 5f  f BSAFE.    SSL_
93c0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
93d0: 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61  passwd_cb_userda
93e0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  ta(ctx, (void *)
93f0: 73 74 61 74 65 50 74 72 29 3b 0a 23 65 6e 64 69  statePtr);.#endi
9400: 66 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 61  f..    /* read a
9410: 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20   Diffie-Hellman 
9420: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 2c  parameters file,
9430: 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69 6c   or use the buil
9440: 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66 64  t-in one */.#ifd
9450: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48  ef OPENSSL_NO_DH
9460: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
9470: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  s != NULL) {..Tc
9480: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9490: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d  nterp, "DH param
94a0: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74  eter support not
94b0: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68   available", (ch
94c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
94d0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
94e0: 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
94f0: 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23 65 6c  X *)0;.    }.#el
9500: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68  se.    {..DH* dh
9510: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20  ;..if (DHparams 
9520: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
9530: 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54  BIO *bio;..    T
9540: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
9550: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20  ds);..    bio = 
9560: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e  BIO_new_file(F2N
9570: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c  (DHparams, &ds),
9580: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28   "r");..    if (
9590: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53  !bio) {...Tcl_DS
95a0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
95b0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
95c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
95d0: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61  d not find DH pa
95e0: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20  rameters file", 
95f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
9600: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
9610: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53  tx);...return (S
9620: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20  SL_CTX *)0;..   
9630: 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45   }...    dh = PE
9640: 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72  M_read_bio_DHpar
9650: 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e  ams(bio, NULL, N
9660: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ULL, NULL);..   
9670: 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a   BIO_free(bio);.
9680: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9690: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
96a0: 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c  if (!dh) {...Tcl
96b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
96c0: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
96d0: 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74   read DH paramet
96e0: 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20  ers from file", 
96f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
9700: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
9710: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53  tx);...return (S
9720: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20  SL_CTX *)0;..   
9730: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20   }..} else {..  
9740: 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72    dh = get_dhPar
9750: 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43  ams();..}..SSL_C
9760: 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74  TX_set_tmp_dh(ct
9770: 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65  x, dh);..DH_free
9780: 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  (dh);.    }.#end
9790: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f  if..    /* set o
97a0: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  ur certificate *
97b0: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61  /.    load_priva
97c0: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  te_key = 0;.    
97d0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20  if (certfile != 
97e0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
97f0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a  ivate_key = 1;..
9800: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74  .Tcl_DStringInit
9810: 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c  (&ds);...if (SSL
9820: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
9830: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46  cate_file(ctx, F
9840: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73  2N(certfile, &ds
9850: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
9860: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
9870: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
9880: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
9890: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
98a0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
98b0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
98c0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
98d0: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20  e, ": ",....    
98e0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
98f0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
9900: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
9910: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
9920: 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a  SSL_CTX *)0;..}.
9930: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
9940: 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ert != NULL) {..
9950: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
9960: 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43   = 1;..if (SSL_C
9970: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
9980: 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72  te_ASN1(ctx, cer
9990: 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20  t_len, cert) <= 
99a0: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53  0) {..    Tcl_DS
99b0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
99c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
99d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
99e0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72  nable to set cer
99f0: 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 09  tificate: ",....
9a00: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
9a10: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
9a20: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
9a30: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
9a40: 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b  rn (SSL_CTX *)0;
9a50: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
9a60: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68  ..certfile = (ch
9a70: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66  ar*)X509_get_def
9a80: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29  ault_cert_file()
9a90: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
9aa0: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
9ab0: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69  file(ctx, certfi
9ac0: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  le, SSL_FILETYPE
9ad0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69  _PEM) <= 0) {.#i
9ae0: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  f 0..    Tcl_DSt
9af0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
9b00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9b10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
9b20: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
9b30: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
9b40: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
9b50: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
9b60: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
9b70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
9b80: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
9b90: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53  ;..    return (S
9ba0: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64  SL_CTX *)0;.#end
9bb0: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  if..}.    }..   
9bc0: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76   /* set our priv
9bd0: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  ate key */.    i
9be0: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  f (load_private_
9bf0: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66  key) {..if (keyf
9c00: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b  ile == NULL && k
9c10: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey == NULL) {.. 
9c20: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72     keyfile = cer
9c30: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28  tfile;..}...if (
9c40: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  keyfile != NULL)
9c50: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74   {..    /* get t
9c60: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61  he private key a
9c70: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9c80: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
9c90: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66  */..    if (keyf
9ca0: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
9cb0: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66  .keyfile = certf
9cc0: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ile;..    }...  
9cd0: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
9ce0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c  e_PrivateKey_fil
9cf0: 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69  e(ctx, F2N(keyfi
9d00: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
9d10: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
9d20: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
9d30: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a  gFree(&ds);.../*
9d40: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
9d50: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
9d60: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
9d70: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
9d80: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
9d90: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
9da0: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
9db0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9dc0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
9dd0: 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20  public key file 
9de0: 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c  ", keyfile, " ",
9df0: 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45 41  ....         REA
9e00: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
9e10: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
9e20: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
9e30: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
9e40: 30 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  0;..    }..    T
9e50: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
9e60: 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66  ds);...} else if
9e70: 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b   (key != NULL) {
9e80: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54  ..    if (SSL_CT
9e90: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
9ea0: 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52  _ASN1(EVP_PKEY_R
9eb0: 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79  SA, ctx, key,key
9ec0: 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _len) <= 0) {...
9ed0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
9ee0: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
9ef0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
9f00: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
9f10: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
9f20: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
9f30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
9f40: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
9f50: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
9f60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
9f70: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
9f80: 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28   key: ", REASON(
9f90: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
9fa0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
9fb0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
9fc0: 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09   (SSL_CTX *)0;..
9fd0: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77      }..}../* Now
9fe0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
9ff0: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76  key and cert hav
a000: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e  e been set again
a010: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63  st.. * the SSL c
a020: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21  ontext */..if (!
a030: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72  SSL_CTX_check_pr
a040: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20  ivate_key(ctx)) 
a050: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a060: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a070: 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65  "private key doe
a080: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
a090: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c  certificate publ
a0a0: 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20  ic key",....    
a0b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a0c0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
a0d0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
a0e0: 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29  turn (SSL_CTX *)
a0f0: 30 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  0;..}.    }..   
a100: 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61   /* Set verifica
a110: 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20  tion CAs */.    
a120: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
a130: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  &ds);.    Tcl_DS
a140: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
a150: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
a160: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f  X_load_verify_lo
a170: 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e  cations(ctx, F2N
a180: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20 46  (CAfile, &ds), F
a190: 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29 29  2N(CAdir, &ds1))
a1a0: 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65   ||..!SSL_CTX_se
a1b0: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79  t_default_verify
a1c0: 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a 23  _paths(ctx)) {.#
a1d0: 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e  if 0..Tcl_DStrin
a1e0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63 6c  gFree(&ds);..Tcl
a1f0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
a200: 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75  1);../* Don't cu
a210: 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66 20  rrently care if 
a220: 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54  this fails */..T
a230: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a240: 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65 66  interp, "SSL def
a250: 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74 68  ault verify path
a260: 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  s: ", REASON(), 
a270: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
a280: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
a290: 78 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c  x);..return (SSL
a2a0: 5f 43 54 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66  _CTX *)0;.#endif
a2b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68  .    }..    /* h
a2c0: 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72  ttps://sourcefor
a2d0: 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67  ge.net/p/tls/bug
a2e0: 73 2f 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20  s/57/ */.    /* 
a2f0: 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68  XXX:TODO: Let th
a300: 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61  e user supply va
a310: 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61  lues here instea
a320: 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74  d of something t
a330: 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68  hat exists on th
a340: 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  e filesystem */.
a350: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 21      if (CAfile !
a360: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b  = NULL) {..STACK
a370: 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
a380: 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f  certNames = SSL_
a390: 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66  load_client_CA_f
a3a0: 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20  ile(F2N(CAfile, 
a3b0: 26 64 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74  &ds));..if (cert
a3c0: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
a3d0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
a3e0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
a3f0: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
a400: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
a410: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
a420: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  &ds);.    Tcl_DS
a430: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b  tringFree(&ds1);
a440: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b  .    return ctx;
a450: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
a460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
a4a0: 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  . * StatusObjCmd
a4b0: 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69   -- return certi
a4c0: 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65  ficate for conne
a4d0: 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a  cted peer.. *. *
a4e0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
a4f0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
a500: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
a510: 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
a520: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
a530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
a570: 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
a580: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
a590: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
a5a0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a5b0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
a5c0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
a5d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
a5e0: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
a5f0: 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
a600: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
a610: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
a620: 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
a630: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
a640: 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
a650: 65 3b 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  e;.#ifndef OPENS
a660: 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20  SL_NO_TLSEXT.   
a670: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
a680: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
a690: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
a6a0: 6e 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 64  n;.#endif..    d
a6b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
a6c0: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 6f  ;..    switch (o
a6d0: 62 6a 63 29 20 7b 0a 09 63 61 73 65 20 32 3a 0a  bjc) {..case 2:.
a6e0: 09 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65  .    channelName
a6f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
a700: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
a710: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
a720: 61 6b 3b 0a 0a 09 63 61 73 65 20 33 3a 0a 09 20  ak;...case 3:.. 
a730: 20 20 20 69 66 20 28 21 73 74 72 63 6d 70 20 28     if (!strcmp (
a740: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 20 28 6f  Tcl_GetString (o
a750: 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c  bjv[1]), "-local
a760: 22 29 29 20 7b 0a 09 09 63 68 61 6e 6e 65 6c 4e  ")) {...channelN
a770: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
a780: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a790: 32 5d 2c 20 4e 55 4c 4c 29 3b 0a 09 09 62 72 65  2], NULL);...bre
a7a0: 61 6b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ak;..    }..    
a7b0: 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 2d 74 68 72  /* else fall-thr
a7c0: 6f 75 67 68 20 2e 2e 2e 20 2a 2f 0a 23 69 66 20  ough ... */.#if 
a7d0: 64 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f  defined(__GNUC__
a7e0: 29 0a 09 20 20 20 20 5f 5f 61 74 74 72 69 62 75  )..    __attribu
a7f0: 74 65 5f 5f 28 28 66 61 6c 6c 74 68 72 6f 75 67  te__((fallthroug
a800: 68 29 29 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  h));.#endif..def
a810: 61 75 6c 74 3a 0a 09 20 20 20 20 54 63 6c 5f 57  ault:..    Tcl_W
a820: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
a830: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
a840: 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29  local? channel")
a850: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a860: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
a870: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
a880: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
a890: 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26  , channelName, &
a8a0: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  mode);.    if (c
a8b0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
a8c0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
a8d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8e0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 0a 20 20 20      }.    /*.   
a8f0: 20 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f    * Make sure to
a900: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
a910: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
a920: 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e       */.    chan
a930: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a940: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
a950: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
a960: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
a970: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
a980: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
a990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a9a0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
a9b0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
a9c0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
a9d0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
a9e0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  nel", NULL);..re
a9f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
aa00: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
aa10: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54  tr = (State *) T
aa20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
aa30: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
aa40: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
aa50: 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53   2) {..peer = SS
aa60: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69  L_get_peer_certi
aa70: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
aa80: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
aa90: 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  e {..peer = SSL_
aaa0: 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28  get_certificate(
aab0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
aac0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 65      }.    if (pe
aad0: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
aae0: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
aaf0: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
ab00: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 20  f (objc == 2) { 
ab10: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b  X509_free(peer);
ab20: 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
ab30: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
ab40: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
ab50: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  );.    }..    Tc
ab60: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
ab70: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
ab80: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
ab90: 72 69 6e 67 4f 62 6a 28 22 73 62 69 74 73 22 2c  ringObj("sbits",
aba0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
abb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
abc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
abd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
abe0: 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  j(SSL_get_cipher
abf0: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
ac00: 73 73 6c 2c 20 4e 55 4c 4c 29 29 29 3b 0a 0a 20  ssl, NULL)));.. 
ac10: 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68     ciphers = (ch
ac20: 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68  ar*)SSL_get_ciph
ac30: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  er(statePtr->ssl
ac40: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  );.    if ((ciph
ac50: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
ac60: 28 73 74 72 63 6d 70 28 63 69 70 68 65 72 73 2c  (strcmp(ciphers,
ac70: 20 22 28 4e 4f 4e 45 29 22 29 20 21 3d 20 30 29   "(NONE)") != 0)
ac80: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
ac90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
aca0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
acb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
acc0: 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09  cipher", -1));..
acd0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ace0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
acf0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
ad00: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65  StringObj(SSL_ge
ad10: 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74  t_cipher(statePt
ad20: 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 20  r->ssl), -1));. 
ad30: 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 50     }..#ifndef OP
ad40: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a  ENSSL_NO_TLSEXT.
ad50: 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68      /* Report th
ad60: 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
ad70: 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
ad80: 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69  of the negotiati
ad90: 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65  on */.    SSL_ge
ada0: 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
adb0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
adc0: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20  &proto, &len);. 
add0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
ade0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
adf0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
ae00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
ae10: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
ae20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ae30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
ae40: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
ae50: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
ae60: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e  )proto, (int)len
ae70: 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 54  ));.#endif.    T
ae80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
ae90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
aea0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
aeb0: 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 73 69 6f  tringObj("versio
aec0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
aed0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
aee0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
aef0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
af00: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f  ringObj(SSL_get_
af10: 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72  version(statePtr
af20: 2d 3e 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20  ->ssl), -1));.. 
af30: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
af40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
af50: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
af60: 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44  TCL_OK;..clientD
af70: 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61  ata = clientData
af80: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
af90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
afc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
afd0: 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  *. * ConnectionI
afe0: 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  nfoObjCmd -- ret
aff0: 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  urn connection i
b000: 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  nfo from OpenSSL
b010: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
b020: 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f  . *.A list of co
b030: 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20  nnection info.  
b040: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
b050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b080: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
b090: 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69  tic int Connecti
b0a0: 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69  onInfoObjCmd(Cli
b0b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
b0c0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
b0d0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
b0e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
b0f0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
b100: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
b110: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
b120: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
b130: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
b140: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
b150: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
b160: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
b170: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
b180: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
b190: 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
b1a0: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
b1b0: 68 65 72 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e  her;..#if !defin
b1c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
b1d0: 53 45 58 54 29 20 26 26 20 4f 50 45 4e 53 53 4c  SEXT) && OPENSSL
b1e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
b1f0: 3e 3d 20 30 78 31 30 30 30 32 30 30 30 4c 0a 20  >= 0x10002000L. 
b200: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
b210: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20  d char *proto;. 
b220: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
b230: 6c 65 6e 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  len;.#endif.#if 
b240: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 53 4c  defined(HAVE_SSL
b250: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 20 26 26  _COMPRESSION) &&
b260: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
b270: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 30  _NUMBER >= 0x100
b280: 30 32 30 30 30 4c 0a 20 20 20 20 63 6f 6e 73 74  02000L.    const
b290: 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f   COMP_METHOD *co
b2a0: 6d 70 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  mp;.#endif..    
b2b0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
b2c0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
b2d0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
b2e0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
b2f0: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
b300: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  R);.    }..    c
b310: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
b320: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
b330: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
b340: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
b350: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
b360: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
b370: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
b380: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
b390: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
b3a0: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72  .     * Make sur
b3b0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
b3c0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
b3d0: 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nel.     */.    
b3e0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
b3f0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
b400: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
b410: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
b420: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
b430: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
b440: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b450: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
b460: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
b470: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 22  nelName(chan), "
b480: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
b490: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
b4a0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
b4b0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  );.    }..    ob
b4c0: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
b4d0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
b4e0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 6f 6e 6e  .    /* Get conn
b4f0: 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a  ection state */.
b500: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
b510: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
b520: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
b530: 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
b540: 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
b550: 6c 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  l;.    Tcl_ListO
b560: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b570: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
b580: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b590: 28 22 73 74 61 74 65 22 2c 20 2d 31 29 29 3b 0a  ("state", -1));.
b5a0: 20 20 20 20 69 66 20 28 53 53 4c 5f 69 73 5f 69      if (SSL_is_i
b5b0: 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c  nit_finished(ssl
b5c0: 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  )) {..Tcl_ListOb
b5d0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
b5e0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
b5f0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b600: 22 65 73 74 61 62 6c 69 73 68 65 64 22 2c 20 2d  "established", -
b610: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
b620: 69 66 20 28 53 53 4c 5f 69 6e 5f 69 6e 69 74 28  if (SSL_in_init(
b630: 73 73 6c 29 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  ssl)) {..Tcl_Lis
b640: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b650: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
b660: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b670: 62 6a 28 22 68 61 6e 64 73 68 61 6b 65 22 2c 20  bj("handshake", 
b680: 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  -1));.    } else
b690: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
b6a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
b6b0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
b6c0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69  _NewStringObj("i
b6d0: 6e 69 74 69 61 6c 69 7a 69 6e 67 22 2c 20 2d 31  nitializing", -1
b6e0: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
b6f0: 2a 20 47 65 74 20 73 65 72 76 65 72 20 6e 61 6d  * Get server nam
b700: 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  e */.    Tcl_Lis
b710: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b720: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
b730: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b740: 62 6a 28 22 73 65 72 76 65 72 22 2c 20 2d 31 29  bj("server", -1)
b750: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
b760: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b770: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
b780: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b790: 28 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e  (SSL_get_servern
b7a0: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
b7b0: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
b7c0: 6d 65 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  me), -1));..    
b7d0: 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20  /* Get protocol 
b7e0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
b7f0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b800: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
b810: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b820: 28 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 2d 31 29  ("protocol", -1)
b830: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
b840: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b850: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
b860: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b870: 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e  (SSL_get_version
b880: 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (ssl), -1));..  
b890: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20    /* Get cipher 
b8a0: 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20  */.    cipher = 
b8b0: 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
b8c0: 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20  cipher(ssl);.   
b8d0: 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e   if (cipher != N
b8e0: 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
b8f0: 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a  [BUFSIZ] = {0};.
b900: 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62  .int bits, alg_b
b910: 69 74 73 3b 0a 0a 09 54 63 6c 5f 4c 69 73 74 4f  its;...Tcl_ListO
b920: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b930: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
b940: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
b950: 28 22 63 69 70 68 65 72 22 2c 20 2d 31 29 29 3b  ("cipher", -1));
b960: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
b970: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
b980: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
b990: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
b9a0: 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
b9b0: 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 09  cipher), -1));..
b9c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
b9d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
b9e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
b9f0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61 6e 64  StringObj("stand
ba00: 61 72 64 5f 6e 61 6d 65 22 2c 20 2d 31 29 29 3b  ard_name", -1));
ba10: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
ba20: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ba30: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
ba40: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
ba50: 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f  CIPHER_standard_
ba60: 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
ba70: 29 29 3b 0a 0a 09 62 69 74 73 20 3d 20 53 53 4c  ));...bits = SSL
ba80: 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73  _CIPHER_get_bits
ba90: 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69  (cipher, &alg_bi
baa0: 74 73 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ts);..Tcl_ListOb
bab0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
bac0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
bad0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
bae0: 22 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54  "bits", -1));..T
baf0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
bb00: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
bb10: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
bb20: 6e 74 4f 62 6a 28 62 69 74 73 29 29 3b 0a 09 54  ntObj(bits));..T
bb30: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
bb40: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
bb50: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
bb60: 74 72 69 6e 67 4f 62 6a 28 22 73 65 63 72 65 74  tringObj("secret
bb70: 5f 62 69 74 73 22 2c 20 2d 31 29 29 3b 0a 09 54  _bits", -1));..T
bb80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
bb90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
bba0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49  objPtr, Tcl_NewI
bbb0: 6e 74 4f 62 6a 28 61 6c 67 5f 62 69 74 73 29 29  ntObj(alg_bits))
bbc0: 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69  ;../* alg_bits i
bbd0: 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63  s actual key sec
bbe0: 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65  ret bits. If use
bbf0: 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74   bits and secret
bc00: 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74   (algorithm) bit
bc10: 73 20 64 69 66 66 65 72 2c 0a 20 20 20 20 20 20  s differ,.      
bc20: 20 20 20 20 20 74 68 65 20 72 65 73 74 20 6f 66       the rest of
bc30: 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69   the bits are fi
bc40: 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69  xed, i.e. for li
bc50: 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70  mited export cip
bc60: 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29  hers (bits < 56)
bc70: 20 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a   */..Tcl_ListObj
bc80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
bc90: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
bca0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
bcb0: 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 2d 31  min_version", -1
bcc0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
bcd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
bce0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
bcf0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
bd00: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
bd10: 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
bd20: 31 29 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  1));...if (SSL_C
bd30: 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
bd40: 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73  n(cipher, buf, s
bd50: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
bd60: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
bd70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
bd80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
bd90: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
bda0: 6e 67 4f 62 6a 28 22 64 65 73 63 72 69 70 74 69  ngObj("descripti
bdb0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20  on", -1));..    
bdc0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
bdd0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
bde0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
bdf0: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d  StringObj(buf, -
be00: 31 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  1));..}.    }.. 
be10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
be20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
be30: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
be40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72 65  NewStringObj("re
be50: 6e 65 67 6f 74 69 61 74 69 6f 6e 22 2c 20 2d 31  negotiation", -1
be60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
be70: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
be80: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
be90: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
bea0: 6a 28 0a 09 53 53 4c 5f 67 65 74 5f 73 65 63 75  j(..SSL_get_secu
beb0: 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e  re_renegotiation
bec0: 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 20 3f 20  _support(ssl) ? 
bed0: 22 61 6c 6c 6f 77 65 64 22 20 3a 20 22 64 69 73  "allowed" : "dis
bee0: 61 6c 6c 6f 77 65 64 22 2c 20 2d 31 29 29 3b 0a  allowed", -1));.
bef0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50  .#if !defined(OP
bf00: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 29  ENSSL_NO_TLSEXT)
bf10: 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53   && OPENSSL_VERS
bf20: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
bf30: 31 30 30 30 32 30 30 30 4c 0a 20 20 20 20 2f 2a  10002000L.    /*
bf40: 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
bf50: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
bf60: 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
bf70: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
bf80: 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
bf90: 6e 5f 73 65 6c 65 63 74 65 64 28 73 73 6c 2c 20  n_selected(ssl, 
bfa0: 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20  &proto, &len);. 
bfb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
bfc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
bfd0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
bfe0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c  NewStringObj("al
bff0: 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  pn", -1));.    T
c000: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
c010: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
c020: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
c030: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c040: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 6c 65 6e  )proto, (int)len
c050: 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ));.#endif..    
c060: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
c070: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
c080: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
c090: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
c0a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c0b0: 28 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  ("session_reused
c0c0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
c0d0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
c0e0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
c0f0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  jPtr, Tcl_NewInt
c100: 4f 62 6a 28 53 53 4c 5f 73 65 73 73 69 6f 6e 5f  Obj(SSL_session_
c110: 72 65 75 73 65 64 28 73 73 6c 29 29 29 3b 0a 0a  reused(ssl)));..
c120: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
c130: 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _SSL_COMPRESSION
c140: 29 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52  ) && OPENSSL_VER
c150: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
c160: 78 31 30 30 30 32 30 30 30 4c 0a 20 20 20 20 2f  x10002000L.    /
c170: 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e  * Compression in
c180: 66 6f 20 2a 2f 0a 20 20 20 20 63 6f 6d 70 20 3d  fo */.    comp =
c190: 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
c1a0: 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c  _compression(ssl
c1b0: 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 6d 70 20  );.    if (comp 
c1c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 65 78 70 61  != NULL) {..expa
c1d0: 6e 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f  nsion = SSL_get_
c1e0: 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f  current_expansio
c1f0: 6e 28 73 73 6c 29 3b 0a 09 54 63 6c 5f 4c 69 73  n(ssl);..Tcl_Lis
c200: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
c210: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
c220: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
c230: 62 6a 28 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  bj("compression"
c240: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
c250: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
c260: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
c270: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
c280: 62 6a 28 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f  bj(SSL_COMP_get_
c290: 6e 61 6d 65 28 63 6f 6d 70 29 2c 20 2d 31 29 29  name(comp), -1))
c2a0: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
c2b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
c2c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
c2d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 78  NewStringObj("ex
c2e0: 70 61 6e 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a  pansion", -1));.
c2f0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
c300: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
c310: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
c320: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43  wStringObj(SSL_C
c330: 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70  OMP_get_name(exp
c340: 61 6e 73 69 6f 6e 29 2c 20 2d 31 29 29 3b 0a 20  ansion), -1));. 
c350: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
c360: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
c370: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
c380: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c390: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
c3a0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
c3b0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
c3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
c400: 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64   * VersionObjCmd
c410: 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69   -- return versi
c420: 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f  on string from O
c430: 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65  penSSL.. *. * Re
c440: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
c450: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
c460: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
c470: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
c480: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
c4d0: 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a  c int.VersionObj
c4e0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
c4f0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
c500: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
c510: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
c520: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
c530: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
c540: 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69  bjPtr;..    dpri
c550: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
c560: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
c570: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50  _NewStringObj(OP
c580: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45  ENSSL_VERSION_TE
c590: 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c  XT, -1);.    Tcl
c5a0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
c5b0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a  terp, objPtr);..
c5c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
c5d0: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
c5e0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62   clientData;..ob
c5f0: 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76  jc = objc;..objv
c600: 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a   = objv;.}.../*.
c610: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
c620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c650: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63  -----. *. * Misc
c660: 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63  ObjCmd -- misc c
c670: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65  ommands. *. * Re
c680: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
c690: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
c6a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
c6b0: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
c6c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c700: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
c710: 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64  c int.MiscObjCmd
c720: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
c730: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
c740: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
c750: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
c760: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
c770: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
c780: 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b  char *commands [
c790: 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74  ] = { "req", "st
c7a0: 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20  rreq", NULL };. 
c7b0: 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20     enum command 
c7c0: 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45  { C_REQ, C_STRRE
c7d0: 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20  Q, C_DUMMY };.  
c7e0: 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72    int cmd, isStr
c7f0: 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65  ;.    char buffe
c800: 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64  r[16384];..    d
c810: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
c820: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
c830: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  < 2) {..Tcl_Wron
c840: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
c850: 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f   1, objv, "subco
c860: 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a  mmand ?args?");.
c870: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
c880: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
c890: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
c8a0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
c8b0: 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20  v[1], commands, 
c8c0: 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 26 63 6d  "command", 0,&cm
c8d0: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  d) != TCL_OK) {.
c8e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
c8f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 73  R;.    }..    is
c900: 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f  Str = (cmd == C_
c910: 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69  STRREQ);.    swi
c920: 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61  tch ((enum comma
c930: 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65  nd) cmd) {..case
c940: 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f   C_REQ:..case C_
c950: 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45  STRREQ: {..    E
c960: 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55  VP_PKEY *pkey=NU
c970: 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63  LL;..    X509 *c
c980: 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58  ert=NULL;..    X
c990: 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e  509_NAME *name=N
c9a0: 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62  ULL;..    Tcl_Ob
c9b0: 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20  j **listv;..    
c9c0: 69 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20  int listc,i;... 
c9d0: 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c     BIO *out=NULL
c9e0: 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f  ;...    char *k_
c9f0: 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b  C="",*k_ST="",*k
ca00: 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b  _L="",*k_O="",*k
ca10: 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c  _OU="",*k_CN="",
ca20: 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20  *k_Email="";..  
ca30: 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a    char *keyout,*
ca40: 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20  pemout,*str;..  
ca50: 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65    int keysize,se
ca60: 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b  rial=0,days=365;
ca70: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
ca80: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 3d 20  RSION_NUMBER <= 
ca90: 30 78 31 30 31 30 30 30 30 30 4c 0a 09 20 20 20  0x10100000L..   
caa0: 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
cab0: 3b 0a 23 65 6c 69 66 20 4f 50 45 4e 53 53 4c 5f  ;.#elif OPENSSL_
cac0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
cad0: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
cae0: 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20    BIGNUM *bne = 
caf0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a  NULL;..    RSA *
cb00: 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73  rsa = NULL;.#els
cb10: 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  e..    EVP_PKEY_
cb20: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
cb30: 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66  .#endif...    if
cb40: 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f   ((objc<5) || (o
cb50: 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f  bjc>6)) {...Tcl_
cb60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
cb70: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b  erp, 2, objv, "k
cb80: 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63  eysize keyfile c
cb90: 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29  ertfile ?info?")
cba0: 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
cbb0: 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  RROR;..    }... 
cbc0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
cbd0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
cbe0: 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69   objv[2], &keysi
cbf0: 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ze) != TCL_OK) {
cc00: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
cc10: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
cc20: 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53   keyout=Tcl_GetS
cc30: 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
cc40: 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f  .    pemout=Tcl_
cc50: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34  GetString(objv[4
cc60: 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53  ]);..    if (isS
cc70: 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56  tr) {...Tcl_SetV
cc80: 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74  ar(interp,keyout
cc90: 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65  ,"",0);...Tcl_Se
cca0: 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
ccb0: 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d  ut,"",0);..    }
ccc0: 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e  ...    if (objc>
ccd0: 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f  =6) {...if (Tcl_
cce0: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
ccf0: 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ts(interp, objv[
cd00: 35 5d 2c 0a 09 09 09 26 6c 69 73 74 63 2c 20 26  5],....&listc, &
cd10: 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b  listv) != TCL_OK
cd20: 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  ) {...    return
cd30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
cd40: 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29  ...if ((listc%2)
cd50: 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54   != 0) {...    T
cd60: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
cd70: 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e  erp,"Information
cd80: 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20   list must have 
cd90: 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61  even number of a
cda0: 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b  rguments",NULL);
cdb0: 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
cdc0: 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66  L_ERROR;...}...f
cdd0: 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63  or (i=0; i<listc
cde0: 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20  ; i+=2) {...    
cdf0: 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  str=Tcl_GetStrin
ce00: 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20  g(listv[i]);... 
ce10: 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74     if (strcmp(st
ce20: 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a  r,"days")==0) {.
ce30: 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
ce40: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
ce50: 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73  listv[i+1],&days
ce60: 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
ce70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ce80: 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
ce90: 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
cea0: 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a  "serial")==0) {.
ceb0: 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
cec0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
ced0: 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69  listv[i+1],&seri
cee0: 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09  al)!=TCL_OK)....
cef0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
cf00: 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c  RROR;...    } el
cf10: 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
cf20: 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"C")==0) {....
cf30: 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_C=Tcl_GetStrin
cf40: 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
cf50: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
cf60: 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29  strcmp(str,"ST")
cf70: 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54  ==0) {....k_ST=T
cf80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
cf90: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
cfa0: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
cfb0: 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b  p(str,"L")==0) {
cfc0: 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53  ....k_L=Tcl_GetS
cfd0: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
cfe0: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
cff0: 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
d000: 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  O")==0) {....k_O
d010: 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
d020: 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
d030: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
d040: 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30  cmp(str,"OU")==0
d050: 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f  ) {....k_OU=Tcl_
d060: 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
d070: 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
d080: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
d090: 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09  tr,"CN")==0) {..
d0a0: 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74  ..k_CN=Tcl_GetSt
d0b0: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
d0c0: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
d0d0: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45  f (strcmp(str,"E
d0e0: 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  mail")==0) {....
d0f0: 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53  k_Email=Tcl_GetS
d100: 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
d110: 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
d120: 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75  {....Tcl_SetResu
d130: 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f  lt(interp,"Unkno
d140: 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55  wn parameter",NU
d150: 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54  LL);....return T
d160: 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
d170: 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69  }...}..    }..#i
d180: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
d190: 4e 5f 4e 55 4d 42 45 52 20 3c 3d 20 30 78 31 30  N_NUMBER <= 0x10
d1a0: 31 30 30 30 30 30 4c 0a 09 20 20 20 20 70 6b 65  100000L..    pke
d1b0: 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
d1c0: 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
d1d0: 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79 28  SA_generate_key(
d1e0: 6b 65 79 73 69 7a 65 2c 20 30 78 31 30 30 30 31  keysize, 0x10001
d1f0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09  , NULL, NULL);..
d200: 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20      if (pkey == 
d210: 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e  NULL || rsa == N
d220: 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ULL || !EVP_PKEY
d230: 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79  _assign_RSA(pkey
d240: 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f  , rsa)) {...EVP_
d250: 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
d260: 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72  .../* RSA_free(r
d270: 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56  sa); freed by EV
d280: 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 23  P_PKEY_free */.#
d290: 65 6c 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  elif OPENSSL_VER
d2a0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
d2b0: 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62  30000000L..    b
d2c0: 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09  ne = BN_new();..
d2d0: 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65      rsa = RSA_ne
d2e0: 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d  w();..    pkey =
d2f0: 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b   EVP_PKEY_new();
d300: 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d  ..    if (bne ==
d310: 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20   NULL || rsa == 
d320: 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20  NULL || pkey == 
d330: 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f  NULL || !BN_set_
d340: 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29  word(bne,RSA_F4)
d350: 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72   ||...!RSA_gener
d360: 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20  ate_key_ex(rsa, 
d370: 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55  keysize, bne, NU
d380: 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  LL) || !EVP_PKEY
d390: 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79  _assign_RSA(pkey
d3a0: 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f  , rsa)) {...EVP_
d3b0: 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
d3c0: 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72  .../* RSA_free(r
d3d0: 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56  sa); freed by EV
d3e0: 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09  P_PKEY_free */..
d3f0: 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
d400: 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d  else..    pkey =
d410: 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e   EVP_RSA_gen((un
d420: 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73  signed int) keys
d430: 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d  ize);..    ctx =
d440: 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
d450: 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20  w(pkey,NULL);.. 
d460: 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e     if (pkey == N
d470: 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55  ULL || ctx == NU
d480: 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  LL || !EVP_PKEY_
d490: 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29  keygen_init(ctx)
d4a0: 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f   ||...!EVP_PKEY_
d4b0: 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67  CTX_set_rsa_keyg
d4c0: 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79  en_bits(ctx, key
d4d0: 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b  size) || !EVP_PK
d4e0: 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26  EY_keygen(ctx, &
d4f0: 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50  pkey)) {...EVP_P
d500: 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
d510: 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66  ..EVP_PKEY_CTX_f
d520: 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66  ree(ctx);.#endif
d530: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
d540: 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
d550: 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
d560: 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
d570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
d580: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
d590: 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
d5a0: 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
d5b0: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
d5c0: 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
d5d0: 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
d5e0: 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
d5f0: 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
d600: 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
d610: 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
d620: 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
d630: 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
d640: 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
d650: 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
d660: 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
d670: 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72  rp,keyout,buffer
d680: 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
d690: 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
d6a0: 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
d6b0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
d6c0: 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
d6d0: 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
d6e0: 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
d6f0: 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
d700: 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
d710: 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
d720: 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
d730: 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
d740: 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77  ;...    /* PEM_w
d750: 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76  rite_bio_RSAPriv
d760: 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c  ateKey(out, rsa,
d770: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20   NULL, NULL, 0, 
d780: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a  NULL, NULL); */.
d790: 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
d7a0: 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09  ll(out);.. .}...
d7b0: 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f  .if ((cert=X509_
d7c0: 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a  new())==NULL) {.
d7d0: 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
d7e0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
d7f0: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72  r generating cer
d800: 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74  tificate request
d810: 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45  ",NULL);...    E
d820: 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
d830: 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
d840: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
d850: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
d860: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
d870: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
d880: 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
d890: 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
d8a0: 09 09 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ..    return(TCL
d8b0: 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09  _ERROR);...}....
d8c0: 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
d8d0: 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
d8e0: 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
d8f0: 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
d900: 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
d910: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
d920: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d930: 78 31 30 31 30 30 30 30 30 4c 0a 09 09 58 35 30  x10100000L...X50
d940: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
d950: 39 5f 67 65 74 5f 6e 6f 74 42 65 66 6f 72 65 28  9_get_notBefore(
d960: 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
d970: 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
d980: 5f 67 65 74 5f 6e 6f 74 41 66 74 65 72 28 63 65  _get_notAfter(ce
d990: 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a  rt),(long)60*60*
d9a0: 32 34 2a 64 61 79 73 29 3b 0a 23 65 6c 73 65 0a  24*days);.#else.
d9b0: 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
d9c0: 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42  j(X509_getm_notB
d9d0: 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a  efore(cert),0);.
d9e0: 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64  ..X509_gmtime_ad
d9f0: 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41  j(X509_getm_notA
da00: 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67  fter(cert),(long
da10: 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b  )60*60*24*days);
da20: 0a 23 65 6e 64 69 66 0a 09 09 58 35 30 39 5f 73  .#endif...X509_s
da30: 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70  et_pubkey(cert,p
da40: 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35  key);....name=X5
da50: 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_get_subject_n
da60: 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35  ame(cert);....X5
da70: 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
da80: 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
da90: 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
daa0: 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
dab0: 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31   char *) k_C, -1
dac0: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
dad0: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
dae0: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22  by_txt(name,"ST"
daf0: 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
db00: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
db10: 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31  char *) k_ST, -1
db20: 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
db30: 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
db40: 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c  by_txt(name,"L",
db50: 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
db60: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
db70: 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20  har *) k_L, -1, 
db80: 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
db90: 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
dba0: 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d  _txt(name,"O", M
dbb0: 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
dbc0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
dbd0: 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31  r *) k_O, -1, -1
dbe0: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
dbf0: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
dc00: 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42  xt(name,"OU", MB
dc10: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
dc20: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
dc30: 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31   *) k_OU, -1, -1
dc40: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
dc50: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
dc60: 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42  xt(name,"CN", MB
dc70: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
dc80: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
dc90: 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31   *) k_CN, -1, -1
dca0: 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
dcb0: 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
dcc0: 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c  xt(name,"Email",
dcd0: 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
dce0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
dcf0: 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20  har *) k_Email, 
dd00: 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58  -1, -1, 0);....X
dd10: 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f  509_set_subject_
dd20: 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b  name(cert,name);
dd30: 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69  ....if (!X509_si
dd40: 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50  gn(cert,pkey,EVP
dd50: 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09  _sha256())) {...
dd60: 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65      X509_free(ce
dd70: 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  rt);...    EVP_P
dd80: 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
dd90: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
dda0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31  ION_NUMBER > 0x1
ddb0: 30 31 30 30 30 30 30 4c 20 26 26 20 4f 50 45 4e  0100000L && OPEN
ddc0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
ddd0: 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
dde0: 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
ddf0: 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
de00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
de10: 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
de20: 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
de30: 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
de40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
de50: 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53  ;...}....if (isS
de60: 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
de70: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
de80: 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
de90: 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
dea0: 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
deb0: 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
dec0: 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
ded0: 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
dee0: 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
def0: 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
df00: 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
df10: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65  SetVar(interp,pe
df20: 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  mout,buffer,0);.
df30: 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
df40: 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
df50: 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
df60: 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
df70: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
df80: 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
df90: 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
dfa0: 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20  out,pemout);... 
dfb0: 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
dfc0: 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
dfd0: 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
dfe0: 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09  all(out);...}...
dff0: 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29  .X509_free(cert)
e000: 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  ;...EVP_PKEY_fre
e010: 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
e020: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
e030: 42 45 52 20 3e 20 30 78 31 30 31 30 30 30 30 30  BER > 0x10100000
e040: 4c 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52  L && OPENSSL_VER
e050: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
e060: 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66  30000000L...BN_f
e070: 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
e080: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
e090: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
e0a0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20  .break;.    }.  
e0b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e0c0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
e0d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
e0e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
e0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e120: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
e130: 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
e140: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
e150: 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
e160: 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
e170: 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
e180: 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
e190: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
e1a0: 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
e1b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
e1c0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
e1d0: 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
e1e0: 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
e1f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
e200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e230: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
e240: 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62  Tls_Free(char *b
e250: 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53  lockPtr) {.    S
e260: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
e270: 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50   (State *)blockP
e280: 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
e290: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
e2a0: 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65   Tls_Clean(state
e2b0: 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65  Ptr);.    ckfree
e2c0: 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a  (blockPtr);.}...
e2d0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
e2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e310: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
e320: 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20  ls_Clean --. *. 
e330: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
e340: 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
e350: 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
e360: 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
e370: 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
e380: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
e390: 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20  falls below 1.  
e3a0: 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62  This should. *.b
e3b0: 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f  e called synchro
e3c0: 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c  nously by the Cl
e3d0: 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20  oseProc, not in 
e3e0: 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c  the. *.Eventuall
e3f0: 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  yFree callback..
e400: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
e410: 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
e420: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
e430: 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
e440: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
e450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
e490: 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74  oid Tls_Clean(St
e4a0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b  ate *statePtr) {
e4b0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
e4c0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a  lled");..    /*.
e4d0: 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73       * we're ass
e4e0: 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20  uming here that 
e4f0: 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72  we're single-thr
e500: 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20  eaded.     */.  
e510: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
e520: 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
e530: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
e540: 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
e550: 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
e560: 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
e570: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e  tePtr->timer = N
e580: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e590: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69  if (statePtr->bi
e5a0: 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69  o) {../* This wi
e5b0: 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74  ll call SSL_shut
e5c0: 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34  down. Bug 141404
e5d0: 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42  5 */..dprintf("B
e5e0: 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22  IO_free_all(%p)"
e5f0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  , statePtr->bio)
e600: 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  ;..BIO_free_all(
e610: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
e620: 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d  .statePtr->bio =
e630: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
e640: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
e650: 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  sl) {..dprintf("
e660: 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73  SSL_free(%p)", s
e670: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
e680: 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74  SSL_free(statePt
e690: 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50  r->ssl);..stateP
e6a0: 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  tr->ssl = NULL;.
e6b0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
e6c0: 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09  atePtr->ctx) {..
e6d0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61  SSL_CTX_free(sta
e6e0: 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74  tePtr->ctx);..st
e6f0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55  atePtr->ctx = NU
e700: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
e710: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
e720: 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63  back) {..Tcl_Dec
e730: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
e740: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
e750: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
e760: 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ck = NULL;.    }
e770: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
e780: 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  r->password) {..
e790: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
e7a0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
e7b0: 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ord);..statePtr-
e7c0: 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c  >password = NULL
e7d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
e7e0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
e7f0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
e800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
e840: 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
e850: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
e860: 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
e870: 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
e880: 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
e890: 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
e8a0: 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
e8b0: 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
e8c0: 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
e8d0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
e8e0: 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
e8f0: 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
e900: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
e910: 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
e920: 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
e930: 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
e940: 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
e950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
e990: 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
e9a0: 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
e9b0: 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
e9c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
e9d0: 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
e9e0: 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
e9f0: 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
ea00: 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
ea10: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
ea20: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6f    /*.     * We o
ea30: 6e 6c 79 20 73 75 70 70 6f 72 74 20 54 63 6c 20  nly support Tcl 
ea40: 38 2e 34 20 6f 72 20 6e 65 77 65 72 0a 20 20 20  8.4 or newer.   
ea50: 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 0a 23 69    */.    if (.#i
ea60: 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
ea70: 42 53 0a 09 54 63 6c 5f 49 6e 69 74 53 74 75 62  BS..Tcl_InitStub
ea80: 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 34 22 2c  s(interp, "8.4",
ea90: 20 30 29 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 50   0).#else..Tcl_P
eaa0: 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70  kgRequire(interp
eab0: 2c 20 22 54 63 6c 22 2c 20 22 38 2e 34 2d 22 2c  , "Tcl", "8.4-",
eac0: 20 30 29 0a 23 65 6e 64 69 66 0a 09 20 3d 3d 20   0).#endif.. == 
ead0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
eae0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
eaf0: 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62  ..    if (TlsLib
eb00: 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f  Init(0) != TCL_O
eb10: 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  K) {..Tcl_Append
eb20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
eb30: 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61  could not initia
eb40: 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79  lize SSL library
eb50: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
eb60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
eb70: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61   }..    Tcl_Crea
eb80: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
eb90: 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65  erp, "tls::ciphe
eba0: 72 73 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43  rs", CiphersObjC
ebb0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
ebc0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
ebd0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
ebe0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
ebf0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
ec00: 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69  , "tls::connecti
ec10: 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  on", ConnectionI
ec20: 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  nfoObjCmd, (Clie
ec30: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
ec40: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
ec50: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
ec60: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
ec70: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68  (interp, "tls::h
ec80: 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73  andshake", Hands
ec90: 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  hakeObjCmd, (Cli
eca0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
ecb0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
ecc0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
ecd0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
ece0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
ecf0: 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f  import", ImportO
ed00: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
ed10: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
ed20: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
ed30: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
ed40: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
ed50: 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70  erp, "tls::unimp
ed60: 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
ed70: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
ed80: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
ed90: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
eda0: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
edb0: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
edc0: 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73  rp, "tls::status
edd0: 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c  ", StatusObjCmd,
ede0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
edf0: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
ee00: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
ee10: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
ee20: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
ee30: 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
ee40: 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
ee50: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
ee60: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
ee70: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
ee80: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
ee90: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
eea0: 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a  ::misc", MiscObj
eeb0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
eec0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
eed0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
eee0: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
eef0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
ef00: 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  p, "tls::protoco
ef10: 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  ls", ProtocolsOb
ef20: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
ef30: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
ef40: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
ef50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
ef60: 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28  rp) {..Tcl_Eval(
ef70: 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e  interp, tlsTclIn
ef80: 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d  itScript);.    }
ef90: 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 54 63 6c  ..    return(Tcl
efa0: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
efb0: 72 70 2c 20 22 74 6c 73 22 2c 20 50 41 43 4b 41  rp, "tls", PACKA
efc0: 47 45 5f 56 45 52 53 49 4f 4e 29 29 3b 0a 7d 0a  GE_VERSION));.}.
efd0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
f010: 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
f020: 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
f030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53  ----------*. *.S
f060: 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72  tandard procedur
f070: 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c  e required by 'l
f080: 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c  oad'.. *.Initial
f090: 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73  izes this extens
f0a0: 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69  ion for a safe i
f0b0: 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d  nterpreter.. *.-
f0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
f0f0: 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
f100: 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27  cts:. *..As of '
f110: 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09  Tls_Init'. *. *.
f120: 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74  Result:. *..A st
f130: 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72  andard Tcl error
f140: 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   code.. *. *----
f150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f180: 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52  --*. */.DLLEXPOR
f190: 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e  T int Tls_SafeIn
f1a0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
f1b0: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72  nterp) {.    dpr
f1c0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
f1d0: 20 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49      return(Tls_I
f1e0: 6e 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a  nit(interp));.}.
f1f0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
f200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
f230: 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d  . *.TlsLibInit -
f240: 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  -. *. *.--------
f250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69  --------*. *.Ini
f280: 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
f290: 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70  rary once per ap
f2a0: 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d  plication. *.---
f2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
f2e0: 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74  *. *.Side effect
f2f0: 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a  s:. *..initializ
f300: 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20  es SSL library. 
f310: 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
f320: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
f330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f360: 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  -*. */.static in
f370: 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74  t TlsLibInit(int
f380: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b   uninitialize) {
f390: 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20  .    static int 
f3a0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
f3b0: 0a 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20  .    int status 
f3c0: 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65  = TCL_OK;.#if de
f3d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
f3e0: 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
f3f0: 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20  d(TCL_THREADS). 
f400: 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f     size_t num_lo
f410: 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  cks;.#endif..   
f420: 20 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a   if (uninitializ
f430: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  e) {.        if 
f440: 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b  (!initialized) {
f450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 70 72  .            dpr
f460: 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
f470: 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74  ninitialize, but
f480: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74   we are not init
f490: 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 20 20 20 20  ialized");..    
f4a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 54          return(T
f4b0: 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  CL_OK);.        
f4c0: 7d 0a 0a 20 20 20 20 20 20 20 20 64 70 72 69 6e  }..        dprin
f4d0: 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
f4e0: 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69  nitialize");..#i
f4f0: 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
f500: 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
f510: 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
f520: 53 29 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 4d  S).        Tcl_M
f530: 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
f540: 78 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  x);..#if OPENSSL
f550: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
f560: 3c 20 30 78 31 30 30 30 30 30 30 30 4c 0a 20 20  < 0x10000000L.  
f570: 20 20 20 20 20 20 43 52 59 50 54 4f 5f 73 65 74        CRYPTO_set
f580: 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 61 63  _locking_callbac
f590: 6b 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 20  k(NULL);.       
f5a0: 20 43 52 59 50 54 4f 5f 73 65 74 5f 69 64 5f 63   CRYPTO_set_id_c
f5b0: 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a 23  allback(NULL);.#
f5c0: 65 6c 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  elif OPENSSL_VER
f5d0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
f5e0: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 20 20  10100000L.      
f5f0: 20 20 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63    CRYPTO_set_loc
f600: 6b 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 4e 55  king_callback(NU
f610: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 43 52 59  LL);.        CRY
f620: 50 54 4f 5f 54 48 52 45 41 44 49 44 5f 73 65 74  PTO_THREADID_set
f630: 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 0a  _callback(NULL).
f640: 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20  #endif..        
f650: 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 20 20 20  if (locks) {.   
f660: 20 20 20 20 20 20 20 20 20 66 72 65 65 28 6c 6f           free(lo
f670: 63 6b 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  cks);.          
f680: 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a    locks = NULL;.
f690: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
f6a0: 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  sCount = 0;.    
f6b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
f6c0: 20 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64       initialized
f6d0: 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 0;..#if defin
f6e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
f6f0: 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
f700: 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
f710: 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c      Tcl_MutexUnl
f720: 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
f730: 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 20 20 72  endif..        r
f740: 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20  eturn(TCL_OK);. 
f750: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
f760: 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20  itialized) {.   
f770: 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61       dprintf("Ca
f780: 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20  lled, but using 
f790: 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a  cached value");.
f7a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 28 73          return(s
f7b0: 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a 20  tatus);.    }.. 
f7c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
f7d0: 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
f7e0: 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
f7f0: 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
f800: 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
f810: 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
f820: 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
f830: 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
f840: 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 1;..#if define
f850: 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
f860: 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
f870: 4c 5f 54 48 52 45 41 44 53 29 0a 23 69 66 20 4f  L_THREADS).#if O
f880: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
f890: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
f8a0: 30 30 4c 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b  00L.    num_lock
f8b0: 73 20 3d 20 43 52 59 50 54 4f 5f 6e 75 6d 5f 6c  s = CRYPTO_num_l
f8c0: 6f 63 6b 73 28 29 3b 0a 23 65 6c 73 65 0a 20 20  ocks();.#else.  
f8d0: 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b    num_locks = 1;
f8e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 6c 6f 63 6b  .#endif.    lock
f8f0: 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e  sCount = (int) n
f900: 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f  um_locks;.    lo
f910: 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  cks = malloc(siz
f920: 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
f930: 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65  m_locks);.    me
f940: 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73  mset(locks, 0, s
f950: 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
f960: 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 0a 23 69 66  num_locks);..#if
f970: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
f980: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 30 30  _NUMBER < 0x1000
f990: 30 30 30 30 4c 0a 20 20 20 20 43 52 59 50 54 4f  0000L.    CRYPTO
f9a0: 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f 63 61 6c  _set_locking_cal
f9b0: 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72 65  lback(CryptoThre
f9c0: 61 64 4c 6f 63 6b 43 61 6c 6c 62 61 63 6b 29 3b  adLockCallback);
f9d0: 0a 20 20 20 20 43 52 59 50 54 4f 5f 73 65 74 5f  .    CRYPTO_set_
f9e0: 69 64 5f 63 61 6c 6c 62 61 63 6b 28 43 72 79 70  id_callback(Cryp
f9f0: 74 6f 54 68 72 65 61 64 49 64 43 61 6c 6c 62 61  toThreadIdCallba
fa00: 63 6b 29 3b 0a 23 65 6c 69 66 20 4f 50 45 4e 53  ck);.#elif OPENS
fa10: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
fa20: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a  R < 0x10100000L.
fa30: 20 20 20 20 43 52 59 50 54 4f 5f 73 65 74 5f 6c      CRYPTO_set_l
fa40: 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28  ocking_callback(
fa50: 43 72 79 70 74 6f 54 68 72 65 61 64 4c 6f 63 6b  CryptoThreadLock
fa60: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 43  Callback);.    C
fa70: 52 59 50 54 4f 5f 54 48 52 45 41 44 49 44 5f 73  RYPTO_THREADID_s
fa80: 65 74 5f 63 61 6c 6c 62 61 63 6b 28 43 72 79 70  et_callback(Cryp
fa90: 74 6f 54 68 72 65 61 64 49 64 43 61 6c 6c 62 61  toThreadIdCallba
faa0: 63 6b 29 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ck).#endif.#endi
fab0: 66 0a 0a 23 20 69 66 20 4f 50 45 4e 53 53 4c 5f  f..# if OPENSSL_
fac0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
fad0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
fae0: 20 69 66 20 28 53 53 4c 5f 6c 69 62 72 61 72 79   if (SSL_library
faf0: 5f 69 6e 69 74 28 29 20 21 3d 20 31 29 20 7b 0a  _init() != 1) {.
fb00: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20 3d          status =
fb10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fb20: 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20      goto done;. 
fb30: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f     }.#else.    /
fb40: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
fb50: 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
fb60: 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
fb70: 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
fb80: 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
fb90: 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
fba0: 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
fbb0: 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
fbc0: 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
fbd0: 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
fbe0: 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
fbf0: 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
fc00: 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 0a   NULL);.#endif..
fc10: 23 20 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  # if OPENSSL_VER
fc20: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
fc30: 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 53 53  10100000L.    SS
fc40: 4c 5f 6c 6f 61 64 5f 65 72 72 6f 72 5f 73 74 72  L_load_error_str
fc50: 69 6e 67 73 28 29 3b 0a 20 20 20 20 45 52 52 5f  ings();.    ERR_
fc60: 6c 6f 61 64 5f 63 72 79 70 74 6f 5f 73 74 72 69  load_crypto_stri
fc70: 6e 67 73 28 29 3b 0a 23 65 6c 73 65 0a 20 20 20  ngs();.#else.   
fc80: 20 2f 2a 20 4f 6e 6c 79 20 69 6e 69 74 69 61 6c   /* Only initial
fc90: 69 7a 65 20 6c 69 62 63 72 79 70 74 6f 20 20 2a  ize libcrypto  *
fca0: 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e  /.    OPENSSL_in
fcb0: 69 74 5f 63 72 79 70 74 6f 28 4f 50 45 4e 53 53  it_crypto(OPENSS
fcc0: 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50  L_INIT_LOAD_CRYP
fcd0: 54 4f 5f 53 54 52 49 4e 47 53 2c 20 4e 55 4c 4c  TO_STRINGS, NULL
fce0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 42  );.#endif..    B
fcf0: 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c  IO_new_tcl(NULL,
fd00: 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20   0);..#if 0.    
fd10: 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f  /*.     * XXX:TO
fd20: 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20  DO: Remove this 
fd30: 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65  code and replace
fd40: 20 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b   it with a check
fd50: 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75  .     * for enou
fd60: 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64  gh entropy and d
fd70: 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65  o not try to cre
fd80: 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20  ate our own.    
fd90: 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72   * terrible entr
fda0: 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  opy.     */.    
fdb0: 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74  /*.     * Seed t
fdc0: 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  he random number
fdd0: 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68   generator in th
fde0: 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20  e SSL library,. 
fdf0: 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20      * using the 
fe00: 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75  do/while constru
fe10: 63 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68  ct because of th
fe20: 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68  e bug note in th
fe30: 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c  e.     * OpenSSL
fe40: 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77   FAQ at http://w
fe50: 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73  ww.openssl.org/s
fe60: 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23  upport/faq.html#
fe70: 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20  USER1.     *.   
fe80: 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20    * The crux of 
fe90: 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74  the problem is t
fea0: 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f  hat Solaris 7 do
feb0: 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20  es not have a.  
fec0: 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d     * /dev/random
fed0: 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d   or /dev/urandom
fee0: 20 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61   device so it ca
fef0: 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75  nnot gather enou
ff00: 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70  gh.     * entrop
ff10: 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f  y from the RAND_
ff20: 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20  seed() when TLS 
ff30: 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20  initializes and 
ff40: 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74  refuses.     * t
ff50: 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61  o go further. Ea
ff60: 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  rlier versions o
ff70: 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65  f OpenSSL carrie
ff80: 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e  d on regardless.
ff90: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61  .     */.    sra
ffa0: 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74  nd((unsigned int
ffb0: 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a  ) time((time_t *
ffc0: 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f  ) NULL));.    do
ffd0: 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20   {..for (i = 0; 
ffe0: 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09  i < 16; i++) {..
fff0: 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20      rnd_seed[i] 
10000 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35  = 1 + (char) (25
10010 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41  5.0 * rand()/(RA
10020 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d  ND_MAX+1.0));..}
10030 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f  ..RAND_seed(rnd_
10040 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64  seed, sizeof(rnd
10050 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77  _seed));.    } w
10060 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75  hile (RAND_statu
10070 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69  s() != 1);.#endi
10080 66 0a 0a 23 20 69 66 20 4f 50 45 4e 53 53 4c 5f  f..# if OPENSSL_
10090 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
100a0 20 30 78 31 30 31 30 30 30 30 30 4c 0a 64 6f 6e   0x10100000L.don
100b0 65 3a 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e:.#endif.#if de
100c0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
100d0 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
100e0 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
100f0 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28  Tcl_MutexUnlock(
10100 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
10110 66 0a 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  f...return(statu
10120 73 29 3b 0a 7d 0a                                s);.}.