Hex Artifact Content

Artifact f33536e87311d351a14cd8c432524183c60a3dd365f9e6a71b90285799f6466e:


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 20 3d 20 4e 55 4c 4c 3b 0a 20 20  bjPtr = NULL;.  
3630: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
3640: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a   NULL;.    SSL *
3650: 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ssl = NULL;.    
3660: 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50  STACK_OF(SSL_CIP
3670: 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68  HER) *sk;.    ch
3680: 61 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53  ar *cp, buf[BUFS
3690: 49 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64  IZ];.    int ind
36a0: 65 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c  ex, verbose = 0,
36b0: 20 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d   use_supported =
36c0: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
36d0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
36e0: 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20   if ((objc < 2) 
36f0: 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b  || (objc > 4)) {
3700: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
3710: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
3720: 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76  jv, "protocol ?v
3730: 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74  erbose? ?support
3740: 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ed?");..return T
3750: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
3760: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49      if (Tcl_GetI
3770: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
3780: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f  rp, objv[1], pro
3790: 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f  tocols, "protoco
37a0: 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21  l", 0, &index) !
37b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
37c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
37d0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62     }.    if ((ob
37e0: 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47  jc > 2) && Tcl_G
37f0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
3800: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
3810: 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54  , &verbose) != T
3820: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
3830: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
3840: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
3850: 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 3) && Tcl_GetB
3860: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
3870: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
3880: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21  use_supported) !
3890: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
38a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
38b0: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
38c0: 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c   ((enum protocol
38d0: 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65 20  )index) {..case 
38e0: 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f 50  TLS_SSL2:.#if OP
38f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
3900: 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30  MBER >= 0x101000
3910: 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e  00L || defined(N
3920: 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e  O_SSL2) || defin
3930: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
3940: 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  L2)..    Tcl_App
3950: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
3960: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
3970: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
3980: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
3990: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
39a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
39b0: 6c 73 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53  lse..    ctx = S
39c0: 53 4c 5f 43 54 58 5f 6e 65 77 28 53 53 4c 76 32  SL_CTX_new(SSLv2
39d0: 5f 6d 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61  _method()); brea
39e0: 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20  k;.#endif..case 
39f0: 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65  TLS_SSL3:.#if de
3a00: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
3a10: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
3a20: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 20 20 20 20  L_NO_SSL3)..    
3a30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3a40: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
3a50: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
3a60: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
3a70: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  rted", NULL);.. 
3a80: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
3a90: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
3aa0: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
3ab0: 77 28 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28 29  w(SSLv3_method()
3ac0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
3ad0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a  ..case TLS_TLS1:
3ae0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
3af0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
3b00: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
3b10: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
3b20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3b30: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
3b40: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
3b50: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
3b60: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
3b70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
3b80: 65 0a 09 20 20 20 20 63 74 78 20 3d 20 53 53 4c  e..    ctx = SSL
3b90: 5f 43 54 58 5f 6e 65 77 28 54 4c 53 76 31 5f 6d  _CTX_new(TLSv1_m
3ba0: 65 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b  ethod()); break;
3bb0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
3bc0: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65  S_TLS1_1:.#if de
3bd0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
3be0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
3bf0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09  SSL_NO_TLS1_1)..
3c00: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
3c10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
3c20: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
3c30: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
3c40: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
3c50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
3c60: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
3c70: 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54      ctx = SSL_CT
3c80: 58 5f 6e 65 77 28 54 4c 53 76 31 5f 31 5f 6d 65  X_new(TLSv1_1_me
3c90: 74 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a  thod()); break;.
3ca0: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
3cb0: 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66  _TLS1_2:.#if def
3cc0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
3cd0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
3ce0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 20  SL_NO_TLS1_2).. 
3cf0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
3d00: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
3d10: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
3d20: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
3d30: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
3d40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
3d50: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
3d60: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
3d70: 5f 6e 65 77 28 54 4c 53 76 31 5f 32 5f 6d 65 74  _new(TLSv1_2_met
3d80: 68 6f 64 28 29 29 3b 20 62 72 65 61 6b 3b 0a 23  hod()); break;.#
3d90: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
3da0: 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69  TLS1_3:.#if defi
3db0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
3dc0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
3dd0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20  L_NO_TLS1_3)..  
3de0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
3df0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
3e00: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
3e10: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
3e20: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
3e30: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
3e40: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
3e50: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
3e60: 6e 65 77 28 54 4c 53 5f 6d 65 74 68 6f 64 28 29  new(TLS_method()
3e70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  );.            S
3e80: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
3e90: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
3ea0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
3eb0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
3ec0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
3ed0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
3ee0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20  3_VERSION);..   
3ef0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
3f00: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 62 72  default:..    br
3f10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
3f20: 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20  f (ctx == NULL) 
3f30: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
3f40: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
3f50: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ON(), NULL);..re
3f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3f70: 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d      }..    ssl =
3f80: 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20   SSL_new(ctx);. 
3f90: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
3fa0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
3fb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3fc0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
3fd0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
3fe0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tx);..return TCL
3ff0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
4000: 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20 61     /* Use list a
4010: 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75 6c  nd order as woul
4020: 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20 43  d be sent in a C
4030: 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c  lientHello or al
4040: 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  l available ciph
4050: 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 75  ers */.    if (u
4060: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a  se_supported) {.
4070: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73  .sk = SSL_get1_s
4080: 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72 73  upported_ciphers
4090: 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  (ssl);.    } els
40a0: 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65  e {..sk = SSL_ge
40b0: 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a  t_ciphers(ssl);.
40c0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
40d0: 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66  k != NULL) {..if
40e0: 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09 20   (!verbose) {.. 
40f0: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
4100: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
4110: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
4120: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
4130: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
4140: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
4150: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
4160: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
4170: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
4180: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
4190: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
41a0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
41b0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
41c0: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
41d0: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
41e0: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
41f0: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
4200: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4210: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
4220: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63 70  _NewStringObj(cp
4230: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  , -1));..    }..
4240: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f  .} else {..    o
4250: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
4260: 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a  tringObj("",0);.
4270: 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20  .    for (int i 
4280: 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f  = 0; i < sk_SSL_
4290: 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20  CIPHER_num(sk); 
42a0: 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53  i++) {...const S
42b0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73  SL_CIPHER *c = s
42c0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c  k_SSL_CIPHER_val
42d0: 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20  ue(sk, i);...if 
42e0: 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74  (c == NULL) cont
42f0: 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74  inue;..../* text
4300: 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ual description 
4310: 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  of the cipher */
4320: 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  ...if (SSL_CIPHE
4330: 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 2c  R_description(c,
4340: 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
4350: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  )) != NULL) {...
4360: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
4370: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c  Obj(objPtr, buf,
4380: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09   strlen(buf));..
4390: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
43a0: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
43b0: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e  objPtr, "UNKNOWN
43c0: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20  \n", 8);...}..  
43d0: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f    }..}..if (use_
43e0: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20  supported) {..  
43f0: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f    sk_SSL_CIPHER_
4400: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20  free(sk);..}.   
4410: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28   }.    SSL_free(
4420: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ssl);.    SSL_CT
4430: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20  X_free(ctx);..  
4440: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
4450: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
4460: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
4470: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
4480: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
4490: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
44e0: 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  . * ProtocolsObj
44f0: 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69  Cmd -- list avai
4500: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a  lable protocols.
4510: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
4520: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
4530: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
4540: 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20  tls::protocols" 
4550: 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69  command. *.to li
4560: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
4570: 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65  tocols.. *. * Re
4580: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
4590: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20  dard Tcl result 
45a0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  list.. *. * Side
45b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
45c0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
45f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4610: 74 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63  tatic int.Protoc
4620: 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  olsObjCmd(Client
4630: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
4640: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4650: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
4660: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
4670: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
4680: 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20  Obj *objPtr;..  
4690: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
46a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
46b0: 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f  jc != 1) {..Tcl_
46c0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
46d0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
46e0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
46f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
4700: 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65   objPtr = Tcl_Ne
4710: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
4720: 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  );..#if OPENSSL_
4730: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
4740: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
4750: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
4760: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
4770: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
4780: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4790: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
47a0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
47b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
47c0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d  tocols[TLS_SSL2]
47d0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
47e0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
47f0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
4800: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
4810: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
4820: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4830: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
4840: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4850: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
4860: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L3], -1));.#endi
4870: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
4880: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
4890: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
48a0: 4c 53 31 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  LS1).    Tcl_Lis
48b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
48c0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
48d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
48e0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
48f0: 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  _TLS1], -1));.#e
4900: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
4910: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
4920: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
4930: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
4940: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4950: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4960: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
4970: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
4980: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c  ols[TLS_TLS1_1],
4990: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
49a0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
49b0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
49c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
49d0: 31 5f 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_2).    Tcl_Lis
49e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
49f0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
4a00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
4a10: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
4a20: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_2], -1));.
4a30: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
4a40: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
4a50: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
4a60: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
4a70: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4a80: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4a90: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
4aa0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
4ab0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33  ocols[TLS_TLS1_3
4ac0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
4ad0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
4ae0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
4af0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
4b00: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
4b10: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
4b20: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b70: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65  . *. * Handshake
4b80: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
4b90: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
4ba0: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77  used to verify w
4bb0: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73  hether the hands
4bc0: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  hake is complete
4bd0: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20  . *.or not.. *. 
4be0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
4bf0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
4c00: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e  ult. 1 means han
4c10: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c  dshake complete,
4c20: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67   0 means pending
4c30: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
4c40: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72  ects:. *.May for
4c50: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  ce SSL negotiati
4c60: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65  on to take place
4c70: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4cc0: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68  tatic int Handsh
4cd0: 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  akeObjCmd(Client
4ce0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
4cf0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4d00: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
4d10: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
4d20: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
4d30: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20  Channel chan;   
4d40: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e       /* The chan
4d50: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
4d60: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
4d70: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20  te *statePtr;   
4d80: 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73       /* client s
4d90: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
4da0: 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ket */.    const
4db0: 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20   char *errStr = 
4dc0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65  NULL;.    int re
4dd0: 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65  t = 1;.    int e
4de0: 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  rr = 0;..    dpr
4df0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4e00: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
4e10: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
4e20: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
4e30: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
4e40: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c  l");..return(TCL
4e50: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
4e60: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
4e70: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
4e80: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
4e90: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
4ea0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
4eb0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
4ec0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
4ed0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
4ee0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
4ef0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b     /*.     * Mak
4f00: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
4f10: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
4f20: 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20 2a 2f   channel.     */
4f30: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
4f40: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
4f50: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
4f60: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
4f70: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
4f80: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
4f90: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
4fa0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
4fb0: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
4fc0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
4fd0: 6e 29 2c 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54  n), "\": not a T
4fe0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
4ff0: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  L);..return(TCL_
5000: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20  ERROR);.    }.  
5010: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
5020: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
5030: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
5040: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72  (chan);..    dpr
5050: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
5060: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
5070: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c  ");.    ret = Tl
5080: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
5090: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c  (statePtr, &err,
50a0: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66   1);.    dprintf
50b0: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
50c0: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25  nect returned: %
50d0: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69  i", ret);..    i
50e0: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28  f (ret < 0 && ((
50f0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
5100: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29  & TLS_TCL_ASYNC)
5110: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41   && (err == EAGA
5120: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  IN))) {..dprintf
5130: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20  ("Async set and 
5140: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a  err = EAGAIN");.
5150: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20  .ret = 0;.    } 
5160: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30  else if (ret < 0
5170: 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  ) {..errStr = st
5180: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
5190: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
51a0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
51b0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
51c0: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
51d0: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
51e0: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
51f0: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
5200: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
5210: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
5220: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
5230: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
5240: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
5250: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e  .dprintf("Return
5260: 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69  ing TCL_ERROR wi
5270: 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69  th handshake fai
5280: 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72  led: %s", errStr
5290: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
52a0: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73  RROR);.    } els
52b0: 65 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20  e {..if (err != 
52c0: 30 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74  0) {..    dprint
52d0: 66 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20  f("Got an error 
52e0: 77 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64  with a completed
52f0: 20 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20   handshake: err 
5300: 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a  = %i", err);..}.
5310: 09 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  .ret = 1;.    }.
5320: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
5330: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77  turning TCL_OK w
5340: 69 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22  ith data \"%i\""
5350: 2c 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f  , ret);.    Tcl_
5360: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
5370: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
5380: 62 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65  bj(ret));.    re
5390: 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63  turn(TCL_OK);..c
53a0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
53b0: 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ntData;.}../*. *
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5400: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74  ---. *. * Import
5410: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
5420: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
5430: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
5440: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63  cess the "ssl" c
5450: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65  ommand. *. *.The
5460: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73   ssl command pus
5470: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28  hes SSL over a (
5480: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29  newly connected)
5490: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20   tcp socket. *. 
54a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
54b0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
54c0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
54d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
54e0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76  modify the behav
54f0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61  ior of an IO cha
5500: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5550: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d  */.static int.Im
5560: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
5570: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
5580: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
5590: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
55a0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
55b0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
55c0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
55d0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
55e0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
55f0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
5600: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
5610: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
5620: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
5630: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20  SSL_CTX *ctx.   
5640: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
5650: 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74   Tcl_Obj *script
5660: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
5670: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
5680: 73 73 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d  ssword.        =
5690: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
56a0: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e  String upperChan
56b0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  nelTranslation, 
56c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
56d0: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  king, upperChann
56e0: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65  elEncoding, uppe
56f0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b  rChannelEOFChar;
5700: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65  .    int idx, le
5710: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
5720: 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f  ..        = TLS_
5730: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e  TCL_INIT;.    in
5740: 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20  t server..      
5750: 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e    = 0;./* is con
5760: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67  nection incoming
5770: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f   or outgoing? */
5780: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69  .    char *keyfi
5790: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
57a0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72  L;.    char *cer
57b0: 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  tfile.        = 
57c0: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e  NULL;.    unsign
57d0: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d  ed char *key  .=
57e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b   NULL;.    int k
57f0: 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20  ey_len          
5800: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20         = 0;.    
5810: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
5820: 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55  ert         = NU
5830: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74  LL;.    int cert
5840: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  _len            
5850: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61      = 0;.    cha
5860: 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20  r *ciphers.     
5870: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
5880: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20  har *CAfile.    
5890: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
58a0: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20  char *CAdir..   
58b0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
58c0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09   char *DHparams.
58d0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
58e0: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09      char *model.
58f0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
5900: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
5910: 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 63  _NO_TLSEXT.    c
5920: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09  har *servername.
5930: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09          = NULL;.
5940: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20  /* hostname for 
5950: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69  Server Name Indi
5960: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 54 63  cation */.    Tc
5970: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e  l_Obj *alpn..= N
5980: 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ULL;.#endif.    
5990: 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73  int ssl2 = 0, ss
59a0: 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  l3 = 0;.    int 
59b0: 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31  tls1 = 1, tls1_1
59c0: 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31   = 1, tls1_2 = 1
59d0: 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20  , tls1_3 = 1;.  
59e0: 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 3b    int proto = 0;
59f0: 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79 20  .    int verify 
5a00: 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30  = 0, require = 0
5a10: 2c 20 72 65 71 75 65 73 74 20 3d 20 31 3b 0a 0a  , request = 1;..
5a20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
5a30: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  led");..#if OPEN
5a40: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
5a50: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
5a60: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
5a70: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 20 26 26  NSSL_NO_SSL2) &&
5a80: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
5a90: 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f  ) && defined(NO_
5aa0: 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66 69 6e  TLS1_1) && defin
5ab0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
5ac0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
5ad0: 5f 33 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  _3) && defined(N
5ae0: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
5af0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  ned(NO_SSL2).   
5b00: 20 73 73 6c 32 20 3d 20 31 3b 0a 23 65 6e 64 69   ssl2 = 1;.#endi
5b10: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f  f.#if !defined(O
5b20: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
5b30: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
5b40: 53 31 29 20 26 26 20 64 65 66 69 6e 65 64 28 4e  S1) && defined(N
5b50: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 64 65 66  O_TLS1_1) && def
5b60: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
5b70: 26 26 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  && defined(NO_TL
5b80: 53 31 5f 33 29 20 26 26 20 64 65 66 69 6e 65 64  S1_3) && defined
5b90: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
5ba0: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 0a 20  fined(NO_SSL3). 
5bb0: 20 20 20 73 73 6c 33 20 3d 20 31 3b 0a 23 65 6e     ssl3 = 1;.#en
5bc0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
5bd0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
5be0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
5bf0: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
5c00: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
5c10: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
5c20: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
5c30: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
5c40: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23     tls1_1 = 0;.#
5c50: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
5c60: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
5c70: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
5c80: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74  NO_TLS1_2).    t
5c90: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_2 = 0;.#endi
5ca0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
5cb0: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
5cc0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
5cd0: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_3).    tls1_
5ce0: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  3 = 0;.#endif.. 
5cf0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
5d00: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
5d10: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
5d20: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f  objv, "channel ?
5d30: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74  options?");..ret
5d40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
5d50: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
5d60: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
5d70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
5d80: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
5d90: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
5da0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
5db0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
5dc0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
5dd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
5de0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
5df0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
5e00: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
5e10: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20  pmost channel.  
5e20: 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d     */.    chan =
5e30: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
5e40: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
5e50: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
5e60: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
5e70: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54  {..char *opt = T
5e80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
5e90: 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e  Obj(objv[idx], N
5ea0: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b  ULL);...if (opt[
5eb0: 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20  0] != '-')..    
5ec0: 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 53 54 52 28  break;...OPTSTR(
5ed0: 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29  "-cadir", CAdir)
5ee0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69  ;..OPTSTR("-cafi
5ef0: 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f  le", CAfile);..O
5f00: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65  PTSTR("-certfile
5f10: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f  ", certfile);..O
5f20: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c  PTSTR("-cipher",
5f30: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 4f   ciphers);..OPTO
5f40: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  BJ("-command", s
5f50: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
5f60: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70  "-dhparams", DHp
5f70: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 53 54 52 28  arams);..OPTSTR(
5f80: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66  "-keyfile", keyf
5f90: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ile);..OPTSTR("-
5fa0: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a  model", model);.
5fb0: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f  .OPTOBJ("-passwo
5fc0: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a  rd", password);.
5fd0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69  .OPTBOOL("-requi
5fe0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
5ff0: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73  OPTBOOL("-reques
6000: 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f  t", request);..O
6010: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22  PTBOOL("-server"
6020: 2c 20 73 65 72 76 65 72 29 3b 0a 23 69 66 6e 64  , server);.#ifnd
6030: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ef OPENSSL_NO_TL
6040: 53 45 58 54 0a 09 4f 50 54 53 54 52 28 22 2d 73  SEXT..OPTSTR("-s
6050: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
6060: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a  ername);..OPTOBJ
6070: 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b  ("-alpn", alpn);
6080: 0a 23 65 6e 64 69 66 0a 0a 09 4f 50 54 42 4f 4f  .#endif...OPTBOO
6090: 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29  L("-ssl2", ssl2)
60a0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
60b0: 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42  3", ssl3);..OPTB
60c0: 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73  OOL("-tls1", tls
60d0: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  1);..OPTBOOL("-t
60e0: 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b  ls1.1", tls1_1);
60f0: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
6100: 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f  .2", tls1_2);..O
6110: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22  PTBOOL("-tls1.3"
6120: 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 42  , tls1_3);..OPTB
6130: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72  YTE("-cert", cer
6140: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f  t, cert_len);..O
6150: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b  PTBYTE("-key", k
6160: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 0a 09  ey, key_len);...
6170: 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c  OPTBAD("option",
6180: 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c   "-alpn, -cadir,
6190: 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c   -cafile, -cert,
61a0: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70   -certfile, -cip
61b0: 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d  her, -command, -
61c0: 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20  dhparams, -key, 
61d0: 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c  -keyfile, -model
61e0: 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 72 65  , -password, -re
61f0: 71 75 69 72 65 2c 20 2d 72 65 71 75 65 73 74 2c  quire, -request,
6200: 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65   -server, -serve
6210: 72 6e 61 6d 65 2c 20 2d 73 73 6c 32 2c 20 2d 73  rname, -ssl2, -s
6220: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73  sl3, -tls1, -tls
6230: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 6f 72  1.1, -tls1.2, or
6240: 20 2d 74 6c 73 31 2e 33 22 29 3b 0a 0a 09 72 65   -tls1.3");...re
6250: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6260: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65      }.    if (re
6270: 71 75 65 73 74 29 09 20 20 20 20 76 65 72 69 66  quest).    verif
6280: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
6290: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53  CLIENT_ONCE | SS
62a0: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20  L_VERIFY_PEER;. 
62b0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
62c0: 26 20 72 65 71 75 69 72 65 29 20 76 65 72 69 66  & require) verif
62d0: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
62e0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
62f0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 76 65  CERT;.    if (ve
6300: 72 69 66 79 20 3d 3d 20 30 29 09 76 65 72 69 66  rify == 0).verif
6310: 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e  y = SSL_VERIFY_N
6320: 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20  ONE;..    proto 
6330: 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50  |= (ssl2 ? TLS_P
6340: 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a  ROTO_SSL2 : 0);.
6350: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
6360: 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l3 ? TLS_PROTO_S
6370: 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL3 : 0);.    pr
6380: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54  oto |= (tls1 ? T
6390: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20  LS_PROTO_TLS1 : 
63a0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
63b0: 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50   (tls1_1 ? TLS_P
63c0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29  ROTO_TLS1_1 : 0)
63d0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
63e0: 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f  tls1_2 ? TLS_PRO
63f0: 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a  TO_TLS1_2 : 0);.
6400: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
6410: 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_3 ? TLS_PROTO
6420: 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20  _TLS1_3 : 0);.. 
6430: 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e     /* reset to N
6440: 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72  ULL if blank str
6450: 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a  ing provided */.
6460: 20 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20      if (cert && 
6470: 21 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20  !*cert)..       
6480: 20 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20   cert.        = 
6490: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
64a0: 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20  y && !*key)..   
64b0: 20 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20       key.       
64c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
64d0: 28 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63  (certfile && !*c
64e0: 65 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20  ertfile)        
64f0: 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c   certfile.= NULL
6500: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c  ;.    if (keyfil
6510: 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09  e && !*keyfile).
6520: 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20  .keyfile.       
6530: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
6540: 28 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69  (ciphers && !*ci
6550: 70 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63  phers).        c
6560: 69 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d  iphers.        =
6570: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
6580: 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c  Afile && !*CAfil
6590: 65 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c  e).        CAfil
65a0: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
65b0: 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20  ;.    if (CAdir 
65c0: 26 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20  && !*CAdir).    
65d0: 20 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20      CAdir.      
65e0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
65f0: 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a   (DHparams && !*
6600: 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20  DHparams).      
6610: 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20    DHparams      
6620: 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f    = NULL;..    /
6630: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20  * new SSL state 
6640: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09  */.    statePtr.
6650: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61  .= (State *) cka
6660: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
6670: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
6680: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65      memset(state
6690: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  Ptr, 0, sizeof(S
66a0: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61  tate));..    sta
66b0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66  tePtr->flags.= f
66c0: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50  lags;.    stateP
66d0: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74  tr->interp.= int
66e0: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74  erp;.    statePt
66f0: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69  r->vflags.= veri
6700: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  fy;.    statePtr
6710: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20  ->err.= "";..   
6720: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72   /* allocate scr
6730: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ipt */.    if (s
6740: 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29  cript) {..(void)
6750: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
6760: 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c  omObj(script, &l
6770: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
6780: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
6790: 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70  callback = scrip
67a0: 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  t;..    Tcl_Incr
67b0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
67c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d  r->callback);..}
67d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
67e0: 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64  llocate password
67f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73   */.    if (pass
6800: 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20  word) {..(void) 
6810: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
6820: 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26  mObj(password, &
6830: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
6840: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
6850: 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73  >password = pass
6860: 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49  word;..    Tcl_I
6870: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
6880: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
6890: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ..}.    }..    i
68a0: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c  f (model != NULL
68b0: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09  ) {..int mode;..
68c0: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65  /* Get the "mode
68d0: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63  l" context */..c
68e0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
68f0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64  nnel(interp, mod
6900: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20  el, &mode);..if 
6910: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
6920: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
6930: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
6940: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
6950: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
6960: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a  _ERROR;..}.../*.
6970: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
6980: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
6990: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
69a0: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
69b0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
69c0: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47  han);..if (Tcl_G
69d0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
69e0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
69f0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20  elType()) {..   
6a00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
6a10: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
6a20: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
6a30: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
6a40: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
6a50: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
6a60: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
6a70: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
6a80: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
6a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6aa0: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61  ..}..ctx = ((Sta
6ab0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
6ac0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
6ad0: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20  chan))->ctx;.   
6ae0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28   } else {..if ((
6af0: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73  ctx = CTX_Init(s
6b00: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c  tatePtr, server,
6b10: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c   proto, keyfile,
6b20: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20   certfile, key, 
6b30: 63 65 72 74 2c 0a 09 20 20 20 20 6b 65 79 5f 6c  cert,..    key_l
6b40: 65 6e 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41  en, cert_len, CA
6b50: 64 69 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70  dir, CAfile, cip
6b60: 68 65 72 73 2c 20 44 48 70 61 72 61 6d 73 29 29  hers, DHparams))
6b70: 20 3d 3d 20 28 53 53 4c 5f 43 54 58 2a 29 30 29   == (SSL_CTX*)0)
6b80: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
6b90: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
6ba0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
6bb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
6bc0: 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50     }..    stateP
6bd0: 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a  tr->ctx = ctx;..
6be0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
6bf0: 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75   need to make su
6c00: 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e  re that the chan
6c10: 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e  nel works in bin
6c20: 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20  ary (for the.   
6c30: 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e    * encryption n
6c40: 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64  ot to get goofed
6c50: 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20   up)..     * We 
6c60: 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a  only want to adj
6c70: 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69 6e  ust the bufferin
6c80: 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e  g in pre-v2 chan
6c90: 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20  nels, where.    
6ca0: 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20   * each channel 
6cb0: 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69  in the stack mai
6cc0: 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20  ntained its own 
6cd0: 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f  buffers..     */
6ce0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
6cf0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
6d00: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
6d10: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
6d20: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
6d30: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
6d40: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
6d50: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
6d60: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
6d70: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
6d80: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
6d90: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
6da0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
6db0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63  rp, chan, "-eofc
6dc0: 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e  har", &upperChan
6dd0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
6de0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
6df0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
6e00: 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  an, "-encoding",
6e10: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e   &upperChannelEn
6e20: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
6e30: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
6e40: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
6e50: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
6e60: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
6e70: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
6e80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
6e90: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
6ea0: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26  , "-blocking", &
6eb0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
6ec0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53  king);.    Tcl_S
6ed0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
6ee0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
6ef0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62  translation", "b
6f00: 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c  inary");.    Tcl
6f10: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
6f20: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
6f30: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72  "-blocking", "tr
6f40: 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  ue");.    dprint
6f50: 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c  f("Consuming Tcl
6f60: 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63   channel %s", Tc
6f70: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6f80: 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61  (chan));.    sta
6f90: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63  tePtr->self = Tc
6fa0: 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69  l_StackChannel(i
6fb0: 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e  nterp, Tls_Chann
6fc0: 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e  elType(), (Clien
6fd0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c  tData) statePtr,
6fe0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
6ff0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
7000: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
7010: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
7020: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
7030: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
7040: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
7050: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
7060: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
7070: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
7080: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
7090: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
70a0: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
70b0: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
70c0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
70d0: 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20  .Tls_Free((char 
70e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72  *) statePtr);..r
70f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
7110: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
7120: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
7130: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
7140: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
7150: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
7160: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
7170: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
7180: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
7190: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
71a0: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
71b0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
71c0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
71d0: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
71e0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
71f0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
7200: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
7210: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
7220: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
7230: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
7240: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
7250: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
7260: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
7270: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
7280: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
7290: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
72a0: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a 20 20 20  Blocking));..   
72b0: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49   /*.     * SSL I
72c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20  nitialization.  
72d0: 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50     */.    stateP
72e0: 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65  tr->ssl = SSL_ne
72f0: 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  w(statePtr->ctx)
7300: 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65  ;.    if (!state
7310: 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20  Ptr->ssl) {../* 
7320: 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f  SSL library erro
7330: 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  r */..Tcl_Append
7340: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7350: 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75  couldn't constru
7360: 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20  ct ssl session: 
7370: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
7380: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
7390: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
73a0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
73b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
73c0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45    }..#ifndef OPE
73d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20  NSSL_NO_TLSEXT. 
73e0: 20 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d     if (servernam
73f0: 65 29 20 7b 0a 09 69 66 20 28 21 53 53 4c 5f 73  e) {..if (!SSL_s
7400: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e  et_tlsext_host_n
7410: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
7420: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26  l, servername) &
7430: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20  & require) {..  
7440: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7450: 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74 74  lt(interp, "sett
7460: 69 6e 67 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d  ing TLS host nam
7470: 65 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c  e extension fail
7480: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
7490: 4c 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  LL);.           
74a0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
74b0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20  *) statePtr);.  
74c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
74d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
74e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
74f0: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20  if (alpn) {../* 
7500: 43 6f 6e 76 65 72 74 20 61 20 54 63 6c 20 6c 69  Convert a Tcl li
7510: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63  st into a protoc
7520: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d  ol-list in wire-
7530: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67  format */..unsig
7540: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73  ned char *protos
7550: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , *p;..unsigned 
7560: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  int protos_len =
7570: 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c   0;..int i, len,
7580: 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a   cnt;..Tcl_Obj *
7590: 2a 6c 69 73 74 3b 0a 09 69 66 20 28 54 63 6c 5f  *list;..if (Tcl_
75a0: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
75b0: 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c  ts(interp, alpn,
75c0: 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d   &cnt, &list) !=
75d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
75e0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
75f0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
7600: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7610: 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 44 65 74 65 72  OR;..}../* Deter
7620: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
7630: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
7640: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
7650: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
7660: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
7670: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
7680: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
7690: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
76a0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
76b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
76c0: 74 28 69 6e 74 65 72 70 2c 20 22 61 6c 70 6e 20  t(interp, "alpn 
76d0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f  protocol name to
76e0: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a  o long", (char *
76f0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46  ) NULL);...Tls_F
7700: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
7710: 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e  tePtr);...return
7720: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
7730: 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c   }..    protos_l
7740: 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09  en += 1 + len;..
7750: 7d 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  }../* Build the 
7760: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f  complete protoco
7770: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f  l-list */..proto
7780: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74  s = ckalloc(prot
7790: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f  os_len);../* pro
77a0: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73  tocol-lists cons
77b0: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e  ist of 8-bit len
77c0: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79  gth-prefixed, by
77d0: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66  te strings */..f
77e0: 6f 72 20 28 69 20 3d 20 30 2c 20 70 20 3d 20 70  or (i = 0, p = p
77f0: 72 6f 74 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20  rotos; i < cnt; 
7800: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  i++) {..    char
7810: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53   *str = Tcl_GetS
7820: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
7830: 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[i], &len);..  
7840: 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20    *p++ = len;.. 
7850: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72     memcpy(p, str
7860: 2c 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b  , len);..    p +
7870: 3d 20 6c 65 6e 3b 0a 09 7d 0a 09 2f 2a 20 4e 6f  = len;..}../* No
7880: 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  te: This functio
7890: 6e 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20  ns reverses the 
78a0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
78b0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
78c0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
78d0: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
78e0: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
78f0: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
7900: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7910: 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65 64 20  interp, "failed 
7920: 74 6f 20 73 65 74 20 61 6c 70 6e 20 70 72 6f 74  to set alpn prot
7930: 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20 2a 29  ocols", (char *)
7940: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
7950: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
7960: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
7970: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
7980: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7990: 52 52 4f 52 3b 0a 09 7d 0a 09 2f 2a 20 53 53 4c  RROR;..}../* SSL
79a0: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
79b0: 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66   makes a copy of
79c0: 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69   the protocol-li
79d0: 73 74 20 2a 2f 0a 09 63 6b 66 72 65 65 28 70 72  st */..ckfree(pr
79e0: 6f 74 6f 73 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  otos);.    }.#en
79f0: 64 69 66 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  dif..    /*.    
7a00: 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73   * SSL Callbacks
7a10: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c  .     */.    SSL
7a20: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74  _set_app_data(st
7a30: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
7a40: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09  id *)statePtr);.
7a50: 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f  /* point back to
7a60: 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73   us */.    SSL_s
7a70: 65 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50  et_verify(stateP
7a80: 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c  tr->ssl, verify,
7a90: 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29   VerifyCallback)
7aa0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ;.    SSL_CTX_se
7ab0: 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28  t_info_callback(
7ac0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 49  statePtr->ctx, I
7ad0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20  nfoCallback);.. 
7ae0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
7af0: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
7b00: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
7b10: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
7b20: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
7b30: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
7b40: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
7b50: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
7b60: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
7b70: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
7b80: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
7b90: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45  |= TLS_TCL_SERVE
7ba0: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65  R;..SSL_set_acce
7bb0: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  pt_state(statePt
7bc0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
7bd0: 6c 73 65 20 7b 0a 09 53 53 4c 5f 73 65 74 5f 63  lse {..SSL_set_c
7be0: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61  onnect_state(sta
7bf0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
7c00: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62   }.    SSL_set_b
7c10: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  io(statePtr->ssl
7c20: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
7c30: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  o, statePtr->p_b
7c40: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74  io);.    BIO_set
7c50: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _ssl(statePtr->b
7c60: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  io, statePtr->ss
7c70: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  l, BIO_NOCLOSE);
7c80: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
7c90: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a  End of SSL Init.
7ca0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69       */.    dpri
7cb0: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25  ntf("Returning %
7cc0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
7cd0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
7ce0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c  >self));.    Tcl
7cf0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
7d00: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f  p, (char *) Tcl_
7d10: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
7d20: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
7d30: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a  TCL_VOLATILE);..
7d40: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
7d50: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
7d60: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
7d70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
7dc0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
7dd0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
7de0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
7df0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
7e00: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
7e10: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
7e20: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
7e30: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
7e40: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7e50: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
7e60: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
7e70: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
7e80: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
7ed0: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
7ee0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
7ef0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
7f00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7f10: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
7f20: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
7f30: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
7f40: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
7f50: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
7f60: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
7f70: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
7f80: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
7f90: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
7fa0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
7fb0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
7fc0: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
7fd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7fe0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
7ff0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
8000: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
8010: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
8020: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
8030: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
8040: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
8050: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
8060: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
8070: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72  .     * Make sur
8080: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
8090: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
80a0: 6e 65 6c 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nel.     */.    
80b0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
80c0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
80d0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
80e0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
80f0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
8100: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
8110: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8120: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
8130: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
8140: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
8150: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
8160: 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29   channel", NULL)
8170: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
8180: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8190: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43  if (Tcl_UnstackC
81a0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
81b0: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
81c0: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  R) {..return TCL
81d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
81e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
81f0: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
8200: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
8210: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
8260: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
8270: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
8280: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
8290: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
82a0: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
82b0: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
82c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
82d0: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
82e0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
82f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8330: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8340: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
8350: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
8360: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
8370: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
8380: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
8390: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
83a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
83b0: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
83c0: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74   char *cert, int
83d0: 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65   key_len, int ce
83e0: 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41  rt_len, char *CA
83f0: 64 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43  dir,.    char *C
8400: 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70  Afile, char *cip
8410: 68 65 72 73 2c 20 63 68 61 72 20 2a 44 48 70 61  hers, char *DHpa
8420: 72 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f  rams) {.    Tcl_
8430: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d  Interp *interp =
8440: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
8450: 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  p;.    SSL_CTX *
8460: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ctx = NULL;.    
8470: 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a  Tcl_DString ds;.
8480: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
8490: 64 73 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66  ds1;.    int off
84a0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f   = 0;.    int lo
84b0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a  ad_private_key;.
84c0: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45      const SSL_ME
84d0: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20  THOD *method;.. 
84e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
84f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21  ed");..    if (!
8500: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70  proto) {..Tcl_Ap
8510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8520: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f  p, "no valid pro
8530: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c  tocol selected",
8540: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
8550: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20  (SSL_CTX *)0;.  
8560: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
8570: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
8580: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
8590: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
85a0: 30 78 31 30 31 30 31 30 30 30 4c 20 7c 7c 20 64  0x10101000L || d
85b0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
85c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
85d0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
85e0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
85f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
8600: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
8610: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8620: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
8630: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
8640: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53  ULL);..return (S
8650: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20  SL_CTX *)0;.    
8660: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
8670: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c  ined(NO_SSL3) ||
8680: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
8690: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66  _NO_SSL3).    if
86a0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
86b0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
86c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
86d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
86e0: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL3 protocol not
86f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
8700: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c  L);..return (SSL
8710: 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a  _CTX *)0;.    }.
8720: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
8730: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64  ed(NO_TLS1) || d
8740: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8750: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28  O_TLS1).    if (
8760: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
8770: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20  LS_PROTO_TLS1)) 
8780: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
8790: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
87a0: 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.0 protocol no
87b0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
87c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53  LL);..return (SS
87d0: 4c 5f 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d  L_CTX *)0;.    }
87e0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
87f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
8800: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
8810: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
8820: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
8830: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
8840: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
8850: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8860: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
8870: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
8880: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
8890: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
88a0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
88b0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
88c0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
88d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
88e0: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
88f0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
8900: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
8910: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
8920: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
8930: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
8940: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
8950: 29 3b 0a 09 72 65 74 75 72 6e 20 28 53 53 4c 5f  );..return (SSL_
8960: 43 54 58 20 2a 29 30 3b 0a 20 20 20 20 7d 0a 23  CTX *)0;.    }.#
8970: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
8980: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
8990: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
89a0: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
89b0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
89c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
89d0: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _3)) {..Tcl_Appe
89e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
89f0: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63   "TLS 1.3 protoc
8a00: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
8a10: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
8a20: 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a  n (SSL_CTX *)0;.
8a30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
8a40: 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29    switch (proto)
8a50: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
8a60: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
8a70: 30 78 31 30 31 30 31 30 30 30 4c 20 26 26 20 21  0x10101000L && !
8a80: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
8a90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8aa0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
8ab0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
8ac0: 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL2:..method =
8ad0: 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b   SSLv2_method();
8ae0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
8af0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8b00: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
8b10: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
8b20: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  3).    case TLS_
8b30: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
8b40: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68  hod = SSLv3_meth
8b50: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
8b60: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8b70: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
8b80: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8b90: 4f 5f 54 4c 53 31 29 0a 20 20 20 20 63 61 73 65  O_TLS1).    case
8ba0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
8bb0: 0a 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31  ..method = TLSv1
8bc0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
8bd0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
8be0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
8bf0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8c00: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
8c10: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
8c20: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
8c30: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65  hod = TLSv1_1_me
8c40: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
8c50: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8c60: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
8c70: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8c80: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
8c90: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
8ca0: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
8cb0: 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f   = TLSv1_2_metho
8cc0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
8cd0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8ce0: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
8cf0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8d00: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63  NO_TLS1_3).    c
8d10: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
8d20: 53 31 5f 33 3a 0a 09 2f 2a 0a 09 20 2a 20 54 68  S1_3:../*.. * Th
8d30: 65 20 76 65 72 73 69 6f 6e 20 72 61 6e 67 65 20  e version range 
8d40: 69 73 20 63 6f 6e 73 74 72 61 69 6e 65 64 20 62  is constrained b
8d50: 65 6c 6f 77 2c 0a 09 20 2a 20 61 66 74 65 72 20  elow,.. * after 
8d60: 74 68 65 20 63 6f 6e 74 65 78 74 20 69 73 20 63  the context is c
8d70: 72 65 61 74 65 64 2e 20 20 55 73 65 20 74 68 65  reated.  Use the
8d80: 0a 09 20 2a 20 67 65 6e 65 72 69 63 20 6d 65 74  .. * generic met
8d90: 68 6f 64 20 68 65 72 65 2e 0a 09 20 2a 2f 0a 09  hod here... */..
8da0: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74  method = TLS_met
8db0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
8dc0: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
8dd0: 74 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  t:.#if OPENSSL_V
8de0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
8df0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 09 2f 2a   0x10100000L../*
8e00: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
8e10: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
8e20: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
8e30: 09 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65  .method = TLS_me
8e40: 74 68 6f 64 28 29 3b 0a 23 65 6c 73 65 0a 09 6d  thod();.#else..m
8e50: 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 33 5f 6d  ethod = SSLv23_m
8e60: 65 74 68 6f 64 28 29 3b 0a 23 65 6e 64 69 66 0a  ethod();.#endif.
8e70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
8e80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
8e90: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
8ea0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
8eb0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8ec0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
8ed0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
8ee0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
8ef0: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
8f00: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
8f10: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8f20: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
8f30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8f40: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
8f50: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
8f60: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
8f70: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
8f80: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
8f90: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8fa0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
8fb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8fc0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
8fd0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
8fe0: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
8ff0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
9000: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
9010: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
9020: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
9030: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
9040: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
9050: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
9060: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
9070: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
9080: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
9090: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
90a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
90b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
90c0: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
90d0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
90e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
90f0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
9100: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
9110: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
9120: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
9130: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9140: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
9150: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
9160: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
9170: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
9180: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
9190: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
91a0: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
91b0: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a  TX_new(method);.
91c0: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b  .    if (!ctx) {
91d0: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
91e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67      }..    if (g
91f0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
9200: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58  ILE)) {..SSL_CTX
9210: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c  _set_keylog_call
9220: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67  back(ctx, KeyLog
9230: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
9240: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
9250: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
9260: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
9270: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
9280: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52  (proto == TLS_PR
9290: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53  OTO_TLS1_3) {..S
92a0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
92b0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
92c0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
92d0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
92e0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
92f0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
9300: 52 53 49 4f 4e 29 3b 0a 0a 09 69 66 20 28 21 69  RSION);...if (!i
9310: 73 53 65 72 76 65 72 29 20 7b 0a 09 20 20 20 20  sServer) {..    
9320: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
9330: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
9340: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
9350: 45 46 45 52 45 4e 43 45 29 3b 0a 09 7d 0a 20 20  EFERENCE);..}.  
9360: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
9370: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
9380: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
9390: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
93a0: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
93b0: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
93c0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
93d0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
93e0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
93f0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
9400: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
9410: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
9420: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
9430: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
9440: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  s */.#if OPENSSL
9450: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
9460: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20  < 0x10101000L.  
9470: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f    SSL_CTX_set_mo
9480: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45  de(ctx, SSL_MODE
9490: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a  _AUTO_RETRY);./*
94a0: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64   handle new hand
94b0: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72  shakes in backgr
94c0: 6f 75 6e 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ound */.#endif. 
94d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f     SSL_CTX_sess_
94e0: 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63  set_cache_size(c
94f0: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 69  tx, 128);..    i
9500: 66 20 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55  f (ciphers != NU
9510: 4c 4c 29 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  LL)..SSL_CTX_set
9520: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
9530: 2c 20 63 69 70 68 65 72 73 29 3b 0a 0a 20 20 20  , ciphers);..   
9540: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
9550: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
9560: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
9570: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
9580: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
9590: 6b 29 3b 0a 0a 23 69 66 6e 64 65 66 20 42 53 41  k);..#ifndef BSA
95a0: 46 45 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  FE.    SSL_CTX_s
95b0: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77  et_default_passw
95c0: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74  d_cb_userdata(ct
95d0: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
95e0: 50 74 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Ptr);.#endif..  
95f0: 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66    /* read a Diff
9600: 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d  ie-Hellman param
9610: 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75  eters file, or u
9620: 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  se the built-in 
9630: 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50  one */.#ifdef OP
9640: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20  ENSSL_NO_DH.    
9650: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
9660: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
9670: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9680: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20  , "DH parameter 
9690: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69  support not avai
96a0: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29  lable", (char *)
96b0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
96c0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
96d0: 75 72 6e 20 28 53 53 4c 5f 43 54 58 20 2a 29 30  urn (SSL_CTX *)0
96e0: 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20  ;.    }.#else.  
96f0: 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66    {..DH* dh;..if
9700: 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55   (DHparams != NU
9710: 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a  LL) {..    BIO *
9720: 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  bio;..    Tcl_DS
9730: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
9740: 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e  .    bio = BIO_n
9750: 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61  ew_file(F2N(DHpa
9760: 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29  rams, &ds), "r")
9770: 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29  ;..    if (!bio)
9780: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
9790: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c  Free(&ds);...Tcl
97a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
97b0: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
97c0: 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74   find DH paramet
97d0: 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72  ers file", (char
97e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
97f0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
9800: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
9810: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 0a 09  X *)0;..    }...
9820: 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61      dh = PEM_rea
9830: 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62  d_bio_DHparams(b
9840: 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  io, NULL, NULL, 
9850: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
9860: 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20  free(bio);..    
9870: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
9880: 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21  &ds);..    if (!
9890: 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  dh) {...Tcl_Appe
98a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
98b0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64   "Could not read
98c0: 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66   DH parameters f
98d0: 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72  rom file", (char
98e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
98f0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
9900: 09 09 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54  ..return (SSL_CT
9910: 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d 0a 09 7d  X *)0;..    }..}
9920: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20   else {..    dh 
9930: 3d 20 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29  = get_dhParams()
9940: 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ;..}..SSL_CTX_se
9950: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68  t_tmp_dh(ctx, dh
9960: 29 3b 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b  );..DH_free(dh);
9970: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
9980: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65     /* set our ce
9990: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20  rtificate */.   
99a0: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65   load_private_ke
99b0: 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63  y = 0;.    if (c
99c0: 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  ertfile != NULL)
99d0: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65   {..load_private
99e0: 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f  _key = 1;...Tcl_
99f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
9a00: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
9a10: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
9a20: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65  file(ctx, F2N(ce
9a30: 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53  rtfile, &ds), SS
9a40: 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20  L_FILETYPE_PEM) 
9a50: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
9a60: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
9a70: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
9a80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9a90: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
9aa0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
9ab0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
9ac0: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
9ad0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
9ae0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
9af0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
9b00: 20 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43     return (SSL_C
9b10: 54 58 20 2a 29 30 3b 0a 09 7d 0a 20 20 20 20 7d  TX *)0;..}.    }
9b20: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 21   else if (cert !
9b30: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
9b40: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
9b50: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
9b60: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41 53  e_certificate_AS
9b70: 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e  N1(ctx, cert_len
9b80: 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a  , cert) <= 0) {.
9b90: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9ba0: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
9bb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9bc0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
9bd0: 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69 63   to set certific
9be0: 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  ate: ",....     
9bf0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
9c00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
9c10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
9c20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 53  ;..    return (S
9c30: 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d 0a 20  SL_CTX *)0;..}. 
9c40: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72     } else {..cer
9c50: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58  tfile = (char*)X
9c60: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  509_get_default_
9c70: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69  cert_file();...i
9c80: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
9c90: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
9ca0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53  ctx, certfile, S
9cb0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
9cc0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09   <= 0) {.#if 0..
9cd0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
9ce0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54  ree(&ds);..    T
9cf0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d00: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
9d10: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 63  to use default c
9d20: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
9d30: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
9d40: 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f  ",....     REASO
9d50: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
9d60: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
9d70: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
9d80: 20 20 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54    return (SSL_CT
9d90: 58 20 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 09 7d  X *)0;.#endif..}
9da0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
9db0: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b  et our private k
9dc0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f  ey */.    if (lo
9dd0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20  ad_private_key) 
9de0: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d  {..if (keyfile =
9df0: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d  = NULL && key ==
9e00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65   NULL) {..    ke
9e10: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
9e20: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69  ;..}...if (keyfi
9e30: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
9e40: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72     /* get the pr
9e50: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
9e60: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
9e70: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
9e80: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d     if (keyfile =
9e90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66  = NULL) {...keyf
9ea0: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
9eb0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
9ec0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
9ed0: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
9ee0: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
9ef0: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
9f00: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
9f10: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
9f20: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
9f30: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
9f40: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
9f50: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
9f60: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
9f70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
9f80: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
9f90: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
9fa0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
9fb0: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
9fc0: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
9fd0: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20  yfile, " ",.... 
9fe0: 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28 29          REASON()
9ff0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a000: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
a010: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
a020: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 20  (SSL_CTX *)0;.. 
a030: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
a040: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
a050: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79  ..} else if (key
a060: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
a070: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
a080: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31  _PrivateKey_ASN1
a090: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63  (EVP_PKEY_RSA, c
a0a0: 74 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29  tx, key,key_len)
a0b0: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
a0c0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
a0d0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
a0e0: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
a0f0: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
a100: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
a110: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
a120: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
a130: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
a140: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a150: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
a160: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a   set public key:
a170: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63   ", REASON(), (c
a180: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
a190: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
a1a0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 28 53 53 4c  );...return (SSL
a1b0: 5f 43 54 58 20 2a 29 30 3b 0a 09 20 20 20 20 7d  _CTX *)0;..    }
a1c0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
a1d0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
a1e0: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
a1f0: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
a200: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
a210: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
a220: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
a230: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
a240: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a250: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
a260: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
a270: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
a280: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
a290: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
a2a0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a2b0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
a2c0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
a2d0: 28 53 53 4c 5f 43 54 58 20 2a 29 30 3b 0a 09 7d  (SSL_CTX *)0;..}
a2e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
a2f0: 65 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  et verification 
a300: 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  CAs */.    Tcl_D
a310: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
a320: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a330: 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20  Init(&ds1);.    
a340: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
a350: 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f  d_verify_locatio
a360: 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69  ns(ctx, F2N(CAfi
a370: 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41  le, &ds), F2N(CA
a380: 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09  dir, &ds1)) ||..
a390: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
a3a0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
a3b0: 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a  s(ctx)) {.#if 0.
a3c0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
a3d0: 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72  (&ds);..Tcl_DStr
a3e0: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09  ingFree(&ds1);..
a3f0: 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74  /* Don't current
a400: 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20  ly care if this 
a410: 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70  fails */..Tcl_Ap
a420: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a430: 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20  p, "SSL default 
a440: 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c  verify paths: ",
a450: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
a460: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
a470: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
a480: 72 65 74 75 72 6e 20 28 53 53 4c 5f 43 54 58 20  return (SSL_CTX 
a490: 2a 29 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  *)0;.#endif.    
a4a0: 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  }..    /* https:
a4b0: 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
a4c0: 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
a4d0: 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54   */.    /* XXX:T
a4e0: 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65  ODO: Let the use
a4f0: 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20  r supply values 
a500: 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20  here instead of 
a510: 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65  something that e
a520: 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c  xists on the fil
a530: 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69  esystem */.    i
a540: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
a550: 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58  L) {..STACK_OF(X
a560: 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e  509_NAME) *certN
a570: 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f  ames = SSL_load_
a580: 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46  client_CA_file(F
a590: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
a5a0: 3b 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73  ;..if (certNames
a5b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
a5c0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69   SSL_CTX_set_cli
a5d0: 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
a5e0: 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a   certNames);..}.
a5f0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
a600: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
a610: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a620: 46 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20  Free(&ds1);.    
a630: 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
a640: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a680: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
a690: 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
a6a0: 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
a6b0: 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
a6c0: 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  peer.. *. * Resu
a6d0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
a6e0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
a6f0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
a700: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
a710: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
a720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a750: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
a760: 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64  int.StatusObjCmd
a770: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
a780: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
a790: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
a7a0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
a7b0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
a7c0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
a7d0: 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65  tr;.    X509 *pe
a7e0: 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  er;.    Tcl_Obj 
a7f0: 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c  *objPtr;.    Tcl
a800: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20  _Channel chan;. 
a810: 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c     char *channel
a820: 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a  Name, *ciphers;.
a830: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 23 69      int mode;.#i
a840: 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f  fndef OPENSSL_NO
a850: 5f 54 4c 53 45 58 54 0a 20 20 20 20 63 6f 6e 73  _TLSEXT.    cons
a860: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
a870: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69  *proto;.    unsi
a880: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 23 65  gned int len;.#e
a890: 6e 64 69 66 0a 0a 20 20 20 20 64 70 72 69 6e 74  ndif..    dprint
a8a0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
a8b0: 20 20 73 77 69 74 63 68 20 28 6f 62 6a 63 29 20    switch (objc) 
a8c0: 7b 0a 09 63 61 73 65 20 32 3a 0a 09 20 20 20 20  {..case 2:..    
a8d0: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
a8e0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a8f0: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c  bj(objv[1], NULL
a900: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  );..    break;..
a910: 09 63 61 73 65 20 33 3a 0a 09 20 20 20 20 69 66  .case 3:..    if
a920: 20 28 21 73 74 72 63 6d 70 20 28 54 63 6c 5f 47   (!strcmp (Tcl_G
a930: 65 74 53 74 72 69 6e 67 20 28 6f 62 6a 76 5b 31  etString (objv[1
a940: 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 20 7b  ]), "-local")) {
a950: 0a 09 09 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d  ...channelName =
a960: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
a970: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 4e  omObj(objv[2], N
a980: 55 4c 4c 29 3b 0a 09 09 62 72 65 61 6b 3b 0a 09  ULL);...break;..
a990: 20 20 20 20 7d 0a 09 20 20 20 20 2f 2a 20 65 6c      }..    /* el
a9a0: 73 65 20 66 61 6c 6c 2d 74 68 72 6f 75 67 68 20  se fall-through 
a9b0: 2e 2e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ... */.#if defin
a9c0: 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 20 20  ed(__GNUC__)..  
a9d0: 20 20 5f 5f 61 74 74 72 69 62 75 74 65 5f 5f 28    __attribute__(
a9e0: 28 66 61 6c 6c 74 68 72 6f 75 67 68 29 29 3b 0a  (fallthrough));.
a9f0: 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a  #endif..default:
aa00: 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  ..    Tcl_WrongN
aa10: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
aa20: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c  , objv, "?-local
aa30: 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 20 20  ? channel");..  
aa40: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
aa50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
aa60: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
aa70: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
aa80: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29  nnelName, &mode)
aa90: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
aaa0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
aab0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
aac0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
aad0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d  .    /*.     * M
aae0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
aaf0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
ab00: 73 74 20 63 68 61 6e 6e 65 6c 0a 20 20 20 20 20  st channel.     
ab10: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
ab20: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
ab30: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
ab40: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
ab50: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
ab60: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
ab70: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
ab80: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
ab90: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
aba0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
abb0: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
abc0: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
abd0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
abe0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
abf0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
ac00: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65  (State *) Tcl_Ge
ac10: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
ac20: 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20  Data(chan);.    
ac30: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
ac40: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
ac50: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74  _peer_certificat
ac60: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
ac70: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
ac80: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  peer = SSL_get_c
ac90: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
aca0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
acb0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b  .    if (peer) {
acc0: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e  ..objPtr = Tls_N
acd0: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70  ewX509Obj(interp
ace0: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62  , peer);..if (ob
acf0: 6a 63 20 3d 3d 20 32 29 20 7b 20 58 35 30 39 5f  jc == 2) { X509_
ad00: 66 72 65 65 28 70 65 65 72 29 3b 20 7d 0a 20 20  free(peer); }.  
ad10: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50    } else {..objP
ad20: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
ad30: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
ad40: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 4c 69 73    }..    Tcl_Lis
ad50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ad60: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
ad70: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ad80: 62 6a 28 22 73 62 69 74 73 22 2c 20 2d 31 29 29  bj("sbits", -1))
ad90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
ada0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
adb0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
adc0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53 53 4c  cl_NewIntObj(SSL
add0: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73  _get_cipher_bits
ade0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
adf0: 4e 55 4c 4c 29 29 29 3b 0a 0a 20 20 20 20 63 69  NULL)));..    ci
ae00: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
ae10: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
ae20: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
ae30: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
ae40: 3d 20 4e 55 4c 4c 29 20 26 26 20 28 73 74 72 63  = NULL) && (strc
ae50: 6d 70 28 63 69 70 68 65 72 73 2c 20 22 28 4e 4f  mp(ciphers, "(NO
ae60: 4e 45 29 22 29 20 21 3d 20 30 29 29 20 7b 0a 09  NE)") != 0)) {..
ae70: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
ae80: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
ae90: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
aea0: 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70 68 65  StringObj("ciphe
aeb0: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r", -1));..Tcl_L
aec0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
aed0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
aee0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
aef0: 67 4f 62 6a 28 53 53 4c 5f 67 65 74 5f 63 69 70  gObj(SSL_get_cip
af00: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  her(statePtr->ss
af10: 6c 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  l), -1));.    }.
af20: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
af30: 5f 4e 4f 5f 54 4c 53 45 58 54 0a 20 20 20 20 2f  _NO_TLSEXT.    /
af40: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
af50: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
af60: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
af70: 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  e negotiation */
af80: 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c  .    SSL_get0_al
af90: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74  pn_selected(stat
afa0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74  ePtr->ssl, &prot
afb0: 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63  o, &len);.    Tc
afc0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
afd0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
afe0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
aff0: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20  ringObj("alpn", 
b000: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
b010: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b020: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
b030: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
b040: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74  Obj((char *)prot
b050: 6f 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 23  o, (int)len));.#
b060: 65 6e 64 69 66 0a 20 20 20 20 54 63 6c 5f 4c 69  endif.    Tcl_Li
b070: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b080: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
b090: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
b0a0: 4f 62 6a 28 22 76 65 72 73 69 6f 6e 22 2c 20 2d  Obj("version", -
b0b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
b0c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
b0d0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
b0e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
b0f0: 62 6a 28 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  bj(SSL_get_versi
b100: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
b110: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 54 63  ), -1));..    Tc
b120: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
b130: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
b140: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
b150: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
b160: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
b170: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
b180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
b1c0: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62  ConnectionInfoOb
b1d0: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
b1e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66  onnection info f
b1f0: 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
b200: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
b210: 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74   list of connect
b220: 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d  ion info.  *. *-
b230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b270: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
b280: 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  nt ConnectionInf
b290: 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  oObjCmd(ClientDa
b2a0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
b2b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b2c0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
b2d0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
b2e0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
b2f0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
b300: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
b310: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
b320: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
b330: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
b340: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
b350: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  ocket */.    Tcl
b360: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
b370: 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c    const SSL *ssl
b380: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
b390: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a  CIPHER *cipher;.
b3a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4f 50  .#if !defined(OP
b3b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 45 58 54 29  ENSSL_NO_TLSEXT)
b3c0: 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53   && OPENSSL_VERS
b3d0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78  ION_NUMBER >= 0x
b3e0: 31 30 30 30 32 30 30 30 4c 0a 20 20 20 20 63 6f  10002000L.    co
b3f0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
b400: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e  r *proto;.    un
b410: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a  signed int len;.
b420: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
b430: 65 64 28 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50  ed(HAVE_SSL_COMP
b440: 52 45 53 53 49 4f 4e 29 20 26 26 20 4f 50 45 4e  RESSION) && OPEN
b450: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
b460: 45 52 20 3e 3d 20 30 78 31 30 30 30 32 30 30 30  ER >= 0x10002000
b470: 4c 0a 20 20 20 20 63 6f 6e 73 74 20 43 4f 4d 50  L.    const COMP
b480: 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 3b 0a 23  _METHOD *comp;.#
b490: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f  endif..    if (o
b4a0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
b4b0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b4c0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b4d0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
b4e0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
b4f0: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
b500: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b510: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
b520: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
b530: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
b540: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
b550: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
b560: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
b570: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
b580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
b590: 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20   * Make sure to 
b5a0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
b5b0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 20  opmost channel. 
b5c0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20      */.    chan 
b5d0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
b5e0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
b5f0: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
b600: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
b610: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
b620: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
b630: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
b640: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
b650: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
b660: 6d 65 28 63 68 61 6e 29 2c 20 22 5c 22 3a 20 6e  me(chan), "\": n
b670: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
b680: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
b690: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
b6a0: 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
b6b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
b6c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
b6d0: 2f 2a 20 47 65 74 20 63 6f 6e 6e 65 63 74 69 6f  /* Get connectio
b6e0: 6e 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73  n state */.    s
b6f0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
b700: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
b710: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
b720: 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
b730: 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
b740: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b750: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
b760: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
b770: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 74 61  ewStringObj("sta
b780: 74 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  te", -1));.    i
b790: 66 20 28 53 53 4c 5f 69 73 5f 69 6e 69 74 5f 66  f (SSL_is_init_f
b7a0: 69 6e 69 73 68 65 64 28 73 73 6c 29 29 20 7b 0a  inished(ssl)) {.
b7b0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
b7c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
b7d0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
b7e0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 65 73 74 61  wStringObj("esta
b7f0: 62 6c 69 73 68 65 64 22 2c 20 2d 31 29 29 3b 0a  blished", -1));.
b800: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 53      } else if (S
b810: 53 4c 5f 69 6e 5f 69 6e 69 74 28 73 73 6c 29 29  SL_in_init(ssl))
b820: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
b830: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
b840: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
b850: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68  _NewStringObj("h
b860: 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b  andshake", -1));
b870: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
b880: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b890: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
b8a0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
b8b0: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 69 74 69 61  tringObj("initia
b8c0: 6c 69 7a 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 20  lizing", -1));. 
b8d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
b8e0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
b8f0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
b900: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
b910: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
b920: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
b930: 65 72 76 65 72 22 2c 20 2d 31 29 29 3b 0a 20 20  erver", -1));.  
b940: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b950: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
b960: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
b970: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
b980: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
b990: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
b9a0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20  YPE_host_name), 
b9b0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  -1));..    /* Ge
b9c0: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20  t protocol */.  
b9d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b9e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
b9f0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
ba00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 72 6f  ewStringObj("pro
ba10: 74 6f 63 6f 6c 22 2c 20 2d 31 29 29 3b 0a 20 20  tocol", -1));.  
ba20: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
ba30: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
ba40: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
ba50: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
ba60: 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29  get_version(ssl)
ba70: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
ba80: 47 65 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20  Get cipher */.  
ba90: 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67    cipher = SSL_g
baa0: 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65  et_current_ciphe
bab0: 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  r(ssl);.    if (
bac0: 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20  cipher != NULL) 
bad0: 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53  {..char buf[BUFS
bae0: 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20  IZ] = {0};..int 
baf0: 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a  bits, alg_bits;.
bb00: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
bb10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
bb20: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
bb30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 69 70  ewStringObj("cip
bb40: 68 65 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  her", -1));..Tcl
bb50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
bb60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
bb70: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
bb80: 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
bb90: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65  R_get_name(ciphe
bba0: 72 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c  r), -1));..Tcl_L
bbb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
bbc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
bbd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
bbe0: 67 4f 62 6a 28 22 73 74 61 6e 64 61 72 64 5f 6e  gObj("standard_n
bbf0: 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ame", -1));..Tcl
bc00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
bc10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
bc20: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
bc30: 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49 50 48 45  ingObj(SSL_CIPHE
bc40: 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28  R_standard_name(
bc50: 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a 0a  cipher), -1));..
bc60: 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48  .bits = SSL_CIPH
bc70: 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68  ER_get_bits(ciph
bc80: 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a  er, &alg_bits);.
bc90: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
bca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
bcb0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
bcc0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 62 69 74 73  wStringObj("bits
bcd0: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
bce0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bcf0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
bd00: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
bd10: 28 62 69 74 73 29 29 3b 0a 09 54 63 6c 5f 4c 69  (bits));..Tcl_Li
bd20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bd30: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
bd40: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
bd50: 4f 62 6a 28 22 73 65 63 72 65 74 5f 62 69 74 73  Obj("secret_bits
bd60: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ", -1));..Tcl_Li
bd70: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
bd80: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
bd90: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
bda0: 28 61 6c 67 5f 62 69 74 73 29 29 3b 0a 09 2f 2a  (alg_bits));../*
bdb0: 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74   alg_bits is act
bdc0: 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62  ual key secret b
bdd0: 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73  its. If use bits
bde0: 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67   and secret (alg
bdf0: 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66  orithm) bits dif
be00: 66 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  fer,.           
be10: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
be20: 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
be30: 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
be40: 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
be50: 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 09  (bits < 56) */..
be60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
be70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
be80: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
be90: 53 74 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 5f 76  StringObj("min_v
bea0: 65 72 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09  ersion", -1));..
beb0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
bec0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
bed0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
bee0: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 43 49  StringObj(SSL_CI
bef0: 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e  PHER_get_version
bf00: 28 63 69 70 68 65 72 29 2c 20 2d 31 29 29 3b 0a  (cipher), -1));.
bf10: 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52  ..if (SSL_CIPHER
bf20: 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70  _description(cip
bf30: 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66  her, buf, sizeof
bf40: 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20  (buf)) != NULL) 
bf50: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
bf60: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
bf70: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
bf80: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
bf90: 28 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20  ("description", 
bfa0: 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 4c  -1));..    Tcl_L
bfb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
bfc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
bfd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
bfe0: 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29 3b 0a  gObj(buf, -1));.
bff0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  .}.    }..    Tc
c000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
c020: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
c030: 72 69 6e 67 4f 62 6a 28 22 72 65 6e 65 67 6f 74  ringObj("renegot
c040: 69 61 74 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20  iation", -1));. 
c050: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
c060: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
c070: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
c080: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 53  NewStringObj(..S
c090: 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65  SL_get_secure_re
c0a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70  negotiation_supp
c0b0: 6f 72 74 28 73 73 6c 29 20 3f 20 22 61 6c 6c 6f  ort(ssl) ? "allo
c0c0: 77 65 64 22 20 3a 20 22 64 69 73 61 6c 6c 6f 77  wed" : "disallow
c0d0: 65 64 22 2c 20 2d 31 29 29 3b 0a 0a 23 69 66 20  ed", -1));..#if 
c0e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c0f0: 5f 4e 4f 5f 54 4c 53 45 58 54 29 20 26 26 20 4f  _NO_TLSEXT) && O
c100: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
c110: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 30 30 32  UMBER >= 0x10002
c120: 30 30 30 4c 0a 20 20 20 20 2f 2a 20 52 65 70 6f  000L.    /* Repo
c130: 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
c140: 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
c150: 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
c160: 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
c170: 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
c180: 65 63 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74  ected(ssl, &prot
c190: 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 54 63  o, &len);.    Tc
c1a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c1b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
c1c0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
c1d0: 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20  ringObj("alpn", 
c1e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
c1f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
c200: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
c210: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
c220: 4f 62 6a 28 28 63 68 61 72 20 2a 29 70 72 6f 74  Obj((char *)prot
c230: 6f 2c 20 28 69 6e 74 29 6c 65 6e 29 29 3b 0a 23  o, (int)len));.#
c240: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 53 65  endif..    /* Se
c250: 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
c260: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
c270: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
c280: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
c290: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
c2a0: 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 2d 31  sion_reused", -1
c2b0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
c2c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c2d0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
c2e0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 53   Tcl_NewIntObj(S
c2f0: 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65  SL_session_reuse
c300: 64 28 73 73 6c 29 29 29 3b 0a 0a 23 69 66 20 64  d(ssl)));..#if d
c310: 65 66 69 6e 65 64 28 48 41 56 45 5f 53 53 4c 5f  efined(HAVE_SSL_
c320: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 20 26 26 20  COMPRESSION) && 
c330: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
c340: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 30 30  NUMBER >= 0x1000
c350: 32 30 30 30 4c 0a 20 20 20 20 2f 2a 20 43 6f 6d  2000L.    /* Com
c360: 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
c370: 0a 20 20 20 20 63 6f 6d 70 20 3d 20 53 53 4c 5f  .    comp = SSL_
c380: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70  get_current_comp
c390: 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20  ression(ssl);.  
c3a0: 20 20 69 66 20 28 63 6f 6d 70 20 21 3d 20 4e 55    if (comp != NU
c3b0: 4c 4c 29 20 7b 0a 09 65 78 70 61 6e 73 69 6f 6e  LL) {..expansion
c3c0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
c3d0: 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c  nt_expansion(ssl
c3e0: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
c3f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
c400: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
c410: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
c420: 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 2d 31 29  ompression", -1)
c430: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
c440: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
c450: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
c460: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
c470: 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
c480: 63 6f 6d 70 29 2c 20 2d 31 29 29 3b 0a 09 54 63  comp), -1));..Tc
c490: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
c4a0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
c4b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
c4c0: 72 69 6e 67 4f 62 6a 28 22 65 78 70 61 6e 73 69  ringObj("expansi
c4d0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  on", -1));..Tcl_
c4e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
c4f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
c500: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
c510: 6e 67 4f 62 6a 28 53 53 4c 5f 43 4f 4d 50 5f 67  ngObj(SSL_COMP_g
c520: 65 74 5f 6e 61 6d 65 28 65 78 70 61 6e 73 69 6f  et_name(expansio
c530: 6e 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  n), -1));.    }.
c540: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
c550: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
c560: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
c570: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c580: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
c590: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
c5a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
c5f0: 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72  rsionObjCmd -- r
c600: 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74  eturn version st
c610: 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53  ring from OpenSS
c620: 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
c630: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
c640: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
c650: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
c660: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
c670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
c6c0: 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43  .VersionObjCmd(C
c6d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
c6e0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
c6f0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
c700: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
c710: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
c720: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
c730: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
c740: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f  Called");..    o
c750: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
c760: 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c  tringObj(OPENSSL
c770: 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d  _VERSION_TEXT, -
c780: 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  1);.    Tcl_SetO
c790: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
c7a0: 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72   objPtr);..    r
c7b0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
c7c0: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
c7d0: 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20  ntData;..objc = 
c7e0: 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62  objc;..objv = ob
c7f0: 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  jv;.}.../*. *---
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c840: 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d  . *. * MiscObjCm
c850: 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e  d -- misc comman
c860: 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ds. *. * Results
c870: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
c880: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
c890: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
c8a0: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
c8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c8f0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
c900: 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65  .MiscObjCmd(Clie
c910: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c920: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
c930: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
c940: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
c950: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74  objv[]) {.    st
c960: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
c970: 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b  *commands [] = {
c980: 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22   "req", "strreq"
c990: 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e  , NULL };.    en
c9a0: 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52  um command { C_R
c9b0: 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f  EQ, C_STRREQ, C_
c9c0: 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 69 6e 74  DUMMY };.    int
c9d0: 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a 20 20 20   cmd, isStr;.   
c9e0: 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
c9f0: 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  84];..    dprint
ca00: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
ca10: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
ca20: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
ca30: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
ca40: 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64  bjv, "subcommand
ca50: 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75   ?args?");..retu
ca60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ca70: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
ca80: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
ca90: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
caa0: 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d   commands, "comm
cab0: 61 6e 64 22 2c 20 30 2c 26 63 6d 64 29 20 21 3d  and", 0,&cmd) !=
cac0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
cad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cae0: 20 20 7d 0a 0a 20 20 20 20 69 73 53 74 72 20 3d    }..    isStr =
caf0: 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45   (cmd == C_STRRE
cb00: 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  Q);.    switch (
cb10: 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63  (enum command) c
cb20: 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45  md) {..case C_RE
cb30: 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45  Q:..case C_STRRE
cb40: 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b  Q: {..    EVP_PK
cb50: 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09  EY *pkey=NULL;..
cb60: 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e      X509 *cert=N
cb70: 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e  ULL;..    X509_N
cb80: 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a  AME *name=NULL;.
cb90: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  .    Tcl_Obj **l
cba0: 69 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c  istv;..    int l
cbb0: 69 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49  istc,i;...    BI
cbc0: 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
cbd0: 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
cbe0: 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
cbf0: 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
cc00: 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
cc10: 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
cc20: 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
cc30: 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
cc40: 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
cc50: 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66  0,days=365;..#if
cc60: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
cc70: 5f 4e 55 4d 42 45 52 20 3c 3d 20 30 78 31 30 31  _NUMBER <= 0x101
cc80: 30 30 30 30 30 4c 0a 09 20 20 20 20 52 53 41 20  00000L..    RSA 
cc90: 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c  *rsa = NULL;.#el
cca0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
ccb0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
ccc0: 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
ccd0: 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
cce0: 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
ccf0: 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
cd00: 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
cd10: 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
cd20: 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
cd30: 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
cd40: 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
cd50: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
cd60: 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
cd70: 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
cd80: 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
cd90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cda0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
cdb0: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
cdc0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
cdd0: 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
cde0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
cdf0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ce00: 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
ce10: 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
ce20: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
ce30: 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
ce40: 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
ce50: 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
ce60: 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
ce70: 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
ce80: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
ce90: 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
cea0: 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
ceb0: 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
cec0: 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
ced0: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
cee0: 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09  terp, objv[5],..
cef0: 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73 74 76  ..&listc, &listv
cf00: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
cf10: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
cf20: 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
cf30: 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20 30   ((listc%2) != 0
cf40: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  ) {...    Tcl_Se
cf50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
cf60: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74  Information list
cf70: 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e 20   must have even 
cf80: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
cf90: 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  nts",NULL);...  
cfa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
cfb0: 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69  OR;...}...for (i
cfc0: 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d  =0; i<listc; i+=
cfd0: 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d 54  2) {...    str=T
cfe0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
cff0: 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69 66  tv[i]);...    if
d000: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64 61   (strcmp(str,"da
d010: 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  ys")==0) {....if
d020: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
d030: 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
d040: 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54 43  [i+1],&days)!=TC
d050: 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74  L_OK)....    ret
d060: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
d070: 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
d080: 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72 69  strcmp(str,"seri
d090: 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66  al")==0) {....if
d0a0: 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
d0b0: 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74 76  Obj(interp,listv
d0c0: 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d  [i+1],&serial)!=
d0d0: 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
d0e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d0f0: 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
d100: 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43 22   (strcmp(str,"C"
d110: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54  )==0) {....k_C=T
d120: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
d130: 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
d140: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
d150: 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29 20  p(str,"ST")==0) 
d160: 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65  {....k_ST=Tcl_Ge
d170: 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
d180: 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
d190: 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
d1a0: 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"L")==0) {....k
d1b0: 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _L=Tcl_GetString
d1c0: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
d1d0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
d1e0: 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d  trcmp(str,"O")==
d1f0: 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f  0) {....k_O=Tcl_
d200: 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
d210: 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
d220: 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
d230: 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09  tr,"OU")==0) {..
d240: 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74  ..k_OU=Tcl_GetSt
d250: 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
d260: 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
d270: 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
d280: 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  N")==0) {....k_C
d290: 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  N=Tcl_GetString(
d2a0: 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
d2b0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
d2c0: 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c 22  rcmp(str,"Email"
d2d0: 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61  )==0) {....k_Ema
d2e0: 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  il=Tcl_GetString
d2f0: 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
d300: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09      } else {....
d310: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
d320: 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61  terp,"Unknown pa
d330: 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a  rameter",NULL);.
d340: 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
d350: 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d  ROR;...    }...}
d360: 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ..    }..#if OPE
d370: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
d380: 42 45 52 20 3c 3d 20 30 78 31 30 31 30 30 30 30  BER <= 0x1010000
d390: 30 4c 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  0L..    pkey = E
d3a0: 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
d3b0: 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 67 65      rsa = RSA_ge
d3c0: 6e 65 72 61 74 65 5f 6b 65 79 28 6b 65 79 73 69  nerate_key(keysi
d3d0: 7a 65 2c 20 30 78 31 30 30 30 31 2c 20 4e 55 4c  ze, 0x10001, NUL
d3e0: 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69  L, NULL);..    i
d3f0: 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  f (pkey == NULL 
d400: 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c  || rsa == NULL |
d410: 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69  | !EVP_PKEY_assi
d420: 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61  gn_RSA(pkey, rsa
d430: 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
d440: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a  free(pkey);.../*
d450: 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20   RSA_free(rsa); 
d460: 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45  freed by EVP_PKE
d470: 59 5f 66 72 65 65 20 2a 2f 0a 23 65 6c 69 66 20  Y_free */.#elif 
d480: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
d490: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
d4a0: 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20  000L..    bne = 
d4b0: 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72  BN_new();..    r
d4c0: 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a  sa = RSA_new();.
d4d0: 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f  .    pkey = EVP_
d4e0: 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20  PKEY_new();..   
d4f0: 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c   if (bne == NULL
d500: 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20   || rsa == NULL 
d510: 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  || pkey == NULL 
d520: 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28  || !BN_set_word(
d530: 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09  bne,RSA_F4) ||..
d540: 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b  .!RSA_generate_k
d550: 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69  ey_ex(rsa, keysi
d560: 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c  ze, bne, NULL) |
d570: 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69  | !EVP_PKEY_assi
d580: 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61  gn_RSA(pkey, rsa
d590: 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
d5a0: 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a  free(pkey);.../*
d5b0: 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20   RSA_free(rsa); 
d5c0: 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45  freed by EVP_PKE
d5d0: 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66  Y_free */...BN_f
d5e0: 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a  ree(bne);.#else.
d5f0: 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f  .    pkey = EVP_
d600: 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65  RSA_gen((unsigne
d610: 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b  d int) keysize);
d620: 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f  ..    ctx = EVP_
d630: 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65  PKEY_CTX_new(pke
d640: 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66  y,NULL);..    if
d650: 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c   (pkey == NULL |
d660: 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | ctx == NULL ||
d670: 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65   !EVP_PKEY_keyge
d680: 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09  n_init(ctx) ||..
d690: 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73  .!EVP_PKEY_CTX_s
d6a0: 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69  et_rsa_keygen_bi
d6b0: 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29  ts(ctx, keysize)
d6c0: 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
d6d0: 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29  ygen(ctx, &pkey)
d6e0: 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  ) {...EVP_PKEY_f
d6f0: 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50  ree(pkey);...EVP
d700: 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63  _PKEY_CTX_free(c
d710: 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63  tx);.#endif...Tc
d720: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d730: 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61  rp,"Error genera
d740: 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79  ting private key
d750: 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72  ",NULL);...retur
d760: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
d770: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20    } else {...if 
d780: 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
d790: 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
d7a0: 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
d7b0: 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72  PEM_write_bio_Pr
d7c0: 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65  ivateKey(out,pke
d7d0: 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55  y,NULL,NULL,0,NU
d7e0: 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  LL,NULL);...    
d7f0: 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
d800: 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
d810: 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
d820: 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
d830: 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
d840: 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
d850: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
d860: 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  yout,buffer,0);.
d870: 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
d880: 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
d890: 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
d8a0: 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
d8b0: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
d8c0: 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
d8d0: 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
d8e0: 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20  out,keyout);... 
d8f0: 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
d900: 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
d910: 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
d920: 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
d930: 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f     /* PEM_write_
d940: 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65  bio_RSAPrivateKe
d950: 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c  y(out, rsa, NULL
d960: 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c  , NULL, 0, NULL,
d970: 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20   NULL); */...   
d980: 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75   BIO_free_all(ou
d990: 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28  t);.. .}....if (
d9a0: 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29  (cert=X509_new()
d9b0: 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  )==NULL) {...   
d9c0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
d9d0: 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
d9e0: 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63  erating certific
d9f0: 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c  ate request",NUL
da00: 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b  L);...    EVP_PK
da10: 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
da20: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
da30: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30  ON_NUMBER > 0x10
da40: 31 30 30 30 30 30 4c 20 26 26 20 4f 50 45 4e 53  100000L && OPENS
da50: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
da60: 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
da70: 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
da80: 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
da90: 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f   return(TCL_ERRO
daa0: 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  R);...}....X509_
dab0: 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74  set_version(cert
dac0: 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45  ,2);...ASN1_INTE
dad0: 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74  GER_set(X509_get
dae0: 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65  _serialNumber(ce
daf0: 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 23 69 66  rt),serial);.#if
db00: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
db10: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
db20: 30 30 30 30 4c 0a 09 09 58 35 30 39 5f 67 6d 74  0000L...X509_gmt
db30: 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
db40: 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29  _notBefore(cert)
db50: 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  ,0);...X509_gmti
db60: 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 5f  me_adj(X509_get_
db70: 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28  notAfter(cert),(
db80: 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61  long)60*60*24*da
db90: 79 73 29 3b 0a 23 65 6c 73 65 0a 09 09 58 35 30  ys);.#else...X50
dba0: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
dbb0: 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
dbc0: 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
dbd0: 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
dbe0: 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
dbf0: 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
dc00: 30 2a 32 34 2a 64 61 79 73 29 3b 0a 23 65 6e 64  0*24*days);.#end
dc10: 69 66 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75  if...X509_set_pu
dc20: 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b  bkey(cert,pkey);
dc30: 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65  ....name=X509_ge
dc40: 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
dc50: 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41  ert);....X509_NA
dc60: 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
dc70: 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42  txt(name,"C", MB
dc80: 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
dc90: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
dca0: 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c   *) k_C, -1, -1,
dcb0: 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
dcc0: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
dcd0: 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53  t(name,"ST", MBS
dce0: 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
dcf0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
dd00: 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
dd10: 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
dd20: 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
dd30: 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
dd40: 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
dd50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dd60: 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_L, -1, -1, 0
dd70: 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
dd80: 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
dd90: 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49  name,"O", MBSTRI
dda0: 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
ddb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
ddc0: 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_O, -1, -1, 0);
ddd0: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
dde0: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
ddf0: 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e  me,"OU", MBSTRIN
de00: 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
de10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
de20: 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
de30: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
de40: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
de50: 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
de60: 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
de70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
de80: 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _CN, -1, -1, 0);
de90: 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
dea0: 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
deb0: 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54  me,"Email", MBST
dec0: 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
ded0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dee0: 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
def0: 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
df00: 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
df10: 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
df20: 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
df30: 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32  rt,pkey,EVP_sha2
df40: 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58  56())) {...    X
df50: 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
df60: 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
df70: 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
df80: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
df90: 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 30 30  UMBER > 0x101000
dfa0: 30 30 4c 20 26 26 20 4f 50 45 4e 53 53 4c 5f 56  00L && OPENSSL_V
dfb0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
dfc0: 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
dfd0: 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
dfe0: 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
dff0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
e000: 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
e010: 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
e020: 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
e030: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
e040: 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
e050: 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
e060: 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
e070: 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
e080: 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
e090: 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
e0a0: 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
e0b0: 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
e0c0: 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
e0d0: 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
e0e0: 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
e0f0: 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
e100: 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
e110: 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
e120: 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
e130: 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
e140: 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
e150: 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
e160: 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
e170: 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
e180: 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
e190: 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
e1a0: 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
e1b0: 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
e1c0: 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
e1d0: 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
e1e0: 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
e1f0: 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
e200: 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
e210: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
e220: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
e230: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
e240: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
e250: 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62  000L...BN_free(b
e260: 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20  ne);.#endif..   
e270: 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20   }..}..break;.  
e280: 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61    default:..brea
e290: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
e2a0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
e2b0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
e2c0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
e2d0: 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
e320: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
e330: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
e340: 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
e350: 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
e360: 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
e370: 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
e380: 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
e390: 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
e3a0: 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
e3b0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
e3c0: 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
e3d0: 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
e3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e420: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
e430: 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50  ree(char *blockP
e440: 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  tr) {.    State 
e450: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
e460: 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a  te *)blockPtr;..
e470: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
e480: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  led");..    Tls_
e490: 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
e4a0: 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63  .    ckfree(bloc
e4b0: 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  kPtr);.}.../*. *
e4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e500: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c  ---. *. * Tls_Cl
e510: 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ean --. *. *.Thi
e520: 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
e530: 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
e540: 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
e550: 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
e560: 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
e570: 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
e580: 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20   below 1.  This 
e590: 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c  should. *.be cal
e5a0: 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  led synchronousl
e5b0: 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72  y by the ClosePr
e5c0: 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20  oc, not in the. 
e5d0: 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  *.EventuallyFree
e5e0: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
e5f0: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
e600: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
e610: 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
e620: 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
e630: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
e640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e670: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54  -----. */.void T
e680: 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a  ls_Clean(State *
e690: 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
e6a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
e6b0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
e6c0: 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
e6d0: 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65   here that we're
e6e0: 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
e6f0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
e700: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
e710: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
e720: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
e730: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
e740: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
e750: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
e760: 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
e770: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
e780: 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
e790: 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
e7a0: 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
e7b0: 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
e7c0: 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72  .dprintf("BIO_fr
e7d0: 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61  ee_all(%p)", sta
e7e0: 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49  tePtr->bio);..BI
e7f0: 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65  O_free_all(state
e800: 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74  Ptr->bio);..stat
e810: 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c  ePtr->bio = NULL
e820: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
e830: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
e840: 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66  ..dprintf("SSL_f
e850: 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50  ree(%p)", stateP
e860: 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66  tr->ssl);..SSL_f
e870: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ree(statePtr->ss
e880: 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73  l);..statePtr->s
e890: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  sl = NULL;.    }
e8a0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
e8b0: 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43  r->ctx) {..SSL_C
e8c0: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
e8d0: 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74  ->ctx);..statePt
e8e0: 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ctx = NULL;. 
e8f0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
e900: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
e910: 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
e920: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
e930: 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65  allback);..state
e940: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20  Ptr->callback = 
e950: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
e960: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
e970: 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44  ssword) {..Tcl_D
e980: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
e990: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
e9a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  ..statePtr->pass
e9b0: 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  word = NULL;.   
e9c0: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
e9d0: 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a  "Returning");.}.
e9e0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
e9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ea20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
ea30: 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
ea40: 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
ea50: 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
ea60: 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
ea70: 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
ea80: 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68  *.by Tcl when th
ea90: 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
eaa0: 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
eab0: 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
eac0: 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c   * Results:  Ssl
ead0: 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
eae0: 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64  loaded. *. * Sid
eaf0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63  e effects:. *. c
eb00: 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f  reate the ssl co
eb10: 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a  mmand, initializ
eb20: 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a  e ssl context. *
eb30: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
eb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb70: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58  ------. */.DLLEX
eb80: 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69  PORT int Tls_Ini
eb90: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
eba0: 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73  terp) {.    cons
ebb0: 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69  t char tlsTclIni
ebc0: 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69  tScript[] = {.#i
ebd0: 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e  nclude "tls.tcl.
ebe0: 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a  h"..0x00.    };.
ebf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
ec00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a  lled");..    /*.
ec10: 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 73       * We only s
ec20: 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 34 20 6f  upport Tcl 8.4 o
ec30: 72 20 6e 65 77 65 72 0a 20 20 20 20 20 2a 2f 0a  r newer.     */.
ec40: 20 20 20 20 69 66 20 28 0a 23 69 66 64 65 66 20      if (.#ifdef 
ec50: 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 09 54  USE_TCL_STUBS..T
ec60: 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
ec70: 65 72 70 2c 20 22 38 2e 34 22 2c 20 30 29 0a 23  erp, "8.4", 0).#
ec80: 65 6c 73 65 0a 09 54 63 6c 5f 50 6b 67 52 65 71  else..Tcl_PkgReq
ec90: 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63  uire(interp, "Tc
eca0: 6c 22 2c 20 22 38 2e 34 2d 22 2c 20 30 29 0a 23  l", "8.4-", 0).#
ecb0: 65 6e 64 69 66 0a 09 20 3d 3d 20 4e 55 4c 4c 29  endif.. == NULL)
ecc0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
ecd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
ece0: 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28   if (TlsLibInit(
ecf0: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
ed00: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
ed10: 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
ed20: 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20   not initialize 
ed30: 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55  SSL library", NU
ed40: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
ed50: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
ed60: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
ed70: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
ed80: 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20  "tls::ciphers", 
ed90: 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28  CiphersObjCmd, (
eda0: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
edb0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
edc0: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
edd0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
ede0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
edf0: 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20  s::connection", 
ee00: 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62  ConnectionInfoOb
ee10: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
ee20: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
ee30: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
ee40: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
ee50: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
ee60: 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64 73 68  rp, "tls::handsh
ee70: 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65 4f  ake", HandshakeO
ee80: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
ee90: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
eea0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
eeb0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
eec0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
eed0: 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72  erp, "tls::impor
eee0: 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  t", ImportObjCmd
eef0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
ef00: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
ef10: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
ef20: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
ef30: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
ef40: 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c  "tls::unimport",
ef50: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c   UnimportObjCmd,
ef60: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
ef70: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
ef80: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
ef90: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
efa0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
efb0: 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74  tls::status", St
efc0: 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  atusObjCmd, (Cli
efd0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
efe0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
eff0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
f000: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
f010: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
f020: 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f  version", Versio
f030: 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  nObjCmd, (Client
f040: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
f050: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
f060: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
f070: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
f080: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73  nterp, "tls::mis
f090: 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20  c", MiscObjCmd, 
f0a0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
f0b0: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
f0c0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
f0d0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
f0e0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
f0f0: 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20  ls::protocols", 
f100: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c  ProtocolsObjCmd,
f110: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
f120: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
f130: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20  roc *) NULL);.. 
f140: 20 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b     if (interp) {
f150: 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72  ..Tcl_Eval(inter
f160: 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72  p, tlsTclInitScr
f170: 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ipt);.    }..   
f180: 20 72 65 74 75 72 6e 28 54 63 6c 5f 50 6b 67 50   return(Tcl_PkgP
f190: 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
f1a0: 74 6c 73 22 2c 20 50 41 43 4b 41 47 45 5f 56 45  tls", PACKAGE_VE
f1b0: 52 53 49 4f 4e 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20  RSION));.}../*. 
f1c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
f1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1f0: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54  -------*. *. *.T
f200: 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20  ls_SafeInit --. 
f210: 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
f220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f240: 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61  -----*. *.Standa
f250: 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65 71  rd procedure req
f260: 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27 2e  uired by 'load'.
f270: 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
f280: 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20 66  this extension f
f290: 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72 70  or a safe interp
f2a0: 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  reter.. *.------
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 2a 0a 20 2a 0a 20  ----------*. *. 
f2e0: 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  *.Side effects:.
f2f0: 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f 49   *..As of 'Tls_I
f300: 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c  nit'. *. *.Resul
f310: 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61 72  t:. *..A standar
f320: 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64 65  d Tcl error code
f330: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
f370: 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74  */.DLLEXPORT int
f380: 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63   Tls_SafeInit(Tc
f390: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f3a0: 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
f3b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72  "Called");.    r
f3c0: 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69  eturn(Tls_Init(i
f3d0: 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20  nterp));.}../*. 
f3e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
f3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f410: 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54  -------*. *. *.T
f420: 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a  lsLibInit --. *.
f430: 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
f440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f460: 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ---*. *.Initiali
f470: 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20  zes SSL library 
f480: 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61  once per applica
f490: 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d  tion. *.--------
f4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
f4d0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
f4e0: 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  ..initializes SS
f4f0: 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09  L library. *. *.
f500: 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65  Result:. *..none
f510: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
f520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
f550: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
f560: 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e  LibInit(int unin
f570: 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20  itialize) {.    
f580: 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69  static int initi
f590: 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20  alized = 0;.    
f5a0: 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43 4c  int status = TCL
f5b0: 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  _OK;.#if defined
f5c0: 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
f5d0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
f5e0: 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73 69  _THREADS).    si
f5f0: 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  ze_t num_locks;.
f600: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
f610: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
f620: 20 20 20 20 20 20 20 20 69 66 20 28 21 69 6e 69          if (!ini
f630: 74 69 61 6c 69 7a 65 64 29 20 7b 0a 20 20 20 20  tialized) {.    
f640: 20 20 20 20 20 20 20 20 64 70 72 69 6e 74 66 28          dprintf(
f650: 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74  "Asked to uninit
f660: 69 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61  ialize, but we a
f670: 72 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a  re not initializ
f680: 65 64 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  ed");..         
f690: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b     return(TCL_OK
f6a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
f6b0: 20 20 20 20 20 20 64 70 72 69 6e 74 66 28 22 41        dprintf("A
f6c0: 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
f6d0: 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66  lize");..#if def
f6e0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
f6f0: 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
f700: 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
f710: 20 20 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c        Tcl_MutexL
f720: 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a  ock(&init_mx);..
f730: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
f740: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
f750: 30 30 30 30 30 30 30 4c 0a 20 20 20 20 20 20 20  0000000L.       
f760: 20 43 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b   CRYPTO_set_lock
f770: 69 6e 67 5f 63 61 6c 6c 62 61 63 6b 28 4e 55 4c  ing_callback(NUL
f780: 4c 29 3b 0a 20 20 20 20 20 20 20 20 43 52 59 50  L);.        CRYP
f790: 54 4f 5f 73 65 74 5f 69 64 5f 63 61 6c 6c 62 61  TO_set_id_callba
f7a0: 63 6b 28 4e 55 4c 4c 29 3b 0a 23 65 6c 69 66 20  ck(NULL);.#elif 
f7b0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
f7c0: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
f7d0: 30 30 30 4c 0a 20 20 20 20 20 20 20 20 43 52 59  000L.        CRY
f7e0: 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e 67 5f  PTO_set_locking_
f7f0: 63 61 6c 6c 62 61 63 6b 28 4e 55 4c 4c 29 3b 0a  callback(NULL);.
f800: 20 20 20 20 20 20 20 20 43 52 59 50 54 4f 5f 54          CRYPTO_T
f810: 48 52 45 41 44 49 44 5f 73 65 74 5f 63 61 6c 6c  HREADID_set_call
f820: 62 61 63 6b 28 4e 55 4c 4c 29 0a 23 65 6e 64 69  back(NULL).#endi
f830: 66 0a 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c  f..        if (l
f840: 6f 63 6b 73 29 20 7b 0a 20 20 20 20 20 20 20 20  ocks) {.        
f850: 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b      free(locks);
f860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63  .            loc
f870: 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  ks = NULL;.     
f880: 20 20 20 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e         locksCoun
f890: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
f8a0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
f8b0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
f8c0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
f8d0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
f8e0: 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
f8f0: 52 45 41 44 53 29 0a 20 20 20 20 20 20 20 20 54  READS).        T
f900: 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
f910: 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
f920: 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
f930: 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a  (TCL_OK);.    }.
f940: 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c  .    if (initial
f950: 69 7a 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20  ized) {.        
f960: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c  dprintf("Called,
f970: 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65   but using cache
f980: 64 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20 20  d value");.     
f990: 20 20 20 72 65 74 75 72 6e 28 73 74 61 74 75 73     return(status
f9a0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  );.    }..    dp
f9b0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
f9c0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
f9d0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
f9e0: 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
f9f0: 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d  READS).    Tcl_M
fa00: 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d  utexLock(&init_m
fa10: 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  x);.#endif.    i
fa20: 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a  nitialized = 1;.
fa30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
fa40: 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
fa50: 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
fa60: 45 41 44 53 29 0a 23 69 66 20 4f 50 45 4e 53 53  EADS).#if OPENSS
fa70: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
fa80: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20   < 0x10100000L. 
fa90: 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 43     num_locks = C
faa0: 52 59 50 54 4f 5f 6e 75 6d 5f 6c 6f 63 6b 73 28  RYPTO_num_locks(
fab0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 75 6d  );.#else.    num
fac0: 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 23 65 6e 64  _locks = 1;.#end
fad0: 69 66 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  if.    locksCoun
fae0: 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f  t = (int) num_lo
faf0: 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d  cks;.    locks =
fb00: 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
fb10: 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
fb20: 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ks);.    memset(
fb30: 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66  locks, 0, sizeof
fb40: 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c  (*locks) * num_l
fb50: 6f 63 6b 73 29 3b 0a 0a 23 69 66 20 4f 50 45 4e  ocks);..#if OPEN
fb60: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
fb70: 45 52 20 3c 20 30 78 31 30 30 30 30 30 30 30 4c  ER < 0x10000000L
fb80: 0a 20 20 20 20 43 52 59 50 54 4f 5f 73 65 74 5f  .    CRYPTO_set_
fb90: 6c 6f 63 6b 69 6e 67 5f 63 61 6c 6c 62 61 63 6b  locking_callback
fba0: 28 43 72 79 70 74 6f 54 68 72 65 61 64 4c 6f 63  (CryptoThreadLoc
fbb0: 6b 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  kCallback);.    
fbc0: 43 52 59 50 54 4f 5f 73 65 74 5f 69 64 5f 63 61  CRYPTO_set_id_ca
fbd0: 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72  llback(CryptoThr
fbe0: 65 61 64 49 64 43 61 6c 6c 62 61 63 6b 29 3b 0a  eadIdCallback);.
fbf0: 23 65 6c 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  #elif OPENSSL_VE
fc00: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
fc10: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 43  x10100000L.    C
fc20: 52 59 50 54 4f 5f 73 65 74 5f 6c 6f 63 6b 69 6e  RYPTO_set_lockin
fc30: 67 5f 63 61 6c 6c 62 61 63 6b 28 43 72 79 70 74  g_callback(Crypt
fc40: 6f 54 68 72 65 61 64 4c 6f 63 6b 43 61 6c 6c 62  oThreadLockCallb
fc50: 61 63 6b 29 3b 0a 20 20 20 20 43 52 59 50 54 4f  ack);.    CRYPTO
fc60: 5f 54 48 52 45 41 44 49 44 5f 73 65 74 5f 63 61  _THREADID_set_ca
fc70: 6c 6c 62 61 63 6b 28 43 72 79 70 74 6f 54 68 72  llback(CryptoThr
fc80: 65 61 64 49 64 43 61 6c 6c 62 61 63 6b 29 0a 23  eadIdCallback).#
fc90: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 20  endif.#endif..# 
fca0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
fcb0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
fcc0: 31 30 30 30 30 30 4c 0a 20 20 20 20 69 66 20 28  100000L.    if (
fcd0: 53 53 4c 5f 6c 69 62 72 61 72 79 5f 69 6e 69 74  SSL_library_init
fce0: 28 29 20 21 3d 20 31 29 20 7b 0a 20 20 20 20 20  () != 1) {.     
fcf0: 20 20 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f     status = TCL_
fd00: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67  ERROR;.        g
fd10: 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a  oto done;.    }.
fd20: 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 6e 69  #else.    /* Ini
fd30: 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
fd40: 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
fd50: 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
fd60: 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
fd70: 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
fd80: 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
fd90: 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
fda0: 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
fdb0: 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
fdc0: 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
fdd0: 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
fde0: 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
fdf0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 20 69 66 20  );.#endif..# if 
fe00: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
fe10: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
fe20: 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 6c 6f 61  000L.    SSL_loa
fe30: 64 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 73 28  d_error_strings(
fe40: 29 3b 0a 20 20 20 20 45 52 52 5f 6c 6f 61 64 5f  );.    ERR_load_
fe50: 63 72 79 70 74 6f 5f 73 74 72 69 6e 67 73 28 29  crypto_strings()
fe60: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 4f  ;.#else.    /* O
fe70: 6e 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65 20 6c  nly initialize l
fe80: 69 62 63 72 79 70 74 6f 20 20 2a 2f 0a 20 20 20  ibcrypto  */.   
fe90: 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 63 72   OPENSSL_init_cr
fea0: 79 70 74 6f 28 4f 50 45 4e 53 53 4c 5f 49 4e 49  ypto(OPENSSL_INI
feb0: 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54  T_LOAD_CRYPTO_ST
fec0: 52 49 4e 47 53 2c 20 4e 55 4c 4c 29 3b 0a 23 65  RINGS, NULL);.#e
fed0: 6e 64 69 66 0a 0a 20 20 20 20 42 49 4f 5f 6e 65  ndif..    BIO_ne
fee0: 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a  w_tcl(NULL, 0);.
fef0: 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20  .#if 0.    /*.  
ff00: 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52     * XXX:TODO: R
ff10: 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20  emove this code 
ff20: 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77  and replace it w
ff30: 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20  ith a check.    
ff40: 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e   * for enough en
ff50: 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74  tropy and do not
ff60: 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f   try to create o
ff70: 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65  ur own.     * te
ff80: 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20  rrible entropy. 
ff90: 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20      */.    /*.  
ffa0: 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61     * Seed the ra
ffb0: 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65  ndom number gene
ffc0: 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c  rator in the SSL
ffd0: 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a   library,.     *
ffe0: 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68   using the do/wh
fff0: 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65  ile construct be
10000 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67  cause of the bug
10010 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20   note in the.   
10020 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20    * OpenSSL FAQ 
10030 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70  at http://www.op
10040 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72  enssl.org/suppor
10050 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31  t/faq.html#USER1
10060 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54  .     *.     * T
10070 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70  he crux of the p
10080 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53  roblem is that S
10090 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f  olaris 7 does no
100a0 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20  t have a.     * 
100b0 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f  /dev/random or /
100c0 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69  dev/urandom devi
100d0 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20  ce so it cannot 
100e0 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20  gather enough.  
100f0 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f     * entropy fro
10100 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28  m the RAND_seed(
10110 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69  ) when TLS initi
10120 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73  alizes and refus
10130 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20  es.     * to go 
10140 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72  further. Earlier
10150 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65   versions of Ope
10160 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20  nSSL carried on 
10170 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20  regardless..    
10180 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75   */.    srand((u
10190 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d  nsigned int) tim
101a0 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c  e((time_t *) NUL
101b0 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66  L));.    do {..f
101c0 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31  or (i = 0; i < 1
101d0 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72  6; i++) {..    r
101e0 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b  nd_seed[i] = 1 +
101f0 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a   (char) (255.0 *
10200 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41   rand()/(RAND_MA
10210 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e  X+1.0));..}..RAN
10220 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c  D_seed(rnd_seed,
10230 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64   sizeof(rnd_seed
10240 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  ));.    } while 
10250 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21  (RAND_status() !
10260 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 20  = 1);.#endif..# 
10270 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
10280 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
10290 31 30 30 30 30 30 4c 0a 64 6f 6e 65 3a 0a 23 65  100000L.done:.#e
102a0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
102b0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
102c0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
102d0 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
102e0 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
102f0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72  _mx);.#endif...r
10300 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d  eturn(status);.}
10310 0a                                               .