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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e  h>.../* Min Open
03a0: 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23  SSL version */.#
03b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
03c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
03d0: 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 20 22  101000L.#error "
03e0: 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e  Only OpenSSL v1.
03f0: 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 73 20  1.1 or later is 
0400: 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e 64 69  supported".#endi
0410: 66 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72  f.../*. * Forwar
0420: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20  d declarations. 
0430: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28  */..#define F2N(
0440: 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28  key, dsp) \..(((
0450: 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20  key) == NULL) ? 
0460: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20  (char *) NULL : 
0470: 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74  \...Tcl_Translat
0480: 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
0490: 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29  , (key), (dsp)))
04a0: 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58  ..static SSL_CTX
04b0: 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65   *CTX_Init(State
04c0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
04d0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
04e0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a  oto, char *key,.
04f0: 09 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65  ..char *certfile
0500: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0510: 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67  *key_asn1, unsig
0520: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61  ned char *cert_a
0530: 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61  sn1,...int key_a
0540: 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72  sn1_len, int cer
0550: 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72  t_asn1_len, char
0560: 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72 20 2a   *CApath, char *
0570: 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a  CAfile,...char *
0580: 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63  ciphers, char *c
0590: 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74  iphersuites, int
05a0: 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48   level, char *DH
05b0: 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63  params);..static
05c0: 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28   int.TlsLibInit(
05d0: 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
05e0: 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  );..#define TLS_
05f0: 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31  PROTO_SSL2..0x01
0600: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0610: 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64  TO_SSL3..0x02.#d
0620: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
0630: 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65 66 69  TLS1..0x04.#defi
0640: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
0650: 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65  1_1.0x08.#define
0660: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
0670: 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54  2.0x10.#define T
0680: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09  LS_PROTO_TLS1_3.
0690: 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41  0x20.#define ENA
06a0: 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29  BLED(flag, mask)
06b0: 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73  .(((flag) & (mas
06c0: 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a  k)) == (mask))..
06d0: 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f  #define SSLKEYLO
06e0: 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f  GFILE.."SSLKEYLO
06f0: 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68  GFILE"../*. * Th
0700: 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f  read-Safe TLS Co
0710: 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54  de. */..#ifdef T
0720: 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69  CL_THREADS.#defi
0730: 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ne OPENSSL_THREA
0740: 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75  D_DEFINES.#inclu
0750: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e  de <openssl/open
0760: 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64  sslconf.h>..#ifd
0770: 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ef OPENSSL_THREA
0780: 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  DS.#include <ope
0790: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23  nssl/crypto.h>.#
07a0: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
07b0: 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54  /ssl.h>../*. * T
07c0: 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f  hreaded operatio
07d0: 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69  n requires locki
07e0: 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20  ng callbacks. * 
07f0: 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70  Based from /cryp
0800: 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66  to/cryptlib.c of
0810: 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f   OpenSSL and NSO
0820: 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61  penSSL.. */..sta
0830: 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c  tic Tcl_Mutex *l
0840: 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  ocks = NULL;.sta
0850: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75  tic int locksCou
0860: 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54  nt = 0;.static T
0870: 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78  cl_Mutex init_mx
0880: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e  ;.#endif /* OPEN
0890: 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23  SSL_THREADS */.#
08a0: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52  endif /* TCL_THR
08b0: 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a  EADS */..../****
08c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08d0: 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20  /./* Callbacks  
08e0: 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
08f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0900: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0950: 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f  Eval Callback Co
0960: 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45  mmand --. *. *.E
0970: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
0980: 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61  mand and catch a
0990: 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20  ny errors. *. * 
09a0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20  Results:. *.0 = 
09b0: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64  Command returned
09c0: 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65   fail or eval re
09d0: 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52  turned TCL_ERROR
09e0: 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20  . *.1 = Command 
09f0: 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73  returned success
0a00: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65   or eval returne
0a10: 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53  d TCL_OK. *. * S
0a20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0a30: 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61  Evaluates callba
0a40: 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  ck command. *. *
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
0aa0: 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28  nt.EvalCallback(
0ab0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0ac0: 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65  rp, State *state
0ad0: 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  Ptr, Tcl_Obj *cm
0ae0: 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20  dPtr) {.    int 
0af0: 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20  code, ok = 0;.. 
0b00: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
0b10: 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  ed");..    Tcl_P
0b20: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
0b30: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
0b40: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
0b50: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
0b60: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  ePtr);..    /* E
0b70: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  val callback wit
0b80: 68 20 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b  h success for ok
0b90: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65   or return value
0ba0: 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72   1, fail for err
0bb0: 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  or or return val
0bc0: 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ue 0 */.    Tcl_
0bd0: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
0be0: 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  rp);.    code = 
0bf0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
0c00: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
0c10: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
0c20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 45 76 61      dprintf("Eva
0c30: 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20  lCallback: %d", 
0c40: 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63  code);.    if (c
0c50: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
0c60: 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c  ../* Check resul
0c70: 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  t for return val
0c80: 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  ue */..Tcl_Obj *
0c90: 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74  result = Tcl_Get
0ca0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
0cb0: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d  );..if (result =
0cc0: 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65  = NULL || Tcl_Ge
0cd0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
0ce0: 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29  rp, result, &ok)
0cf0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0d00: 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64     ok = 1;..}..d
0d10: 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20  printf("Result: 
0d20: 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20  %d", ok);.    } 
0d30: 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72  else {../* Error
0d40: 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65   - reject the ce
0d50: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70  rtificate */..dp
0d60: 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67  rintf("Tcl_Backg
0d70: 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69  roundError");.#i
0d80: 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  f (TCL_MAJOR_VER
0d90: 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54  SION == 8) && (T
0da0: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e  CL_MINOR_VERSION
0db0: 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67   < 6)..Tcl_Backg
0dc0: 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72  roundError(inter
0dd0: 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42  p);.#else..Tcl_B
0de0: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69  ackgroundExcepti
0df0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29  on(interp, code)
0e00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
0e10: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
0e20: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
0e30: 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  tePtr);.    Tcl_
0e40: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
0e50: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
0e60: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c    return ok;.}..
0e70: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0ec0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a  InfoCallback --.
0ed0: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53   *. *.Monitors S
0ee0: 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72  SL connection pr
0ef0: 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75  ocess. *. * Resu
0f00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
0f10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
0f20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
0f30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
0f40: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
0f90: 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c  tic void.InfoCal
0fa0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
0fb0: 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c  *ssl, int where,
0fc0: 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20   int ret) {.    
0fd0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
0fe0: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
0ff0: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20  t_app_data((SSL 
1000: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  *)ssl);.    Tcl_
1010: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
1020: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1030: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
1040: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72  cmdPtr;.    char
1050: 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b   *major, *minor;
1060: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1070: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
1080: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
1090: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10a0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10b0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
10c0: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
10d0: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
10e0: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
10f0: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1100: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1110: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1120: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1130: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1140: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1150: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
1160: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
1170: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
1180: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
1190: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11a0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11b0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
11c0: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
11d0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11e0: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
11f0: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1200: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1210: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1220: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1230: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1240: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1250: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1260: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
1270: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
1280: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1290: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12a0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12b0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12c0: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
12d0: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
12e0: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
12f0: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1300: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1310: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
1320: 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c  fn, chan, major,
1330: 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 61 67 65 2c   minor, message,
1340: 20 61 6e 64 20 74 79 70 65 20 61 72 67 73 20 2a   and type args *
1350: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
1360: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1370: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1380: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
1390: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
13b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13c0: 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b  bj("info", -1));
13d0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1400: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1410: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
1420: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
1430: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
1440: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1450: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1460: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1470: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f  ewStringObj(majo
1480: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  r, -1));.    Tcl
1490: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14a0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
14b0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
14c0: 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31  ingObj(minor, -1
14d0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65  ));..    if (whe
14e0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
14f0: 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  T) {..Tcl_ListOb
1500: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1510: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1520: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1530: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64  gObj(SSL_alert_d
1540: 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  esc_string_long(
1550: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ret), -1));..Tcl
1560: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1570: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1580: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1590: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
15a0: 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e  alert_type_strin
15b0: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
15c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
15d0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
15e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
15f0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1600: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1610: 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
1620: 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29  _long(ssl), -1))
1630: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
1640: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1650: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
1660: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e  NewStringObj("in
1670: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  fo", -1));.    }
1680: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
1690: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
16a0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
16b0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
16c0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
16d0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
16e0: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
16f0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1700: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
1710: 0a 20 2a 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 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73  ------. *. * Mes
1760: 73 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a  sageCallback --.
1770: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53   *. *.Monitors S
1780: 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73  SL protocol mess
1790: 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ages. *. * Resul
17a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
17b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
17c0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
17d0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
17e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e  -------. */.#ifn
1830: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
1840: 53 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20  SL_TRACE.static 
1850: 76 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c  void.MessageCall
1860: 62 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70  back(int write_p
1870: 2c 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69  , int version, i
1880: 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c  nt content_type,
1890: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66   const void *buf
18a0: 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53  , size_t len, SS
18b0: 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72  L *ssl, void *ar
18c0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
18d0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
18e0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
18f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
1900: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1910: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
1920: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72  cmdPtr;.    char
1930: 20 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20   *ver, *type;.  
1940: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20    BIO *bio;.    
1950: 63 68 61 72 20 62 75 66 66 65 72 5b 33 30 30 30  char buffer[3000
1960: 30 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30  0];.    buffer[0
1970: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  ] = 0;..    dpri
1980: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
1990: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
19a0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
19b0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72  cl_Obj*)NULL)..r
19c0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74  eturn;..    swit
19d0: 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69  ch(version) {.#i
19e0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
19f0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
1a00: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
1a10: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
1a20: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1a30: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
1a40: 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL2_VERSION:.
1a50: 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a  .ver = "SSLv2";.
1a60: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
1a70: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
1a80: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
1a90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
1aa0: 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ).    case SSL3_
1ab0: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20  VERSION:..ver = 
1ac0: 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b  "SSLv3";..break;
1ad0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1ae0: 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09   TLS1_VERSION:..
1af0: 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09  ver = "TLSv1";..
1b00: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b10: 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a  TLS1_1_VERSION:.
1b20: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22  .ver = "TLSv1.1"
1b30: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1b40: 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f  se TLS1_2_VERSIO
1b50: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b60: 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  .2";..break;.   
1b70: 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52   case TLS1_3_VER
1b80: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1b90: 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a  Sv1.3";..break;.
1ba0: 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72      case 0:..ver
1bb0: 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61   = "none";..brea
1bc0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1bd0: 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  .ver = "unknown"
1be0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
1bf0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e  .    switch (con
1c00: 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20  tent_type) {.   
1c10: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45   case SSL3_RT_HE
1c20: 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48  ADER:..type = "H
1c30: 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a  eader";..break;.
1c40: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c50: 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54  _INNER_CONTENT_T
1c60: 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e  YPE:..type = "In
1c70: 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65  ner Content Type
1c80: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1c90: 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e  ase SSL3_RT_CHAN
1ca0: 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a  GE_CIPHER_SPEC:.
1cb0: 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20  .type = "Change 
1cc0: 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b  Cipher";..break;
1cd0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1ce0: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d  T_ALERT:..type =
1cf0: 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b   "Alert";..break
1d00: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d10: 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74  RT_HANDSHAKE:..t
1d20: 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65  ype = "Handshake
1d30: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1d40: 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c  ase SSL3_RT_APPL
1d50: 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74  ICATION_DATA:..t
1d60: 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22  ype = "App Data"
1d70: 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f 50  ;..break;.#if OP
1d80: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1d90: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
1da0: 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53  0L.    case DTLS
1db0: 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a  1_RT_HEARTBEAT:.
1dc0: 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65  .type = "Heartbe
1dd0: 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  at";..break;.#en
1de0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1df0: 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77  ..type = "unknow
1e00: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  n";.    }..    /
1e10: 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20  * Needs compile 
1e20: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61  time option "ena
1e30: 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20  ble-ssl-trace". 
1e40: 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20  */.    if ((bio 
1e50: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  = BIO_new(BIO_s_
1e60: 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29  mem())) != NULL)
1e70: 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f   {..int n;..SSL_
1e80: 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76  trace(write_p, v
1e90: 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f  ersion, content_
1ea0: 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20  type, buf, len, 
1eb0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f  ssl, (void *)bio
1ec0: 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64  );..n = BIO_read
1ed0: 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49  (bio, buffer, BI
1ee0: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c  O_pending(bio) <
1ef0: 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e   15000 ? BIO_pen
1f00: 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39  ding(bio) : 1499
1f10: 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f  9);..n = (n<0) ?
1f20: 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b   0 : n;..buffer[
1f30: 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42  n] = 0;..(void)B
1f40: 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09  IO_flush(bio);..
1f50: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20  BIO_free(bio);. 
1f60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1f70: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1f80: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
1f90: 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72  , direction, ver
1fa0: 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20  sion, type, and 
1fb0: 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a  message args */.
1fc0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
1fd0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
1fe0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
1ff0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2000: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2010: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2020: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2030: 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29  ("message", -1))
2040: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2050: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2060: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2070: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
2080: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
2090: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
20a0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
20b0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69  NewStringObj(wri
20f0: 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20  te_p ? "Sent" : 
2100: 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29  "Received", -1))
2110: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2120: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2130: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2140: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2150: 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ver, -1));.    T
2160: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2170: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2180: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
2190: 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d  tringObj(type, -
21a0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
21b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
21c0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
21d0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
21e0: 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
21f0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2200: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2210: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2220: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2230: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
2240: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
2250: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
2260: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2270: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64  (cmdPtr);.}.#end
2280: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
22d0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61  . * VerifyCallba
22e0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
22f0: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69  tors SSL certifi
2300: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20  cate validation 
2310: 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f  process. Used to
2320: 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09   control the. *.
2330: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68  behavior when th
2340: 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  e SSL_VERIFY_PEE
2350: 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  R flag is set. T
2360: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a  his is called. *
2370: 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74  .whenever a cert
2380: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65  ificate is inspe
2390: 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20  cted or decided 
23a0: 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20  invalid. Called 
23b0: 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74  for. *.each cert
23c0: 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63  ificate in the c
23d0: 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a  ert chain.. *. *
23e0: 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68 65 20   Checks:. *.The 
23f0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
2400: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
2410: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
2420: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
2430: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2440: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2450: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2460: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2470: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2480: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2490: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
24a0: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
24b0: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
24c0: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
24d0: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24e0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24f0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
2500: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
2510: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
2520: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
2530: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2540: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2550: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2560: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2570: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2580: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2590: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
25a0: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
25b0: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
25c0: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
25d0: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25e0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25f0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
2600: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
2610: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
2620: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
2630: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2640: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2650: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2660: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2670: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2680: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2690: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
26a0: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
26b0: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
26c0: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
26d0: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26e0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26f0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2700: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
2710: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
2720: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2730: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2740: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2750: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2760: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2770: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2780: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2790: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
27a0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
27b0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
27c0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
27d0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27e0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27f0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2840: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2850: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2860: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2870: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2880: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2890: 20 53 53 4c 20 20 20 2a 73 73 6c 20 3d 20 28 53   SSL   *ssl = (S
28a0: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43  SL*)X509_STORE_C
28b0: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63  TX_get_ex_data(c
28c0: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64  tx, SSL_get_ex_d
28d0: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43  ata_X509_STORE_C
28e0: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58  TX_idx());.    X
28f0: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2910: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
2920: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
2930: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
2940: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
2950: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c  ta(ssl);.    Tcl
2960: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2970: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2980: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74  rp;.    int dept
2990: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  h..= X509_STORE_
29a0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65  CTX_get_error_de
29b0: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e  pth(ctx);.    in
29c0: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54  t err..= X509_ST
29d0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f  ORE_CTX_get_erro
29e0: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72  r(ctx);..    dpr
29f0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
2a00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2a10: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22  ifyCallback: %d"
2a20: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28  , ok);..    if (
2a30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
2a40: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
2a50: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76  ) {../* Use ok v
2a60: 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61  alue if verifica
2a70: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2a80: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74   */..if (statePt
2a90: 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f  r->vflags & SSL_
2aa0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
2ab0: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
2ac0: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09      return ok;..
2ad0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
2ae0: 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d  turn 1;..}.    }
2af0: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d   else if (cert =
2b00: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d  = NULL || ssl ==
2b10: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
2b20: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   0;.    }..    d
2b30: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61  printf("VerifyCa
2b40: 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c  llback: eval cal
2b50: 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a  lback");..    /*
2b60: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
2b70: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
2b80: 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65   chan, depth, ce
2b90: 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74  rt info list, st
2ba0: 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20  atus, and error 
2bb0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
2bc0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
2bd0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
2be0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
2bf0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2c10: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2c20: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d  gObj("verify", -
2c30: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2c40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c50: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2c60: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
2c70: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
2c80: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
2c90: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
2ca0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2cb0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2cc0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2cd0: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29  ewIntObj(depth))
2ce0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2cf0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2d00: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2d10: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e  ls_NewX509Obj(in
2d20: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20  terp, cert));.  
2d30: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2d40: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2d50: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2d60: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20  ewIntObj(ok));. 
2d70: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2d90: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
2da0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
2db0: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79  har*)X509_verify
2dc0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
2dd0: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a  ng(err), -1));..
2de0: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49      /* Prevent I
2df0: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63  /O while callbac
2e00: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73  k is in progress
2e10: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65   */.    /* state
2e20: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
2e30: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20  S_TCL_CALLBACK; 
2e40: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  */..    /* Eval 
2e50: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
2e60: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
2e70: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2e80: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43  ;.    ok = EvalC
2e90: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2ea0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2ec0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2ed0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
2ee0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63  erifyCallback: c
2ef0: 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20  ommand result = 
2f00: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f  %d", ok);..    /
2f10: 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  * statePtr->flag
2f20: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43  s &= ~(TLS_TCL_C
2f30: 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20  ALLBACK); */.   
2f40: 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42   return ok;./* B
2f50: 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65  y default, leave
2f60: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e   verification un
2f70: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a  changed. */.}...
2f80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2fd0: 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20  ls_Error --. *. 
2fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
2ff0: 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 73   with error mess
3000: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  age.. *. * Side 
3010: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
3020: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
3030: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
3040: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
3050: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
3060: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
3070: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
3080: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
3090: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
30e0: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61  id.Tls_Error(Sta
30f0: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68  te *statePtr, ch
3100: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54  ar *msg) {.    T
3110: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3120: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
3130: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
3140: 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74  j *cmdPtr, *list
3150: 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Ptr;.    unsigne
3160: 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20  d long err;.    
3170: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20  statePtr->err = 
3180: 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  msg;..    dprint
3190: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
31a0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
31b0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
31c0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74  _Obj*)NULL)..ret
31d0: 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  urn;..    /* Cre
31e0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
31f0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
3200: 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61  n, and message a
3210: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
3220: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3230: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
3240: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
3250: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3260: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3270: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3280: 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c  ringObj("error",
3290: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
32a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
32b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
32c0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
32d0: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
32e0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
32f0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
3300: 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20  ));.    if (msg 
3310: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
3320: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3330: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3340: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3350: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b  ngObj(msg, -1));
3360: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
3370: 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53  ((msg = Tcl_GetS
3380: 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f 62 6a  tring(Tcl_GetObj
3390: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 29 29  Result(interp)))
33a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
33b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
33c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
33d0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
33e0: 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29  ingObj(msg, -1))
33f0: 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
3400: 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e  .listPtr = Tcl_N
3410: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
3420: 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72 72  L);..while ((err
3430: 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f 72   = ERR_get_error
3440: 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  ()) != 0) {..   
3450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3470: 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e  , listPtr, Tcl_N
3480: 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52 5f  ewStringObj(ERR_
3490: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
34a0: 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a  ing(err), -1));.
34b0: 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  .}..Tcl_ListObjA
34c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
34d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69 73  erp, cmdPtr, lis
34e0: 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  tPtr);.    }..  
34f0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
3500: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
3510: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
3520: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
3530: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
3540: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
3550: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
3560: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
3570: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43  --. *. * KeyLogC
35d0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
35e0: 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64 20  .Write received 
35f0: 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67 20  key data to log 
3600: 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  file.. *. * Side
3610: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e   effects:. *.non
3620: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
3670: 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  oid KeyLogCallba
3680: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
3690: 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c  l, const char *l
36a0: 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72 20  ine) {.    char 
36b0: 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53 53  *str = getenv(SS
36c0: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20 20  LKEYLOGFILE);.  
36d0: 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20 20    FILE *fd;..   
36e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
36f0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 72  ");..    if (str
3700: 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e 28  ) {..fd = fopen(
3710: 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72 69  str, "a");..fpri
3720: 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c 6c  ntf(fd, "%s\n",l
3730: 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66 64  ine);..fclose(fd
3740: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a  );.    }.}.../*.
3750: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73 73  -----. *. * Pass
37a0: 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d 2d  word Callback --
37b0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68  . *. *.Called wh
37c0: 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 69 73  en a password is
37d0: 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20 70 72   needed for a pr
37e0: 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e 20 6c  ivate key when l
37f0: 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73 74 6f  oading. *.or sto
3800: 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72 74 69  ring a PEM certi
3810: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72  ficate with encr
3820: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61  yption. Evals ca
3830: 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69 70 74  llback. *.script
3840: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
3850: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70   result as the p
3860: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69  assword string i
3870: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73  n buf.. *. * Res
3880: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
3890: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
38a0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
38b0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
38c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
38d0: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65   *.Password size
38e0: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20   in bytes or -1 
38f0: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a  for an error.. *
3900: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
3950: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61  c int.PasswordCa
3960: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66  llback(char *buf
3970: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20  , int size, int 
3980: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64  rwflag, void *ud
3990: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ata) {.    State
39a0: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
39b0: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20  ate *) udata;.  
39c0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
39d0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
39e0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
39f0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
3a00: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20 20 20    int code;.    
3a10: 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 0a 20  Tcl_Size len;.. 
3a20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
3a30: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  ed");..    /* If
3a40: 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73   no callback, us
3a50: 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61  e default callba
3a60: 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74  ck */.    if (st
3a70: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3a80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20   == NULL) {..if 
3a90: 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65  (Tcl_EvalEx(inte
3aa0: 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f  rp, "tls::passwo
3ab0: 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  rd", -1, TCL_EVA
3ac0: 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c  L_GLOBAL) == TCL
3ad0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  _OK) {..    char
3ae0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3af0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3b00: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3b10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
3b20: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
3b30: 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29  len > (Tcl_Size)
3b40: 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c 65 6e   size-1) {...len
3b50: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   = (Tcl_Size) si
3b60: 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09 20 20  ze-1;..    }..  
3b70: 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72    strncpy(buf, r
3b80: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  et, (size_t) len
3b90: 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65 6e 5d  );..    buf[len]
3ba0: 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20 72 65   = '\0';..    re
3bb0: 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a  turn (int) len;.
3bc0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
3bd0: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20  eturn -1;..}.   
3be0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3bf0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
3c00: 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66 6c 61  l with fn, rwfla
3c10: 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72 67 73  g, and size args
3c20: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
3c30: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
3c40: 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  j(statePtr->pass
3c50: 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  word);.    Tcl_L
3c60: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3c70: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3c80: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3c90: 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22 2c  gObj("password",
3ca0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
3cb0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3cc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3cd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3ce0: 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20 20  j(rwflag));.    
3cf0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3d00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3d10: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3d20: 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a  IntObj(size));..
3d30: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
3d40: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3d50: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50  terp);.    Tcl_P
3d60: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
3d70: 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a  ata) statePtr);.
3d80: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
3d90: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
3da0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
3db0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
3dc0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
3dd0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
3de0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
3df0: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66  _GLOBAL);.    if
3e00: 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b   (code != TCL_OK
3e10: 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a  ) {.#if (TCL_MAJ
3e20: 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29  OR_VERSION == 8)
3e30: 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56   && (TCL_MINOR_V
3e40: 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c  ERSION < 6)..Tcl
3e50: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
3e60: 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a  (interp);.#else.
3e70: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
3e80: 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  xception(interp,
3e90: 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20   code);.#endif. 
3ea0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
3eb0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
3ec0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65  );..    Tcl_Rele
3ed0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
3ee0: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3ef0: 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   /* If successfu
3f00: 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61 73  l, pass back pas
3f10: 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64  sword string and
3f20: 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f   truncate if too
3f30: 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20   long */.    if 
3f40: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29  (code == TCL_OK)
3f50: 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20   {..char *ret = 
3f60: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3f70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3f80: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3f90: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3fa0: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53  if (len > (Tcl_S
3fb0: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09  ize) size-1) {..
3fc0: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53      len = (Tcl_S
3fd0: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a  ize) size-1;..}.
3fe0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
3ff0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  t, (size_t) len)
4000: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c  ;..buf[len] = '\
4010: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  0';..Tcl_Release
4020: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
4030: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28  terp);..return (
4040: 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a  int) len;.    }.
4050: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
4060: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
4070: 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  erp);.    return
4080: 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d   -1;.}.../*. *--
4090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20  -. *. * Session 
40e0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69  Callback for Cli
40f0: 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  ents --. *. *.Ca
4100: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
4110: 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64  session is added
4120: 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49   to the cache. I
4130: 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69  n TLS 1.3. *.thi
4140: 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76 65  s may be receive
4150: 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73  d multiple times
4160: 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64 73   after the hands
4170: 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72  hake. For. *.ear
4180: 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74  lier versions, t
4190: 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65  his will be rece
41a0: 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65 20  ived during the 
41b0: 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68  handshake.. *.Th
41c0: 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65 72  is is the prefer
41d0: 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69  red way to obtai
41e0: 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65  n a resumable se
41f0: 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73  ssion.. *. * Res
4200: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
4210: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
4220: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
4230: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
4240: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
4250: 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f  des:. *.0 = erro
4260: 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20  r where session 
4270: 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74  will be immediat
4280: 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  ely removed from
4290: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
42a0: 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63  che.. *.1 = succ
42b0: 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72 65  ess where app re
42c0: 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e  tains session in
42d0: 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20   session cache, 
42e0: 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53  and must call SS
42f0: 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29  L_SESSION_free()
4300: 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20   when done.. *. 
4310: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4360: 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62  int.SessionCallb
4370: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53  ack(SSL *ssl, SS
4380: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69  L_SESSION *sessi
4390: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  on) {.    State 
43a0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
43b0: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
43c0: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29  data((SSL *)ssl)
43d0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
43e0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
43f0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
4400: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
4410: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
4420: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
4430: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  t;.    const uns
4440: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
4450: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65  ion_id;.    size
4460: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73  _t len2;.    uns
4470: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a  igned int ulen;.
4480: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4490: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
44a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
44b0: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
44c0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
44d0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
44e0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  OK;.    } else i
44f0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
4500: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
4510: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4520: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4530: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
4540: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
4550: 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20  an, session id, 
4560: 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20  session ticket, 
4570: 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67  and lifetime arg
4580: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
4590: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
45a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
45b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
45c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
45d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
45e0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
45f0: 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c  ngObj("session",
4600: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
4610: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4620: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4630: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
4640: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
4650: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
4660: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
4670: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
4680: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65  ion id */.    se
4690: 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
46a0: 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
46b0: 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20  ssion, &ulen);. 
46c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
46d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
46e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
46f0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
4700: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
4710: 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a  _Size) ulen));..
4720: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74      /* Session t
4730: 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  icket */.    SSL
4740: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
4750: 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74  cket(session, &t
4760: 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20  icket, &len2);. 
4770: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4780: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4790: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
47a0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
47b0: 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
47c0: 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20  e) len2));..    
47d0: 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75  /* Lifetime - nu
47e0: 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20  mber of seconds 
47f0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  */.    Tcl_ListO
4800: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4810: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4820: 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28  .Tcl_NewLongObj(
4830: 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49  (long) SSL_SESSI
4840: 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69  ON_get_ticket_li
4850: 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73  fetime_hint(sess
4860: 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ion)));..    /* 
4870: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
4880: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
4890: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
48a0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
48b0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
48c0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
48d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
48e0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
48f0: 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  ..    /* Return 
4900: 30 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20  0 for now until 
4910: 73 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67  session handling
4920: 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a   is complete */.
4930: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a      return 0;.}.
4940: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
4990: 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66   ALPN Callback f
49a0: 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e  or Servers and N
49b0: 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  PN Callback for 
49c0: 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a  Clients --. *. *
49d0: 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f  .Perform protoco
49e0: 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c  l (http/1.1, h2,
49f0: 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63   h3, etc.) selec
4a00: 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09  tion for the. *.
4a10: 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74  incoming connect
4a20: 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65  ion. Called afte
4a30: 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76  r Hello and serv
4a40: 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a  er callbacks.. *
4a50: 09 57 68 65 72 65 20 27 6f 75 74 27 20 69 73 20  .Where 'out' is 
4a60: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
4a70: 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68  l and 'in' is th
4a80: 65 20 70 65 65 72 20 61 64 76 65 72 74 69 73 65  e peer advertise
4a90: 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65  d list.. *. * Re
4aa0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
4ab0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4ac0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
4ad0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
4ae0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
4af0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
4b00: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e  EXT_ERR_OK: ALPN
4b10: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
4b20: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
4b30: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
4b40: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4b50: 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65  ALERT_FATAL: The
4b60: 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61  re was no overla
4b70: 70 20 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c  p between the cl
4b80: 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75  ient's. *.    su
4b90: 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20  pplied list and 
4ba0: 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69  the server confi
4bb0: 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f  guration. The co
4bc0: 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nnection will be
4bd0: 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c   aborted.. *.SSL
4be0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4bf0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  K: ALPN protocol
4c00: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65   not selected, e
4c10: 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20  .g., because no 
4c20: 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74  ALPN. *.    prot
4c30: 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67  ocols are config
4c40: 75 72 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f  ured for this co
4c50: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f  nnection. The co
4c60: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
4c70: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
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 2d 2d 0a 20 2a 2f  ------------. */
4cc0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e  .static int.ALPN
4cd0: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73  Callback(SSL *ss
4ce0: 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  l, const unsigne
4cf0: 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e  d char **out, un
4d00: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74  signed char *out
4d10: 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len,..const unsi
4d20: 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75  gned char *in, u
4d30: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65  nsigned int inle
4d40: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
4d50: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
4d60: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
4d70: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
4d80: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4d90: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4da0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4db0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
4dc0: 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e   res;..    dprin
4dd0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
4de0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
4df0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
4e00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
4e10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
4e20: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
4e30: 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c   Select protocol
4e40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f   */.    if (SSL_
4e50: 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74  select_next_prot
4e60: 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  o((unsigned char
4e70: 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e   **) out, outlen
4e80: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4e90: 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72  os, statePtr->pr
4ea0: 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69  otos_len,..in, i
4eb0: 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c  nlen) == OPENSSL
4ec0: 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29  _NPN_NEGOTIATED)
4ed0: 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75   {../* Match fou
4ee0: 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c  nd */..res = SSL
4ef0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
4f00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
4f10: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f   OPENSSL_NPN_NO_
4f20: 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65  OVERLAP = No ove
4f30: 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72  rlap, so use fir
4f40: 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69  st item from cli
4f50: 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73  ent protocol lis
4f60: 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  t */..res = SSL_
4f70: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
4f80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
4f90: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
4fa0: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
4fb0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73  L) {..return res
4fc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
4fd0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
4fe0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
4ff0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72  chan, depth, cer
5000: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61  t info list, sta
5010: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61  tus, and error a
5020: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
5030: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
5040: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
5050: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
5060: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5070: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5080: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5090: 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29  Obj("alpn", -1))
50a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
50b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
50c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
50d0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
50e0: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
50f0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5100: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5110: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5120: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5130: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5140: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f  NewStringObj((co
5150: 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74  nst char *) *out
5160: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5170: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5180: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5190: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  Ptr, Tcl_NewBool
51a0: 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53  eanObj(res == SS
51b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29  L_TLSEXT_ERR_OK)
51c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
51d0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
51e0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
51f0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5200: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20  ;.    if ((code 
5210: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
5220: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
5230: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b   cmdPtr)) > 1) {
5240: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5250: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5260: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
5270: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
5280: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5290: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
52a0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
52b0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
52c0: 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  AL;.    }.    Tc
52d0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
52e0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  mdPtr);.    retu
52f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
5300: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72  ----. *. * Adver
5350: 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43  tise Protocols C
5360: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74  allback for Next
5370: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69   Protocol Negoti
5380: 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53  ation (NPN) in S
5390: 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a  erverHello --. *
53a0: 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20  . *.called when 
53b0: 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65  a TLS server nee
53c0: 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70  ds a list of sup
53d0: 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73  ported protocols
53e0: 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f   for Next. *.Pro
53f0: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f  tocol Negotiatio
5400: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  n.. *. * Results
5410: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
5420: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
5430: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
5440: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  :. *.SSL_TLSEXT_
5450: 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74  ERR_OK: NPN prot
5460: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54  ocol selected. T
5470: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5480: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
5490: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
54a0: 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e  : NPN protocol n
54b0: 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ot selected. The
54c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
54d0: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5520: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
5530: 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50  PN.static int.NP
5540: 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  NCallback(const 
5550: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
5560: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
5570: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  out, unsigned in
5580: 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20  t *outlen, void 
5590: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
55a0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
55b0: 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20  tate*)arg;..    
55c0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
55d0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20  );..    if (ssl 
55e0: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d  == NULL || arg =
55f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
5600: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5610: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
5620: 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63     /* Set protoc
5630: 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ols list */.    
5640: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
5650: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  otos != NULL) {.
5660: 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72  .*out = statePtr
5670: 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c  ->protos;..*outl
5680: 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70  en = statePtr->p
5690: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d  rotos_len;.    }
56a0: 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20   else {..*out = 
56b0: 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d  NULL;..*outlen =
56c0: 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f   0;..return SSL_
56d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
56e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
56f0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5700: 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c  R_OK;.}.#endif..
5710: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5760: 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  SNI Callback for
5770: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
5780: 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72  *.Perform server
5790: 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61  -side SNI hostna
57a0: 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74  me selection aft
57b0: 65 72 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49  er receiving SNI
57c0: 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e   extension. *.in
57d0: 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43   Client Hello. C
57e0: 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c  alled after hell
57f0: 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62  o callback but b
5800: 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62  efore ALPN callb
5810: 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ack.. *. * Resul
5820: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
5830: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5840: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
5850: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
5860: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
5870: 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s:. *.SSL_TLSEXT
5880: 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73  _ERR_OK: SNI hos
5890: 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70 74 65  tname is accepte
58a0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
58b0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
58c0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
58d0: 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20  LERT_FATAL: SNI 
58e0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20  hostname is not 
58f0: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f  accepted. The co
5900: 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20  nnection. *.    
5910: 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61  is aborted. Defa
5920: 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73  ult for alert is
5930: 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e   SSL_AD_UNRECOGN
5940: 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53  IZED_NAME.. *.SS
5950: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5960: 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20  RT_WARNING: SNI 
5970: 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20  hostname is not 
5980: 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e  accepted, warnin
5990: 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73  g alert. *.    s
59a0: 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74  ent (not support
59b0: 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20  ed in TLSv1.3). 
59c0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
59d0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
59e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
59f0: 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  K: SNI hostname 
5a00: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20  is not accepted 
5a10: 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65  and not acknowle
5a20: 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67  dged,. *.    e.g
5a30: 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74  . if SNI has not
5a40: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
5a50: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5a60: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
5a70: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
5ac0: 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28  int.SNICallback(
5ad0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
5ae0: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64  int *alert, void
5af0: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
5b00: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
5b10: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
5b20: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
5b30: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
5b40: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
5b50: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
5b60: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20  int code, res;. 
5b70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
5b80: 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c  ervername = NULL
5b90: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
5ba0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
5bb0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c  f (ssl == NULL |
5bc0: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | arg == NULL) {
5bd0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5be0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5bf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c     }..    /* Onl
5c00: 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20  y works for TLS 
5c10: 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20  1.2 and earlier 
5c20: 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  */.    servernam
5c30: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76  e = SSL_get_serv
5c40: 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45  ername(ssl, TLSE
5c50: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
5c60: 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28  _name);.    if (
5c70: 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73  !servername || s
5c80: 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20  ervername[0] == 
5c90: 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20  '\0') {..return 
5ca0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5cb0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5cc0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
5cd0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
5ce0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
5cf0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5d00: 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OK;.    }..    /
5d10: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
5d20: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
5d30: 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76  , chan, and serv
5d40: 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a  er name args */.
5d50: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
5d60: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
5d70: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
5d80: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5d90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5da0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5db0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e  NewStringObj("sn
5dc0: 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  i", -1));.    Tc
5dd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5de0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5df0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5e00: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5e10: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5e20: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5e30: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5e40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5e50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5e60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5e70: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20  gObj(servername 
5e80: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
5e90: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5ea0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5eb0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5ec0: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5ed0: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5ee0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5ef0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5f00: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5f10: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5f20: 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65  T_WARNING;..*ale
5f30: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5f40: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
5f50: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
5f60: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
5f70: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64    } else if (cod
5f80: 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d  e == 1) {..res =
5f90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5fa0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  OK;.    } else {
5fb0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5fc0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5fd0: 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  AL;..*alert = SS
5fe0: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5ff0: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
6000: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
6010: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  1.3 */.    }.   
6020: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
6030: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
6040: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
6050: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c  -------. *. * Cl
60a0: 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68  ientHello Handsh
60b0: 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ake Callback for
60c0: 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20   Servers --. *. 
60d0: 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65 72  *.Used by server
60e0: 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20   to examine the 
60f0: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
6100: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74  cation (SNI) ext
6110: 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64  ension. *.provid
6120: 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74  ed by the client
6130: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c   in order to sel
6140: 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ect an appropria
6150: 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20 74  te certificate t
6160: 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e  o. *.present, an
6170: 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e  d make other con
6180: 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73  figuration adjus
6190: 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20  tments relevant 
61a0: 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a 20  to that server. 
61b0: 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63  *.name and its c
61c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
61d0: 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70  is includes swap
61e0: 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73  ping out the ass
61f0: 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43  ociated. *.SSL_C
6200: 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69  TX pointer, modi
6210: 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  fying the server
6220: 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69  's list of permi
6230: 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e  tted TLS version
6240: 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74  s,. *.changing t
6250: 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70 68  he server's ciph
6260: 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f  er list in respo
6270: 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  nse to the clien
6280: 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c  t's cipher list,
6290: 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20   etc.. *.Called 
62a0: 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41  before SNI and A
62b0: 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  LPN callbacks.. 
62c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
62d0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
62e0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
62f0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
6300: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
6310: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
6320: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6330: 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20  _RETRY: suspend 
6340: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61  the handshake, a
6350: 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  nd the handshake
6360: 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72   function will r
6370: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
6380: 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  y. *.SSL_CLIENT_
6390: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69  HELLO_ERROR: fai
63a0: 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20  lure, terminate 
63b0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20  connection. Set 
63c0: 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63  alert to error c
63d0: 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  ode.. *.SSL_CLIE
63e0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
63f0: 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d  : success. *. *-
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6450: 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28  t.HelloCallback(
6460: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61  SSL *ssl, int *a
6470: 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29  lert, void *arg)
6480: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
6490: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
64a0: 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  )arg;.    Tcl_In
64b0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
64c0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
64d0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
64e0: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
64f0: 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e  de, res;.    con
6500: 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e  st char *servern
6510: 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ame;.    const u
6520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b  nsigned char *p;
6530: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c  .    size_t len,
6540: 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20   remaining;..   
6550: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
6560: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
6570: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
6580: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
6590: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
65a0: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53  ENT_HELLO_SUCCES
65b0: 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  S;.    } else if
65c0: 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20   (ssl == (const 
65d0: 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72  SSL *)NULL || ar
65e0: 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c  g == (void *)NUL
65f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
6600: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6610: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
6620: 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a  /* Get names */.
6630: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69      if (!SSL_cli
6640: 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65  ent_hello_get0_e
6650: 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54  xt(ssl, TLSEXT_T
6660: 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c  YPE_server_name,
6670: 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29   &p, &remaining)
6680: 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d   || remaining <=
6690: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
66a0: 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52  SSL_R_SSLV3_ALER
66b0: 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45  T_ILLEGAL_PARAME
66c0: 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  TER;..return SSL
66d0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
66e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
66f0: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c  /* Extract the l
6700: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70  ength of the sup
6710: 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61  plied list of na
6720: 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20  mes. */.    len 
6730: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6740: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6750: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6760: 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67  + 2 != remaining
6770: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6780: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6790: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
67a0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
67b0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
67c0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
67d0: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20  aining = len;.. 
67e0: 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
67f0: 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20  n practice only 
6800: 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65  has a single ele
6810: 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79  ment, so we only
6820: 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69   consider the fi
6830: 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20  rst one. */.    
6840: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d  if (remaining ==
6850: 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c   0 || *p++ != TL
6860: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
6870: 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65  st_name) {..*ale
6880: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6890: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
68a0: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
68b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
68c0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
68d0: 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20   remaining--;.. 
68e0: 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e     /* Now we can
68f0: 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75   finally pull ou
6900: 74 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79  t the byte array
6910: 20 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c   with the actual
6920: 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20   hostname. */.  
6930: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20    if (remaining 
6940: 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20  <= 2) {..*alert 
6950: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6960: 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52  ERT_INTERNAL_ERR
6970: 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  OR;..return SSL_
6980: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6990: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  OR;.    }.    le
69a0: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
69b0: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
69c0: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
69d0: 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e  n + 2 > remainin
69e0: 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  g) {..*alert = S
69f0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
6a00: 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b  _INTERNAL_ERROR;
6a10: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6a20: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6a30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6a40: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  ning = len;.    
6a50: 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f  servername = (co
6a60: 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20  nst char *)p;.. 
6a70: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
6a80: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
6a90: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20  h fn, chan, and 
6aa0: 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73  server name args
6ab0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
6ac0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
6ad0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
6ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
6af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
6b10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6b20: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a  ("hello", -1));.
6b30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6b40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6b50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
6b60: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
6b70: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
6b80: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
6b90: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
6ba0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
6bb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
6bc0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
6bd0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65  wStringObj(serve
6be0: 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65  rname, (Tcl_Size
6bf0: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a  ) len));..    /*
6c00: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
6c10: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
6c20: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
6c30: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  mdPtr);.    if (
6c40: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c  (code = EvalCall
6c50: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
6c60: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20  tePtr, cmdPtr)) 
6c70: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  > 1) {..res = SS
6c80: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6c90: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  ETRY;..*alert = 
6ca0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6cb0: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44  T_USER_CANCELLED
6cc0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
6cd0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
6ce0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6cf0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20  HELLO_SUCCESS;. 
6d00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
6d10: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6d20: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65  LLO_ERROR;..*ale
6d30: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6d40: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6d50: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6d60: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
6d70: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
6d80: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
6d90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6da0: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64  ****/./* Command
6db0: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a  s         */./**
6dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6dd0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6e20: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
6e30: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
6e40: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
6e50: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
6e60: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
6e70: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
6e80: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
6e90: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
6ea0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
6eb0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
6ec0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
6ed0: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
6ee0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6ef0: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
6f00: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
6f10: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
6f20: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
6f70: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
6f80: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
6f90: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
6fa0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
6fb0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
6fc0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
6fd0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
6fe0: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
6ff0: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
7000: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
7010: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
7020: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
7030: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
7040: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
7050: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
7060: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
7070: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
7080: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
7090: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
70a0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
70b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
70c0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
70d0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
70e0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
70f0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
7100: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
7110: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7120: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
7130: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
7140: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
7150: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
7160: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
7170: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
7180: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
7190: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
71a0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
71b0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
71c0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
71d0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
71e0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
71f0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
7200: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
7210: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
7220: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
7230: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
7240: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
7250: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7260: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
7270: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
7280: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
7290: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
72a0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
72b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
72c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
72d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
72e0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
72f0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
7300: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
7310: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7320: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7330: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
7340: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
7350: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
7360: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
7370: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
7380: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
7390: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
73a0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
73b0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
73c0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
73d0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
73e0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
73f0: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
7400: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
7410: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
7420: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
7430: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
7440: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
7450: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
7460: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
7470: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
7480: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
7490: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
74a0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
74b0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
74c0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
74d0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
74e0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
74f0: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
7500: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
7510: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
7520: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
7530: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
7540: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7550: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
7560: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
7570: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7580: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
7590: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
75a0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
75b0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
75c0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
75d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
75e0: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
75f0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
7600: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
7610: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
7620: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
7630: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
7640: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
7650: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
7660: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
7670: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
7680: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
7690: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
76a0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
76b0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
76c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
76d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
76e0: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
76f0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
7700: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
7710: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
7720: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
7730: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
7740: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
7750: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
7760: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
7770: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
7780: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
7790: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
77a0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
77b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
77c0: 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63  _OK;.}..static c
77d0: 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61  onst char *comma
77e0: 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20  nd_opts [] = {. 
77f0: 20 20 20 22 2d 61 6c 70 6e 22 2c 20 22 2d 63 61     "-alpn", "-ca
7800: 64 69 72 22 2c 20 22 2d 63 61 66 69 6c 65 22 2c  dir", "-cafile",
7810: 20 22 2d 63 65 72 74 22 2c 20 22 2d 63 65 72 74   "-cert", "-cert
7820: 66 69 6c 65 22 2c 20 22 2d 63 69 70 68 65 72 22  file", "-cipher"
7830: 2c 20 22 2d 63 69 70 68 65 72 73 22 2c 20 22 2d  , "-ciphers", "-
7840: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 0a 20  ciphersuites",. 
7850: 20 20 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22     "-command", "
7860: 2d 64 68 70 61 72 61 6d 73 22 2c 20 22 2d 6b 65  -dhparams", "-ke
7870: 79 22 2c 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20  y", "-keyfile", 
7880: 22 2d 6d 6f 64 65 6c 22 2c 20 22 2d 70 61 73 73  "-model", "-pass
7890: 77 6f 72 64 22 2c 20 22 2d 70 6f 73 74 5f 68 61  word", "-post_ha
78a0: 6e 64 73 68 61 6b 65 22 2c 0a 20 20 20 20 22 2d  ndshake",.    "-
78b0: 72 65 71 75 65 73 74 22 2c 20 22 2d 72 65 71 75  request", "-requ
78c0: 69 72 65 22 2c 20 22 2d 73 65 63 75 72 69 74 79  ire", "-security
78d0: 5f 6c 65 76 65 6c 22 2c 20 22 2d 73 65 72 76 65  _level", "-serve
78e0: 72 22 2c 20 22 2d 73 65 72 76 65 72 6e 61 6d 65  r", "-servername
78f0: 22 2c 20 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22  ", "-session_id"
7900: 2c 20 22 2d 73 73 6c 32 22 2c 0a 20 20 20 20 22  , "-ssl2",.    "
7910: 2d 73 73 6c 33 22 2c 20 22 2d 74 6c 73 31 22 2c  -ssl3", "-tls1",
7920: 20 22 2d 74 6c 73 31 2e 31 22 2c 20 22 2d 74 6c   "-tls1.1", "-tl
7930: 73 31 2e 32 22 2c 20 22 2d 74 6c 73 31 2e 33 22  s1.2", "-tls1.3"
7940: 2c 20 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d  , "-validatecomm
7950: 61 6e 64 22 2c 20 22 2d 76 63 6d 64 22 2c 20 4e  and", "-vcmd", N
7960: 55 4c 4c 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f 6d  ULL};..enum _com
7970: 6d 61 6e 64 5f 6f 70 74 73 20 7b 0a 20 20 20 20  mand_opts {.    
7980: 5f 6f 70 74 5f 61 6c 70 6e 2c 20 5f 6f 70 74 5f  _opt_alpn, _opt_
7990: 63 61 64 69 72 2c 20 5f 6f 70 74 5f 63 61 66 69  cadir, _opt_cafi
79a0: 6c 65 2c 20 5f 6f 70 74 5f 63 65 72 74 2c 20 5f  le, _opt_cert, _
79b0: 6f 70 74 5f 63 65 72 74 66 69 6c 65 2c 20 5f 6f  opt_certfile, _o
79c0: 70 74 5f 63 69 70 68 65 72 2c 20 5f 6f 70 74 5f  pt_cipher, _opt_
79d0: 63 69 70 68 65 72 73 2c 0a 20 20 20 20 5f 6f 70  ciphers,.    _op
79e0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 2c 20 5f  t_ciphersuite, _
79f0: 6f 70 74 5f 63 6d 64 2c 20 5f 6f 70 74 5f 64 68  opt_cmd, _opt_dh
7a00: 70 61 72 61 6d 73 2c 20 5f 6f 70 74 5f 6b 65 79  params, _opt_key
7a10: 2c 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65 2c 20  , _opt_keyfile, 
7a20: 5f 6f 70 74 5f 6d 6f 64 65 6c 2c 20 5f 6f 70 74  _opt_model, _opt
7a30: 5f 70 61 73 73 77 6f 72 64 2c 0a 20 20 20 20 5f  _password,.    _
7a40: 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 5f  opt_handshake, _
7a50: 6f 70 74 5f 72 65 71 75 65 73 74 2c 20 5f 6f 70  opt_request, _op
7a60: 74 5f 72 65 71 75 69 72 65 2c 20 5f 6f 70 74 5f  t_require, _opt_
7a70: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20  security_level, 
7a80: 5f 6f 70 74 5f 73 65 72 76 65 72 2c 20 5f 6f 70  _opt_server, _op
7a90: 74 5f 73 65 72 76 65 72 6e 61 6d 65 2c 0a 20 20  t_servername,.  
7aa0: 20 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f 69    _opt_session_i
7ab0: 64 2c 20 5f 6f 70 74 5f 73 73 6c 32 2c 20 5f 6f  d, _opt_ssl2, _o
7ac0: 70 74 5f 73 73 6c 33 2c 20 5f 6f 70 74 5f 74 6c  pt_ssl3, _opt_tl
7ad0: 73 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 31 2c 20  s1, _opt_tls11, 
7ae0: 5f 6f 70 74 5f 74 6c 73 31 32 2c 20 5f 6f 70 74  _opt_tls12, _opt
7af0: 5f 74 6c 73 31 33 2c 0a 20 20 20 20 5f 6f 70 74  _tls13,.    _opt
7b00: 5f 76 61 6c 69 64 61 74 65 2c 20 5f 6f 70 74 5f  _validate, _opt_
7b10: 76 63 6d 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  vcmd.};../*. *--
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b60: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
7b70: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
7b80: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
7b90: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
7ba0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
7bb0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
7bc0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
7bd0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
7be0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
7bf0: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
7c00: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
7c10: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
7c20: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
7c30: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
7c40: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
7c50: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
7c60: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
7cb0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f  .static int.Impo
7cc0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
7cd0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
7ce0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7cf0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
7d00: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
7d10: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
7d20: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
7d30: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
7d40: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
7d50: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
7d60: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
7d70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
7d80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53  socket */.    SS
7d90: 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55  L_CTX *ctx..= NU
7da0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
7db0: 2a 63 6d 64 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b  *cmdObj..= NULL;
7dc0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61  .    Tcl_Obj *pa
7dd0: 73 73 77 64 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b  sswdObj..= NULL;
7de0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63  .    Tcl_Obj *vc
7df0: 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  md..= NULL;.    
7e00: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65  Tcl_DString uppe
7e10: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
7e20: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ion, upperChanne
7e30: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72  lBlocking, upper
7e40: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c  ChannelEncoding,
7e50: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46   upperChannelEOF
7e60: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64  Char;.    int id
7e70: 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  x;.    Tcl_Size 
7e80: 66 6e 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  fn, len;.    int
7e90: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54   flags...= TLS_T
7ea0: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
7eb0: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f   server...= 0;./
7ec0: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
7ed0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
7ee0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
7ef0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55  r *keyfile..= NU
7f00: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
7f10: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  rtfile..= NULL;.
7f20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
7f30: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a  r *key..= NULL;.
7f40: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
7f50: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75  _len..= 0;.    u
7f60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
7f70: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rt..= NULL;.    
7f80: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
7f90: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  n..= 0;.    char
7fa0: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c   *ciphers..= NUL
7fb0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
7fc0: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c  hersuites..= NUL
7fd0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
7fe0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
7ff0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d   char *CApath..=
8000: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
8010: 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c  *DHparams..= NUL
8020: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 6f 64  L;.    char *mod
8030: 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  el...= NULL;.   
8040: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
8050: 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f  e..= NULL;./* ho
8060: 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76 65  stname for Serve
8070: 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69 6f  r Name Indicatio
8080: 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75  n */.    const u
8090: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
80a0: 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b  ssion_id = NULL;
80b0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 65  .    Tcl_Size se
80c0: 73 73 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20  ss_len..= 0;.   
80d0: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 4f 62   Tcl_Obj *alpnOb
80e0: 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  j..= NULL;.    i
80f0: 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c  nt ssl2 = 0, ssl
8100: 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74  3 = 0;.    int t
8110: 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20  ls1 = 1, tls1_1 
8120: 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c  = 1, tls1_2 = 1,
8130: 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20   tls1_3 = 1;.   
8140: 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20   int proto = 0, 
8150: 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  level = -1;.    
8160: 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20  int verify = 0, 
8170: 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71  require = 0, req
8180: 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68  uest = 1, post_h
8190: 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20  andshake = 0;.  
81a0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
81b0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ata;..    dprint
81c0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
81d0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
81e0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
81f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20  ENSSL_NO_TLS1). 
8200: 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e     tls1 = 0;.#en
8210: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
8220: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
8230: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8240: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73  _TLS1_1).    tls
8250: 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  1_1 = 0;.#endif.
8260: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
8270: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
8280: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8290: 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20  1_2).    tls1_2 
82a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
82b0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
82c0: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
82d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
82e0: 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b  .    tls1_3 = 0;
82f0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
8300: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63  (objc < 2) {..Tc
8310: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8320: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
8330: 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e  "channel ?option
8340: 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  s?");..return TC
8350: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8360: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
8370: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e  ror();..    chan
8380: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
8390: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
83a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
83b0: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
83c0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
83d0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
83e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
83f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8400: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8410: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8420: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8430: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8440: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
8450: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
8460: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
8470: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 69 66 20 28  ; idx++) {..if (
8480: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
8490: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
84a0: 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  [idx], command_o
84b0: 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30  pts, "option", 0
84c0: 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b  , &fn) != TCL_OK
84d0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
84e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
84f0: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
8500: 68 61 73 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66  has value */..if
8510: 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29   (++idx >= objc)
8520: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
8530: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8540: 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f   "No value for o
8550: 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61  ption \"", comma
8560: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22  nd_opts[fn], "\"
8570: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8580: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
8590: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73  CL_ERROR;..}...s
85a0: 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 61 73  witch(fn) {..cas
85b0: 65 20 5f 6f 70 74 5f 61 6c 70 6e 3a 0a 09 20 20  e _opt_alpn:..  
85c0: 20 20 61 6c 70 6e 4f 62 6a 20 3d 20 6f 62 6a 76    alpnObj = objv
85d0: 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61  [idx];..    brea
85e0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 61  k;..case _opt_ca
85f0: 64 69 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  dir:..    GET_OP
8600: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8610: 78 5d 2c 20 43 41 70 61 74 68 2c 20 4e 55 4c 4c  x], CApath, NULL
8620: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8630: 63 61 73 65 20 5f 6f 70 74 5f 63 61 66 69 6c 65  case _opt_cafile
8640: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53  :..    GET_OPT_S
8650: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c  TRING(objv[idx],
8660: 20 43 41 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a   CAfile, NULL);.
8670: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8680: 65 20 5f 6f 70 74 5f 63 65 72 74 3a 0a 09 20 20  e _opt_cert:..  
8690: 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41    GET_OPT_BYTE_A
86a0: 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RRAY(objv[idx], 
86b0: 63 65 72 74 2c 20 26 63 65 72 74 5f 6c 65 6e 29  cert, &cert_len)
86c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
86d0: 61 73 65 20 5f 6f 70 74 5f 63 65 72 74 66 69 6c  ase _opt_certfil
86e0: 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  e:..    GET_OPT_
86f0: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d  STRING(objv[idx]
8700: 2c 20 63 65 72 74 66 69 6c 65 2c 20 4e 55 4c 4c  , certfile, NULL
8710: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8720: 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72  case _opt_cipher
8730: 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70  :..case _opt_cip
8740: 68 65 72 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f  hers:..    GET_O
8750: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69  PT_STRING(objv[i
8760: 64 78 5d 2c 20 63 69 70 68 65 72 73 2c 20 4e 55  dx], ciphers, NU
8770: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  LL);..    break;
8780: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68  ..case _opt_ciph
8790: 65 72 73 75 69 74 65 3a 0a 09 20 20 20 20 47 45  ersuite:..    GE
87a0: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
87b0: 76 5b 69 64 78 5d 2c 20 63 69 70 68 65 72 73 75  v[idx], ciphersu
87c0: 69 74 65 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ites, NULL);..  
87d0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
87e0: 6f 70 74 5f 63 6d 64 3a 0a 09 20 20 20 20 63 6d  opt_cmd:..    cm
87f0: 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  dObj = objv[idx]
8800: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8810: 61 73 65 20 5f 6f 70 74 5f 64 68 70 61 72 61 6d  ase _opt_dhparam
8820: 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  s:..    GET_OPT_
8830: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d  STRING(objv[idx]
8840: 2c 20 44 48 70 61 72 61 6d 73 2c 20 4e 55 4c 4c  , DHparams, NULL
8850: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8860: 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09  case _opt_key:..
8870: 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45      GET_OPT_BYTE
8880: 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d  _ARRAY(objv[idx]
8890: 2c 20 6b 65 79 2c 20 26 6b 65 79 5f 6c 65 6e 29  , key, &key_len)
88a0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
88b0: 61 73 65 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65  ase _opt_keyfile
88c0: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53  :..    GET_OPT_S
88d0: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c  TRING(objv[idx],
88e0: 20 6b 65 79 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b   keyfile, NULL);
88f0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8900: 73 65 20 5f 6f 70 74 5f 6d 6f 64 65 6c 3a 0a 09  se _opt_model:..
8910: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49      GET_OPT_STRI
8920: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6d 6f  NG(objv[idx], mo
8930: 64 65 6c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  del, NULL);..   
8940: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8950: 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 20  pt_password:..  
8960: 20 20 70 61 73 73 77 64 4f 62 6a 20 3d 20 6f 62    passwdObj = ob
8970: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
8980: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8990: 68 61 6e 64 73 68 61 6b 65 3a 0a 09 20 20 20 20  handshake:..    
89a0: 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a  GET_OPT_BOOL(obj
89b0: 76 5b 69 64 78 5d 2c 20 26 70 6f 73 74 5f 68 61  v[idx], &post_ha
89c0: 6e 64 73 68 61 6b 65 29 3b 0a 09 20 20 20 20 62  ndshake);..    b
89d0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
89e0: 5f 72 65 71 75 65 73 74 3a 0a 09 20 20 20 20 47  _request:..    G
89f0: 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76  ET_OPT_BOOL(objv
8a00: 5b 69 64 78 5d 2c 20 26 72 65 71 75 65 73 74 29  [idx], &request)
8a10: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8a20: 61 73 65 20 5f 6f 70 74 5f 72 65 71 75 69 72 65  ase _opt_require
8a30: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42  :..    GET_OPT_B
8a40: 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  OOL(objv[idx], &
8a50: 72 65 71 75 69 72 65 29 3b 0a 09 20 20 20 20 62  require);..    b
8a60: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8a70: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 3a  _security_level:
8a80: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e  ..    GET_OPT_IN
8a90: 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 6c 65  T(objv[idx], &le
8aa0: 76 65 6c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  vel);..    break
8ab0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 72  ;..case _opt_ser
8ac0: 76 65 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ver:..    GET_OP
8ad0: 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d  T_BOOL(objv[idx]
8ae0: 2c 20 26 73 65 72 76 65 72 29 3b 0a 09 20 20 20  , &server);..   
8af0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8b00: 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 3a 0a 09  pt_servername:..
8b10: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49      GET_OPT_STRI
8b20: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65  NG(objv[idx], se
8b30: 72 76 65 72 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b  rvername, NULL);
8b40: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8b50: 73 65 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f  se _opt_session_
8b60: 69 64 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  id:..    GET_OPT
8b70: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76  _BYTE_ARRAY(objv
8b80: 5b 69 64 78 5d 2c 20 73 65 73 73 69 6f 6e 5f 69  [idx], session_i
8b90: 64 2c 20 26 73 65 73 73 5f 6c 65 6e 29 3b 0a 09  d, &sess_len);..
8ba0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
8bb0: 20 5f 6f 70 74 5f 73 73 6c 32 3a 0a 09 20 20 20   _opt_ssl2:..   
8bc0: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a   GET_OPT_INT(obj
8bd0: 76 5b 69 64 78 5d 2c 20 26 73 73 6c 32 29 3b 0a  v[idx], &ssl2);.
8be0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8bf0: 65 20 5f 6f 70 74 5f 73 73 6c 33 3a 0a 09 20 20  e _opt_ssl3:..  
8c00: 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62    GET_OPT_INT(ob
8c10: 6a 76 5b 69 64 78 5d 2c 20 26 73 73 6c 33 29 3b  jv[idx], &ssl3);
8c20: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8c30: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 3a 0a 09 20  se _opt_tls1:.. 
8c40: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f     GET_OPT_INT(o
8c50: 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 29  bjv[idx], &tls1)
8c60: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8c70: 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31 31 3a 0a  ase _opt_tls11:.
8c80: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54  .    GET_OPT_INT
8c90: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73  (objv[idx], &tls
8ca0: 31 5f 31 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  1_1);..    break
8cb0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73  ;..case _opt_tls
8cc0: 31 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  12:..    GET_OPT
8cd0: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  _INT(objv[idx], 
8ce0: 26 74 6c 73 31 5f 32 29 3b 0a 09 20 20 20 20 62  &tls1_2);..    b
8cf0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8d00: 5f 74 6c 73 31 33 3a 0a 09 20 20 20 20 47 45 54  _tls13:..    GET
8d10: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
8d20: 78 5d 2c 20 26 74 6c 73 31 5f 33 29 3b 0a 09 20  x], &tls1_3);.. 
8d30: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8d40: 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 3a 0a 09  _opt_validate:..
8d50: 63 61 73 65 20 5f 6f 70 74 5f 76 63 6d 64 3a 0a  case _opt_vcmd:.
8d60: 09 20 20 20 20 76 63 6d 64 20 3d 20 6f 62 6a 76  .    vcmd = objv
8d70: 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61  [idx];..    brea
8d80: 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  k;..}.    }..   
8d90: 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76   if (request)..v
8da0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
8db0: 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20  IFY_CLIENT_ONCE 
8dc0: 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  | SSL_VERIFY_PEE
8dd0: 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  R;.    if (reque
8de0: 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76  st && require).v
8df0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
8e00: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
8e10: 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66  EER_CERT;.    if
8e20: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
8e30: 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72  t_handshake).ver
8e40: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
8e50: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
8e60: 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79  ;.    if (verify
8e70: 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d   == 0)..verify =
8e80: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45   SSL_VERIFY_NONE
8e90: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  ;..    proto |= 
8ea0: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl2 ? TLS_PROT
8eb0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20  O_SSL2 : 0);.   
8ec0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20   proto |= (ssl3 
8ed0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  ? TLS_PROTO_SSL3
8ee0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
8ef0: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f   |= (tls1 ? TLS_
8f00: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b  PROTO_TLS1 : 0);
8f10: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
8f20: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_1 ? TLS_PROT
8f30: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20  O_TLS1_1 : 0);. 
8f40: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
8f50: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_2 ? TLS_PROTO_
8f60: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20  TLS1_2 : 0);.   
8f70: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
8f80: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  3 ? TLS_PROTO_TL
8f90: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20  S1_3 : 0);..    
8fa0: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  /* reset to NULL
8fb0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67   if blank string
8fc0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20   provided */.   
8fd0: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63   if (cert && !*c
8fe0: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65  ert)..        ce
8ff0: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt.        = NUL
9000: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26  L;.    if (key &
9010: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20  & !*key)..      
9020: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20    key.        = 
9030: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65  NULL;.    if (ce
9040: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74  rtfile && !*cert
9050: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65  file)         ce
9060: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20  rtfile.= NULL;. 
9070: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26     if (keyfile &
9080: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65  & !*keyfile)..ke
9090: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  yfile.        = 
90a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
90b0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65  phers && !*ciphe
90c0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68  rs).        ciph
90d0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
90e0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  LL;.    if (ciph
90f0: 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69  ersuites && !*ci
9100: 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68  phersuites) ciph
9110: 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55  ersuites    = NU
9120: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69  LL;.    if (CAfi
9130: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09  le && !*CAfile).
9140: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20          CAfile. 
9150: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9160: 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26     if (CApath &&
9170: 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20   !*CApath).     
9180: 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20     CApath.      
9190: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
91a0: 20 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a   (DHparams && !*
91b0: 44 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20  DHparams).      
91c0: 20 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20    DHparams      
91d0: 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f    = NULL;..    /
91e0: 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20  * new SSL state 
91f0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09  */.    statePtr.
9200: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61  .= (State *) cka
9210: 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20  lloc((unsigned) 
9220: 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a  sizeof(State));.
9230: 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65      memset(state
9240: 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53  Ptr, 0, sizeof(S
9250: 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61  tate));..    sta
9260: 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66  tePtr->flags.= f
9270: 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50  lags;.    stateP
9280: 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74  tr->interp.= int
9290: 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74  erp;.    statePt
92a0: 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69  r->vflags.= veri
92b0: 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  fy;.    statePtr
92c0: 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20  ->err.= "";..   
92d0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72   /* allocate scr
92e0: 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ipt */.    if (c
92f0: 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  mdObj != NULL) {
9300: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
9310: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d  StringFromObj(cm
9320: 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  dObj, &len);..if
9330: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
9340: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
9350: 20 3d 20 63 6d 64 4f 62 6a 3b 0a 09 20 20 20 20   = cmdObj;..    
9360: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
9370: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
9380: 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  ack);..}.    }..
9390: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
93a0: 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20  password */.    
93b0: 69 66 20 28 70 61 73 73 77 64 4f 62 6a 20 21 3d  if (passwdObj !=
93c0: 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29   NULL) {..(void)
93d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
93e0: 6f 6d 4f 62 6a 28 70 61 73 73 77 64 4f 62 6a 2c  omObj(passwdObj,
93f0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
9400: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
9410: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
9420: 73 73 77 64 4f 62 6a 3b 0a 09 20 20 20 20 54 63  sswdObj;..    Tc
9430: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
9440: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
9450: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
9460: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61    /* allocate va
9470: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a  lidate command *
9480: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20  /.    if (vcmd) 
9490: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
94a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76  tStringFromObj(v
94b0: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  cmd, &len);..if 
94c0: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
94d0: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63  tePtr->vcmd = vc
94e0: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  md;..    Tcl_Inc
94f0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
9500: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20  tr->vcmd);..}.  
9510: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64    }..    if (mod
9520: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  el != NULL) {..i
9530: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74  nt mode;../* Get
9540: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e   the "model" con
9550: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  text */..chan = 
9560: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9570: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d  nterp, model, &m
9580: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20  ode);..if (chan 
9590: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
95a0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
95b0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
95c0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
95d0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
95e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
95f0: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65  /*.. * Make sure
9600: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
9610: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
9620: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  el.. */..chan = 
9630: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
9640: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63  l(chan);..if (Tc
9650: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
9660: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
9670: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
9680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
96a0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
96b0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
96c0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
96d0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
96e0: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
96f0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
9700: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
9710: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
9720: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
9730: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
9740: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
9750: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
9760: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
9770: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
9780: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
9790: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
97a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
97b0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
97c0: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
97d0: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
97e0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
97f0: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
9800: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
9810: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
9820: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09  (int) key_len,..
9830: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c      (int) cert_l
9840: 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69  en, CApath, CAfi
9850: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70  le, ciphers, cip
9860: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c  hersuites, level
9870: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20  , DHparams)) == 
9880: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
9890: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
98a0: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
98b0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
98c0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
98d0: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72   }..    statePtr
98e0: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20  ->ctx = ctx;..  
98f0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e    /*.     * We n
9900: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
9910: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65   that the channe
9920: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72  l works in binar
9930: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20  y (for the.     
9940: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74  * encryption not
9950: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75   to get goofed u
9960: 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  p)..     */.    
9970: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9980: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
9990: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
99a0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
99b0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
99c0: 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  king);.    Tcl_D
99d0: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
99e0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
99f0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
9a00: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
9a10: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
9a20: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9a30: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9a40: 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  han, "-eofchar",
9a50: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f   &upperChannelEO
9a60: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
9a70: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9a80: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9a90: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
9aa0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9ab0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
9ac0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9ad0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
9ae0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65  nslation", &uppe
9af0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
9b00: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ion);.    Tcl_Ge
9b10: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9b20: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
9b30: 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72  locking", &upper
9b40: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
9b50: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
9b60: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9b70: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
9b80: 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79  lation", "binary
9b90: 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ");.    Tcl_SetC
9ba0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9bb0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
9bc0: 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b  cking", "true");
9bd0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f  .    dprintf("Co
9be0: 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e  nsuming Tcl chan
9bf0: 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  nel %s", Tcl_Get
9c00: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
9c10: 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  ));.    statePtr
9c20: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61  ->self = Tcl_Sta
9c30: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
9c40: 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  , Tls_ChannelTyp
9c50: 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  e(), (ClientData
9c60: 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43  ) statePtr,..(TC
9c70: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
9c80: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
9c90: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
9ca0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
9cb0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
9cc0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73   {../*.. * No us
9cd0: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61  e of Tcl_Eventua
9ce0: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20  llyFree because 
9cf0: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f  no possible Tcl_
9d00: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09  Preserve... */..
9d10: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
9d20: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
9d30: 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  Ptr);..Tcl_DStri
9d40: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
9d50: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
9d60: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
9d70: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
9d80: 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f  Encoding);..Tcl_
9d90: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
9da0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
9db0: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
9dc0: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
9dd0: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74  lBlocking);..ret
9de0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9df0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
9e00: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e  f("Created chann
9e10: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63  el named %s", Tc
9e20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
9e30: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
9e40: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9e50: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9e60: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9e70: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  lf, "-translatio
9e80: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
9e90: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
9ea0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
9eb0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9ec0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9ed0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9ee0: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54  , "-encoding", T
9ef0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9f00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
9f10: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c  oding));.    Tcl
9f20: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
9f30: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
9f40: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63  tr->self, "-eofc
9f50: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
9f60: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9f70: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20  nnelEOFChar));. 
9f80: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
9f90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9fa0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
9fb0: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c  "-blocking", Tcl
9fc0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
9fd0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
9fe0: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44  ing));.    Tcl_D
9ff0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
a000: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
a010: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
a020: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
a030: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
a040: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
a050: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
a060: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
a070: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
a080: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
a090: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a  ocking);..    /*
a0a0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
a0b0: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
a0c0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
a0d0: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
a0e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
a0f0: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
a100: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
a110: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
a120: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
a130: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
a140: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
a150: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
a160: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
a170: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a180: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
a190: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
a1a0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
a1b0: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44   "INIT", "FAILED
a1c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a1d0: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c  );..Tls_Free((tl
a1e0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
a1f0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
a200: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a210: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68   }..    /* Set h
a220: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ost server name 
a230: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  */.    if (serve
a240: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74  rname) {../* Set
a250: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  s the server nam
a260: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
a270: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c  I) in ClientHell
a280: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09  o extension */..
a290: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c  /* Per RFC 6066,
a2a0: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41   hostname is a A
a2b0: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72  SCII encoded str
a2c0: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20  ing, though RFC 
a2d0: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e  4366 says UTF-8.
a2e0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65   */..if (!SSL_se
a2f0: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61  t_tlsext_host_na
a300: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
a310: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26  , servername) &&
a320: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20   require) {..   
a330: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a340: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53  t(interp, "Set S
a350: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  NI extension fai
a360: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
a370: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
a380: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a390: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
a3a0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
a3b0: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
a3c0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
a3d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a3e0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
a3f0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
a400: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
a410: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
a420: 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65  ./* Set hostname
a430: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66   for peer certif
a440: 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76  icate hostname v
a450: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63  erification in c
a460: 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27  lients...   Don'
a470: 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68  t use SSL_set1_h
a480: 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73  ost since it has
a490: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f   limitations. */
a4a0: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f  ..if (!SSL_add1_
a4b0: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73  host(statePtr->s
a4c0: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29  sl, servername))
a4d0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a4e0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a4f0: 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61   "Set DNS hostna
a500: 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45  me failed: ", GE
a510: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
a520: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
a530: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
a540: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
a550: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
a560: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c  HOSTNAME", "FAIL
a570: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
a580: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a590: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
a5a0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
a5b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a5c0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
a5d0: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73  .    /* Resume s
a5e0: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  ession id */.   
a5f0: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20   if (session_id 
a600: 26 26 20 73 65 73 73 5f 6c 65 6e 20 3c 3d 20 53  && sess_len <= S
a610: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c  SL_MAX_SID_CTX_L
a620: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c  ENGTH) {../* SSL
a630: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a  _set_session() *
a640: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53  /..if (!SSL_SESS
a650: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74  ION_set1_id_cont
a660: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73  ext(SSL_get_sess
a670: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
a680: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20  l), session_id, 
a690: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73  (unsigned int) s
a6a0: 65 73 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  ess_len)) {..   
a6b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a6c0: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d  t(interp, "Resum
a6d0: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64  e session failed
a6e0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
a6f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
a700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
a710: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
a720: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
a730: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c  ORT", "SESSION",
a740: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
a750: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a760: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
a770: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
a780: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a790: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a7a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
a7b0: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e  able Application
a7c0: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20  -Layer Protocol 
a7d0: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61  Negotiation. Exa
a7e0: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f  mples are: http/
a7f0: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20  1.0,..http/1.1, 
a800: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61  h2, h3, ftp, ima
a810: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c  p, pop3, xmpp-cl
a820: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65  ient, xmpp-serve
a830: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74  r, mqtt, irc, et
a840: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c  c. */.    if (al
a850: 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  pnObj != NULL) {
a860: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
a870: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
a880: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
a890: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
a8a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
a8b0: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
a8c0: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
a8d0: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
a8e0: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
a8f0: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
a900: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
a910: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
a920: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 4f 62 6a  (interp, alpnObj
a930: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21  , &cnt, &list) !
a940: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
a950: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a960: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a970: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a990: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
a9a0: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
a9b0: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74  red for the prot
a9c0: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f  ocol-list */..fo
a9d0: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e  r (i = 0; i < cn
a9e0: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54  t; i++) {..    T
a9f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
aa00: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65  Obj(list[i], &le
aa10: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
aa20: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f   > 255) {...Tcl_
aa30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
aa40: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f  erp, "ALPN proto
aa50: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f  col names too lo
aa60: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ng", (char *) NU
aa70: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
aa80: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
aa90: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
aaa0: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
aab0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
aac0: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 74  );...Tls_Free((t
aad0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
aae0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
aaf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
ab00: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
ab10: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e  s_len += 1 + (in
ab20: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  t) len;..}.../* 
ab30: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65  Build the comple
ab40: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  te protocol-list
ab50: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b   */..protos = ck
ab60: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e  alloc(protos_len
ab70: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d  );../* protocol-
ab80: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66  lists consist of
ab90: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72   8-bit length-pr
aba0: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72  efixed, byte str
abb0: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20  ings */..for (j 
abc0: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b  = 0, p = protos;
abd0: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b   j < cnt; j++) {
abe0: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20  ..    char *str 
abf0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
ac00: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20  romObj(list[j], 
ac10: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b  &len);..    *p++
ac20: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
ac30: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d  r) len;..    mem
ac40: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a  cpy(p, str, (siz
ac50: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
ac60: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  p += len;..}.../
ac70: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
ac80: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
ac90: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
aca0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e  ol-list */../* N
acb0: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ote: This functi
acc0: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20  on reverses the 
acd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
ace0: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
acf0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
ad00: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
ad10: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
ad20: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
ad30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ad40: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50  interp, "Set ALP
ad50: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c  N protocols fail
ad60: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
ad70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
ad80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
ad90: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
ada0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
adb0: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
adc0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
add0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
ade0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
adf0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
ae00: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
ae10: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
ae20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ae30: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
ae40: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
ae50: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
ae60: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
ae70: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
ae80: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
ae90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
aea0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
aeb0: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
aec0: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
aed0: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
aee0: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
aef0: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
af00: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
af10: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
af20: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
af30: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
af40: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
af50: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
af60: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
af70: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
af80: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73  back);.    SSL_s
af90: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b  et_info_callback
afa0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
afb0: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  InfoCallback);..
afc0: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
afd0: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72  for observing pr
afe0: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20  otocol messages 
aff0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
b000: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
b010: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f      /* void SSL_
b020: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
b030: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74  back_arg(statePt
b040: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
b050: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76  statePtr);.    v
b060: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
b070: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
b080: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73  tePtr->ctx, Mess
b090: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f  ageCallback); */
b0a0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67  .    SSL_set_msg
b0b0: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
b0c0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
b0d0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
b0e0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
b0f0: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
b100: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43  r->ssl, MessageC
b110: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66  allback);.#endif
b120: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
b130: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20  Tcl_Channel BIO 
b140: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73  Handler */.    s
b150: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d  tatePtr->p_bio.=
b160: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61   BIO_new_tcl(sta
b170: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  tePtr, BIO_NOCLO
b180: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  SE);.    statePt
b190: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  r->bio.= BIO_new
b1a0: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a  (BIO_f_ssl());..
b1b0: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20      if (server) 
b1c0: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c  {../* Server cal
b1d0: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43  lbacks */..SSL_C
b1e0: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65  TX_set_tlsext_se
b1f0: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61  rvername_arg(sta
b200: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
b210: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
b220: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
b230: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61  xt_servername_ca
b240: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
b250: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63  >ctx, SNICallbac
b260: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  k);..SSL_CTX_set
b270: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62  _client_hello_cb
b280: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b290: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  HelloCallback, (
b2a0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
b2b0: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  ;..if (statePtr-
b2c0: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
b2d0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
b2e0: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f  set_alpn_select_
b2f0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
b300: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
b310: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
b320: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  );.#ifdef USE_NP
b330: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f  N..    if (tls1_
b340: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33  2 == 0 && tls1_3
b350: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43   == 0) {...SSL_C
b360: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
b370: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62  os_advertised_cb
b380: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b390: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  NPNCallback, (vo
b3a0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
b3b0: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d  .    }.#endif..}
b3c0: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72  .../* Enable ser
b3d0: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74  ver to send cert
b3e0: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68   request after h
b3f0: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e  andshake (TLS 1.
b400: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41  3 only) */../* A
b410: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
b420: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65   must take place
b430: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69   for the Certifi
b440: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20  cate Request to 
b450: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74  be..   sent to t
b460: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20  he client, this 
b470: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68  can be done with
b480: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b   SSL_do_handshak
b490: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  e(). */..if (req
b4a0: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
b4b0: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33  dshake && tls1_3
b4c0: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72  ) {..    SSL_ver
b4d0: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f  ify_client_post_
b4e0: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50  handshake(stateP
b4f0: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f  tr->ssl);..}.../
b500: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20  * set automatic 
b510: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20  curve selection 
b520: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68  */..SSL_set_ecdh
b530: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e  _auto(statePtr->
b540: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65  ssl, 1);.../* Se
b550: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
b560: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
b570: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
b580: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
b590: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
b5a0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
b5b0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
b5c0: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
b5d0: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
b5e0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
b5f0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
b600: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
b610: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
b620: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
b630: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
b640: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
b650: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
b660: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
b670: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
b680: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
b690: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
b6a0: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
b6b0: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
b6c0: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
b6d0: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
b6e0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
b6f0: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
b700: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
b710: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
b720: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
b730: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
b740: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
b750: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
b760: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
b770: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
b780: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
b790: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
b7a0: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
b7b0: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
b7c0: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
b7d0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
b7e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
b7f0: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
b800: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
b810: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
b820: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  l);.    }.    SS
b830: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50  L_set_bio(stateP
b840: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74  tr->ssl, statePt
b850: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50  r->p_bio, stateP
b860: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20  tr->p_bio);.    
b870: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74  BIO_set_ssl(stat
b880: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65  ePtr->bio, state
b890: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f  Ptr->ssl, BIO_NO
b8a0: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a  CLOSE);..    /*.
b8b0: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53       * End of SS
b8c0: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20  L Init.     */. 
b8d0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
b8e0: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47  rning %s", Tcl_G
b8f0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
b900: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
b910: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
b920: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
b930: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
b940: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
b950: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
b960: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ILE);..    retur
b970: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
b980: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69  ------. *. * Uni
b9d0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
b9e0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
b9f0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
ba00: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70  o remove the top
ba10: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c  most channel fil
ba20: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
ba30: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
ba40: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
ba50: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
ba60: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
ba70: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
ba80: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
ba90: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
baa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bad0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
bae0: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f  ic int.UnimportO
baf0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
bb00: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
bb10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
bb20: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
bb30: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
bb40: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
bb50: 6e 65 6c 20 63 68 61 6e 2c 20 63 68 69 6c 64 3b  nel chan, child;
bb60: 09 2f 2a 20 54 68 65 20 73 74 61 63 6b 65 64 20  ./* The stacked 
bb70: 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e 67 20 63  and underlying c
bb80: 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 20 20 54  hannels */.    T
bb90: 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72  cl_DString upper
bba0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
bbb0: 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  on, upperChannel
bbc0: 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43  Blocking, upperC
bbd0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20  hannelEncoding, 
bbe0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
bbf0: 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 72 65 73  har;.    int res
bc00: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 28   = TCL_OK;.    (
bc10: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
bc20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
bc30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
bc40: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
bc50: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
bc60: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
bc70: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
bc80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bc90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
bca0: 56 61 6c 69 64 61 74 65 20 63 68 61 6e 6e 65 6c  Validate channel
bcb0: 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 68 61   name */.    cha
bcc0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
bcd0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
bce0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
bcf0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
bd00: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
bd10: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
bd20: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
bd30: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
bd40: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
bd50: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
bd60: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
bd70: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
bd80: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
bd90: 6e 29 3b 0a 20 20 20 20 63 68 69 6c 64 20 3d 20  n);.    child = 
bda0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68  Tcl_GetStackedCh
bdb0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
bdc0: 20 20 2f 2a 20 56 65 72 69 66 79 20 69 73 20 61    /* Verify is a
bdd0: 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c   stacked channel
bde0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 68 69 6c   */.    if (chil
bdf0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  d == NULL) {..Tc
be00: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
be10: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
be20: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
be30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
be40: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
be50: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 22  stacked channel"
be60: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
be70: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
be80: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
be90: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54  "TLS", "UNIMPORT
bea0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
beb0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
bec0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
bed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bee0: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c 75 73 68 20  }..    /* Flush 
bef0: 61 6e 79 20 70 65 6e 64 69 6e 67 20 64 61 74 61  any pending data
bf00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   */.    if (Tcl_
bf10: 46 6c 75 73 68 28 63 68 61 6e 29 20 21 3d 20 54  Flush(chan) != T
bf20: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
bf30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bf40: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
bf50: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
bf60: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
bf70: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
bf80: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
bf90: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
bfa0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
bfb0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
bfc0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
bfd0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
bfe0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
bff0: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  ng);..    /* Get
c000: 20 63 75 72 72 65 6e 74 20 63 6f 6e 66 69 67 20   current config 
c010: 2d 20 45 4f 4c 20 74 72 61 6e 73 6c 61 74 69 6f  - EOL translatio
c020: 6e 2c 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 20  n, encoding and 
c030: 62 75 66 66 65 72 69 6e 67 20 6f 70 74 69 6f 6e  buffering option
c040: 73 20 61 72 65 20 73 68 61 72 65 64 20 62 65 74  s are shared bet
c050: 77 65 65 6e 20 61 6c 6c 20 63 68 61 6e 6e 65 6c  ween all channel
c060: 73 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 2a  s in the stack *
c070: 2f 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  /.    Tcl_GetCha
c080: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
c090: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
c0a0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
c0b0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
c0c0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
c0d0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
c0e0: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  han, "-encoding"
c0f0: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
c100: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
c110: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
c120: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
c130: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70   "-eofchar", &up
c140: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
c150: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  r);.    Tcl_GetC
c160: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
c170: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
c180: 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65  nslation", &uppe
c190: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
c1a0: 69 6f 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e  ion);..    /* Un
c1b0: 73 74 61 63 6b 20 74 68 65 20 63 68 61 6e 6e 65  stack the channe
c1c0: 6c 20 61 6e 64 20 72 65 73 74 6f 72 65 20 75 6e  l and restore un
c1d0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
c1e0: 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20 69   config */.    i
c1f0: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68  f (Tcl_UnstackCh
c200: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
c210: 61 6e 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  an) == TCL_OK) {
c220: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
c230: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
c240: 68 69 6c 64 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  hild, "-encoding
c250: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
c260: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
c270: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 09 54 63  lEncoding));..Tc
c280: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
c290: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64  on(interp, child
c2a0: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63  , "-eofchar", Tc
c2b0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
c2c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
c2d0: 68 61 72 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43  har));..Tcl_SetC
c2e0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
c2f0: 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 74 72  erp, child, "-tr
c300: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f  anslation", Tcl_
c310: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
c320: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
c330: 61 74 69 6f 6e 29 29 3b 0a 09 54 63 6c 5f 53 65  ation));..Tcl_Se
c340: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
c350: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d  nterp, child, "-
c360: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
c370: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
c380: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
c390: 67 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  g));.    } else 
c3a0: 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52  {..res = TCL_ERR
c3b0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
c3c0: 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20  * Clean-up */.  
c3d0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
c3e0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
c3f0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
c400: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
c410: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
c420: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
c430: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
c440: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
c450: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
c460: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
c470: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
c480: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
c490: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
c4a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
c4e0: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63   * CTX_Init -- c
c4f0: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43  onstruct a SSL_C
c500: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20  TX instance. *. 
c510: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
c520: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e  valid SSL_CTX in
c530: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a  stance or NULL..
c540: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
c550: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
c560: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
c570: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
c580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5a0: 2d 2d 2d 2d 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 0a 20 2a 2f  ------------. */
c5c0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
c5d0: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65  *.CTX_Init(State
c5e0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
c5f0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
c600: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69  oto, char *keyfi
c610: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69  le, char *certfi
c620: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  le,.    unsigned
c630: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69   char *key, unsi
c640: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
c650: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e   int key_len, in
c660: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72  t cert_len, char
c670: 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68   *CApath,.    ch
c680: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72  ar *CAfile, char
c690: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
c6a0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69  *ciphersuites, i
c6b0: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a  nt level, char *
c6c0: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20  DHparams) {.    
c6d0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c6e0: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp = statePtr->i
c6f0: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43  nterp;.    SSL_C
c700: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
c710: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
c720: 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20  ds;.    int off 
c730: 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a  = 0, abort = 0;.
c740: 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69      int load_pri
c750: 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f  vate_key;.    co
c760: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a  nst SSL_METHOD *
c770: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72  method;..    dpr
c780: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
c790: 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29  .    if (!proto)
c7a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
c7b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
c7c0: 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20   valid protocol 
c7d0: 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72  selected", (char
c7e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
c7f0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
c800: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
c810: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66  L context */.#if
c820: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
c830: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
c840: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
c850: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
c860: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c870: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45  _SSL2).    if (E
c880: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
c890: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
c8a0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c8b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
c8c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c8d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c8e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c8f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c900: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c910: 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66  (NO_SSL3) || def
c920: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c930: 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL3).    if (EN
c940: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
c950: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a  _PROTO_SSL3)) {.
c960: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
c970: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20  t(interp, "SSL3 
c980: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
c990: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
c9a0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
c9b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
c9c0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
c9d0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
c9e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
c9f0: 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  LS1).    if (ENA
ca00: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
ca10: 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09  PROTO_TLS1)) {..
ca20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ca30: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
ca40: 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  0 protocol not s
ca50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
ca60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
ca70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
ca80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
ca90: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
caa0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
cab0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69  NO_TLS1_1).    i
cac0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
cad0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
cae0: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _1)) {..Tcl_Appe
caf0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cb00: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63   "TLS 1.1 protoc
cb10: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
cb20: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
cb30: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
cb40: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
cb50: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
cb60: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
cb70: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
cb80: 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  2).    if (ENABL
cb90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
cba0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09  OTO_TLS1_2)) {..
cbb0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cbc0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e  (interp, "TLS 1.
cbd0: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
cbe0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
cbf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
cc00: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
cc10: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
cc20: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
cc30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
cc40: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69  NO_TLS1_3).    i
cc50: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
cc60: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
cc70: 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _3)) {..Tcl_Appe
cc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cc90: 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63   "TLS 1.3 protoc
cca0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
ccb0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
ccc0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
ccd0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
cce0: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30    if (proto == 0
ccf0: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c  ) {../* Use full
cd00: 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43   range */..SSL_C
cd10: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
cd20: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
cd30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
cd40: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
cd50: 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  (ctx, 0);.    }.
cd60: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f  .    switch (pro
cd70: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53  to) {.#if OPENSS
cd80: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
cd90: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
cda0: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
cdb0: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
cdc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
cdd0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
cde0: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f  OTO_SSL2:..metho
cdf0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53  d = isServer ? S
ce00: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68  SLv2_server_meth
ce10: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69  od() : SSLv2_cli
ce20: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
ce30: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
ce40: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
ce50: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
ce60: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
ce70: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
ce80: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
ce90: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
cea0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65  _PROTO_SSL3:..me
ceb0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
cec0: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d  ? SSLv3_server_m
ced0: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f  ethod() : SSLv3_
cee0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
cef0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
cf00: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
cf10: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
cf20: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
cf30: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
cf40: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
cf50: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
cf60: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a  TLS_PROTO_TLS1:.
cf70: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
cf80: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65  er ? TLSv1_serve
cf90: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
cfa0: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  v1_client_method
cfb0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
cfc0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
cfd0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
cfe0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
cff0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
d000: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d010: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
d020: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d030: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68  TO_TLS1_1:..meth
d040: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d050: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d  TLSv1_1_server_m
d060: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
d070: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
d080: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d090: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d0a0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
d0b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d0c0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
d0d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d0e0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
d0f0: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d100: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f  O_TLS1_2:..metho
d110: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
d120: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65  LSv1_2_server_me
d130: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32  thod() : TLSv1_2
d140: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d150: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
d160: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d170: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
d180: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d190: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65  TLS1_3).    case
d1a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d1b0: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67  3:../* Use the g
d1c0: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e  eneric method an
d1d0: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e  d constraint ran
d1e0: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74  ge after context
d1f0: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09   is created */..
d200: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d210: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
d220: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
d230: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
d240: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
d250: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e    default:../* N
d260: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74  egotiate highest
d270: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54   available SSL/T
d280: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d  LS version */..m
d290: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
d2a0: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
d2b0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
d2c0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69  ent_method();.#i
d2d0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
d2e0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
d2f0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
d300: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
d310: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d320: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d  NO_SSL2)..off |=
d330: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d340: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
d350: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
d360: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69  NO_SSLv2);.#endi
d370: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d380: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
d390: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d3a0: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL3)..off |= (EN
d3b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d3c0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f  _PROTO_SSL3)   ?
d3d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
d3e0: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv3);.#endif.#i
d3f0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d400: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
d410: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d420: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
d430: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d440: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a  TO_TLS1)   ? 0 :
d450: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
d460: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
d470: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
d480: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d490: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
d4a0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
d4b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d4c0: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a  TO_TLS1_1) ? 0 :
d4d0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
d4e0: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _1);.#endif.#if 
d4f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d500: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
d510: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d520: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
d530: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d540: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30  ROTO_TLS1_2) ? 0
d550: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
d560: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_2);.#endif.#i
d570: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d580: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
d590: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d5a0: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_3)..off |= (EN
d5b0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d5c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f  _PROTO_TLS1_3) ?
d5d0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
d5e0: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_3);.#endif.
d5f0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20  .break;.    }.. 
d600: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
d610: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d  or();..    ctx =
d620: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74   SSL_CTX_new(met
d630: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63  hod);.    if (!c
d640: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55  tx) {..return NU
d650: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
d660: 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59  f (getenv(SSLKEY
d670: 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c  LOGFILE)) {..SSL
d680: 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f  _CTX_set_keylog_
d690: 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65  callback(ctx, Ke
d6a0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  yLogCallback);. 
d6b0: 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e     }..#if !defin
d6c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
d6d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d6e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
d6f0: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c   if (proto == TL
d700: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
d710: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  {..SSL_CTX_set_m
d720: 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  in_proto_version
d730: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
d740: 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  SION);..SSL_CTX_
d750: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
d760: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
d770: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20  3_VERSION);.    
d780: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
d790: 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65   Force cipher se
d7a0: 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79  lection order by
d7b0: 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69   server */.    i
d7c0: 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a  f (!isServer) {.
d7d0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74  .SSL_CTX_set_opt
d7e0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
d7f0: 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50  _CIPHER_SERVER_P
d800: 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20  REFERENCE);.    
d810: 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
d820: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
d830: 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20  0x10100000L.    
d840: 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f  OpenSSL_add_all_
d850: 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a  algorithms(); /*
d860: 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e   Load ciphers an
d870: 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e  d digests */.#en
d880: 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58  dif..    SSL_CTX
d890: 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74  _set_app_data(ct
d8a0: 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70  x, (void*)interp
d8b0: 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74  );./* remember t
d8c0: 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  he interpreter *
d8d0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
d8e0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
d8f0: 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61  SL_OP_ALL);./* a
d900: 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61  ll SSL bug worka
d910: 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53  rounds */.    SS
d920: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
d930: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f  s(ctx, SSL_OP_NO
d940: 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f  _COMPRESSION);./
d950: 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65  * disable compre
d960: 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75  ssion even if su
d970: 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53  pported */.    S
d980: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
d990: 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f  ns(ctx, off);../
d9a0: 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63  * disable protoc
d9b0: 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23  ol versions */.#
d9c0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
d9d0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
d9e0: 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f  101000L.    SSL_
d9f0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78  CTX_set_mode(ctx
da00: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f  , SSL_MODE_AUTO_
da10: 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c  RETRY);./* handl
da20: 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73  e new handshakes
da30: 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20   in background. 
da40: 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e  On by default in
da50: 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20   OpenSSL 1.1.1. 
da60: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53  */.#endif.    SS
da70: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63  L_CTX_sess_set_c
da80: 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31  ache_size(ctx, 1
da90: 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74  28);..    /* Set
daa0: 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69   user defined ci
dab0: 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75  phers, cipher su
dac0: 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69  ites, and securi
dad0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
dae0: 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20  if ((ciphers != 
daf0: 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54  NULL) && !SSL_CT
db00: 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73  X_set_cipher_lis
db10: 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29  t(ctx, ciphers))
db20: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
db30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
db40: 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64  t ciphers failed
db50: 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65  : No valid ciphe
db60: 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  rs", (char *) NU
db70: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
db80: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
db90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
dba0: 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74   if ((ciphersuit
dbb0: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  es != NULL) && !
dbc0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
dbd0: 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69  ersuites(ctx, ci
dbe0: 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09  phersuites)) {..
dbf0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
dc00: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
dc10: 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c  pher suites fail
dc20: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
dc30: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
dc40: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
dc50: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
dc60: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
dc70: 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72      /* Set secur
dc80: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
dc90: 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20   if (level > -1 
dca0: 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a  && level < 6) {.
dcb0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75  ./* SSL_set_secu
dcc0: 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53  rity_level */..S
dcd0: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72  SL_CTX_set_secur
dce0: 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c  ity_level(ctx, l
dcf0: 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  evel);.    }..  
dd00: 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61    /* set some ca
dd10: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53  llbacks */.    S
dd20: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
dd30: 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78  lt_passwd_cb(ctx
dd40: 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61  , PasswordCallba
dd50: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ck);.    SSL_CTX
dd60: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73  _set_default_pas
dd70: 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28  swd_cb_userdata(
dd80: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
dd90: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
dda0: 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65  read a Diffie-He
ddb0: 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73  llman parameters
ddc0: 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68   file, or use th
ddd0: 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a  e built-in one *
dde0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
ddf0: 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64  gInit(&ds);.#ifd
de00: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48  ef OPENSSL_NO_DH
de10: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
de20: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  s != NULL) {..Tc
de30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
de40: 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d  nterp, "DH param
de50: 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74  eter support not
de60: 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68   available", (ch
de70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
de80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
de90: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
dea0: 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b     }.#else.    {
deb0: 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44  ..DH* dh;..if (D
dec0: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
ded0: 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f   {..    BIO *bio
dee0: 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49  ;...    bio = BI
def0: 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44  O_new_file(F2N(D
df00: 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22  Hparams, &ds), "
df10: 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62  r");..    if (!b
df20: 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72  io) {...Tcl_DStr
df30: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
df40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
df50: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
df60: 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61  not find DH para
df70: 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63  meters file", (c
df80: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
df90: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
dfa0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
dfb0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64  ;..    }...    d
dfc0: 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f  h = PEM_read_bio
dfd0: 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e  _DHparams(bio, N
dfe0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  ULL, NULL, NULL)
dff0: 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ;..    BIO_free(
e000: 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  bio);..    Tcl_D
e010: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
e020: 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b  ..    if (!dh) {
e030: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
e040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75  ult(interp, "Cou
e050: 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70  ld not read DH p
e060: 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66  arameters from f
e070: 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ile", (char *) N
e080: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e090: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e0a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e0b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
e0c0: 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68  t_tmp_dh(ctx, dh
e0d0: 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28  );..    DH_free(
e0e0: 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a  dh);...} else {.
e0f0: 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c  .    /* Use well
e100: 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65   known DH parame
e110: 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62  ters that have b
e120: 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20  uilt-in support 
e130: 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20  in OpenSSL */.. 
e140: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
e150: 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c  set_dh_auto(ctx,
e160: 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70   1)) {...Tcl_App
e170: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e180: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61  , "Could not ena
e190: 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a  ble set DH auto:
e1a0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
e1b0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
e1c0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
e1d0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
e1e0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
e1f0: 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ..}.    }.#endif
e200: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
e210: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
e220: 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65      load_private
e230: 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  _key = 0;.    if
e240: 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55   (certfile != NU
e250: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
e260: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69  ate_key = 1;...i
e270: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
e280: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
e290: 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c  ctx, F2N(certfil
e2a0: 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c  e, &ds), SSL_FIL
e2b0: 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29  ETYPE_PEM) <= 0)
e2c0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   {..    Tcl_DStr
e2d0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
e2e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
e2f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
e300: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
e310: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
e320: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
e330: 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28  .GET_ERR_REASON(
e340: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
e350: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
e360: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
e370: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
e380: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
e390: 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c  (&ds);..    } el
e3a0: 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e  se if (cert != N
e3b0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
e3c0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69  vate_key = 1;..i
e3d0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
e3e0: 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28  ertificate_ASN1(
e3f0: 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63  ctx, cert_len, c
e400: 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  ert) <= 0) {..  
e410: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
e420: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
e430: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
e440: 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f  icate: ",...GET_
e450: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
e460: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
e470: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
e480: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
e490: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20  n NULL;..}..    
e4a0: 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69  } else {..certfi
e4b0: 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39  le = (char*)X509
e4c0: 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72  _get_default_cer
e4d0: 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28  t_file();...if (
e4e0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74  SSL_CTX_use_cert
e4f0: 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78  ificate_file(ctx
e500: 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f  , certfile, SSL_
e510: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
e520: 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20   0) {.#if 0..   
e530: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e540: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
e550: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74  e to use default
e560: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
e570: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
e580: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52  : ",...GET_ERR_R
e590: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
e5a0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
e5b0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e5c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
e5d0: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  L;.#endif..}.   
e5e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
e5f0: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
e600: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
e610: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
e620: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
e630: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
e640: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
e650: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
e660: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
e670: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
e680: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
e690: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
e6a0: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
e6b0: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
e6c0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
e6d0: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
e6e0: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
e6f0: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
e700: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
e710: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
e720: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
e730: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
e740: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
e750: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
e760: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
e770: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
e780: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
e790: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
e7a0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
e7b0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
e7c0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
e7d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e7e0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
e7f0: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
e800: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
e810: 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45  e, " ",...    GE
e820: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
e830: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e840: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e850: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
e860: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
e870: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
e880: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69  &ds);...} else i
e890: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20  f (key != NULL) 
e8a0: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  {..    if (SSL_C
e8b0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
e8c0: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f  y_ASN1(EVP_PKEY_
e8d0: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65  RSA, ctx, key,ke
e8e0: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09  y_len) <= 0) {..
e8f0: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
e900: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
e910: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
e920: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
e930: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
e940: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
e950: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
e960: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e970: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e980: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22  et public key: "
e990: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
e9a0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
e9b0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e9c0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e9d0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
e9e0: 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f  }../* Now we kno
e9f0: 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64  w that a key and
ea00: 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20   cert have been 
ea10: 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20  set against.. * 
ea20: 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  the SSL context 
ea30: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58  */..if (!SSL_CTX
ea40: 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b  _check_private_k
ea50: 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20  ey(ctx)) {..    
ea60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ea70: 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74  (interp, "privat
ea80: 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d  e key does not m
ea90: 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69  atch the certifi
eaa0: 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22  cate public key"
eab0: 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20  ,....     (char 
eac0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
ead0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
eae0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
eaf0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  LL;..}.    }..  
eb00: 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20    /* Set to use 
eb10: 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e  default location
eb20: 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65   and file for Ce
eb30: 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72  rtificate Author
eb40: 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66 69  ity (CA) certifi
eb50: 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20  cates. The.     
eb60: 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  * verify path an
eb70: 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f  d store can be o
eb80: 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65  verridden by the
eb90: 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e   SSL_CERT_DIR en
eba0: 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 66  v var. The verif
ebb0: 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20  y file can.     
ebc0: 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  * be overridden 
ebd0: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f  by the SSL_CERT_
ebe0: 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f  FILE env var. */
ebf0: 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
ec00: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65  X_set_default_ve
ec10: 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29  rify_paths(ctx))
ec20: 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20   {..abort++;.   
ec30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72   }..    /* Overr
ec40: 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20  ides for the CA 
ec50: 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20  verify path and 
ec60: 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69  file */.    {.#i
ec70: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
ec80: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
ec90: 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61  00000L..if (CApa
eca0: 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41  th != NULL || CA
ecb0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
ecc0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ecd0: 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44   ds1;..    Tcl_D
ece0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29  StringInit(&ds1)
ecf0: 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c  ;...    if (!SSL
ed00: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
ed10: 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20  _locations(ctx, 
ed20: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
ed30: 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64  , F2N(CApath, &d
ed40: 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b  s1))) {...abort+
ed50: 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  +;..    }..    T
ed60: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
ed70: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  ds);..    Tcl_DS
ed80: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b  tringFree(&ds1);
ed90: 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69  ...    /* Set li
eda0: 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e  st of CAs to sen
edb0: 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e  d to client when
edc0: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c   requesting a cl
edd0: 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65  ient certificate
ede0: 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70   */..    /* http
edf0: 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e  s://sourceforge.
ee00: 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35  net/p/tls/bugs/5
ee10: 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58  7/ */..    /* XX
ee20: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20  X:TODO: Let the 
ee30: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75  user supply valu
ee40: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20  es here instead 
ee50: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  of something tha
ee60: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20  t exists on the 
ee70: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20  filesystem */.. 
ee80: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39     STACK_OF(X509
ee90: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65  _NAME) *certName
eea0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69  s = SSL_load_cli
eeb0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28  ent_CA_file(F2N(
eec0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09  CAfile, &ds));..
eed0: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65      if (certName
eee0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53  s != NULL) {...S
eef0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
ef00: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
ef10: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20  ertNames);..    
ef20: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
ef30: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a  ngFree(&ds);..}.
ef40: 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61  .#else..if (CApa
ef50: 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  th != NULL) {.. 
ef60: 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
ef70: 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28  load_verify_dir(
ef80: 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ctx, F2N(CApath,
ef90: 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72   &ds))) {...abor
efa0: 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
efb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
efc0: 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43  (&ds);..}..if (C
efd0: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
efe0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
eff0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66  TX_load_verify_f
f000: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ile(ctx, F2N(CAf
f010: 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09  ile, &ds))) {...
f020: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
f030: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
f040: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20  Free(&ds);...   
f050: 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20   /* Set list of 
f060: 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63  CAs to send to c
f070: 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65  lient when reque
f080: 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63  sting a client c
f090: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
f0a0: 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39     STACK_OF(X509
f0b0: 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65  _NAME) *certName
f0c0: 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69  s = SSL_load_cli
f0d0: 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28  ent_CA_file(F2N(
f0e0: 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09  CAfile, &ds));..
f0f0: 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65      if (certName
f100: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53  s != NULL) {...S
f110: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
f120: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
f130: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20  ertNames);..    
f140: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
f150: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a  ngFree(&ds);..}.
f160: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
f170: 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a    return ctx;.}.
f180: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
f190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
f1d0: 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d   StatusObjCmd --
f1e0: 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63   return certific
f1f0: 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65  ate for connecte
f200: 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  d peer.. *. * Re
f210: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
f220: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
f230: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
f240: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
f250: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
f260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f290: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
f2a0: 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43  c int.StatusObjC
f2b0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
f2c0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
f2d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
f2e0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
f2f0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
f300: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
f310: 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a  ePtr;.    X509 *
f320: 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  peer;.    Tcl_Ob
f330: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54  j *objPtr;.    T
f340: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
f350: 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e  .    char *chann
f360: 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73  elName, *ciphers
f370: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a  ;.    int mode;.
f380: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
f390: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a  ed char *proto;.
f3a0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
f3b0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69   len;.    int ni
f3c0: 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69  d, res;.    (voi
f3d0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
f3e0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
f3f0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
f400: 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63  objc < 2 || objc
f410: 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d   > 3 || (objc ==
f420: 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63   3 && !strcmp(Tc
f430: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
f440: 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29  [1]), "-local"))
f450: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
f460: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
f470: 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f   objv, "?-local?
f480: 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74   channel");..ret
f490: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f4a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
f4b0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20   channel Id */. 
f4c0: 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d     channelName =
f4d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
f4e0: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f  bjv[(objc == 2 ?
f4f0: 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63   1 : 2)]);.    c
f500: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
f510: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
f520: 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29  nnelName, &mode)
f530: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
f540: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
f550: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
f560: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f570: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
f580: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
f590: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
f5a0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
f5b0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
f5c0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
f5d0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
f5e0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
f5f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
f600: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
f610: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f620: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
f630: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
f640: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
f650: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
f660: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
f670: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
f680: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
f690: 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c  "TLS", "STATUS",
f6a0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
f6b0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
f6c0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
f6d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
f6e0: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
f6f0: 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
f700: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
f710: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
f720: 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
f730: 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73  te for peer or s
f740: 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  elf */.    if (o
f750: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
f760: 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
f770: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
f780: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
f790: 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
f7a0: 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
f7b0: 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
f7c0: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ssl);.    }..   
f7d0: 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72   /* Get X509 cer
f7e0: 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f  tificate info */
f7f0: 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b  .    if (peer) {
f800: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e  ..objPtr = Tls_N
f810: 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70  ewX509Obj(interp
f820: 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62  , peer);..if (ob
f830: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20  jc == 2) {..    
f840: 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b  X509_free(peer);
f850: 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c  ..    peer = NUL
f860: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  L;..}.    } else
f870: 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c   {..objPtr = Tcl
f880: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
f890: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
f8a0: 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f   /* Peer name */
f8b0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
f8c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f8d0: 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c   "peername", SSL
f8e0: 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73  _get0_peername(s
f8f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
f900: 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  1);.    LAPPEND_
f910: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
f920: 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c  tr, "sbits", SSL
f930: 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73  _get_cipher_bits
f940: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
f950: 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70  NULL));..    cip
f960: 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53  hers = (char*)SS
f970: 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61  L_get_cipher(sta
f980: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
f990: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
f9a0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
f9b0: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20  pher", ciphers, 
f9c0: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  -1);..    /* Ver
f9d0: 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72  ify the X509 cer
f9e0: 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74  tificate present
f9f0: 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a  ed by the peer *
fa00: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  /.    LAPPEND_ST
fa10: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
fa20: 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22  , "verifyResult"
fa30: 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63  ,..X509_verify_c
fa40: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
fa50: 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f  (SSL_get_verify_
fa60: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
fa70: 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20  >ssl)), -1);..  
fa80: 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65    /* Verify mode
fa90: 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53   */.    mode = S
faa0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f  SL_get_verify_mo
fab0: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  de(statePtr->ssl
fac0: 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20  );.    if (mode 
fad0: 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f  && SSL_VERIFY_NO
fae0: 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53  NE) {..LAPPEND_S
faf0: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
fb00: 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c  r, "verifyMode",
fb10: 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20   "none", -1);.  
fb20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
fb30: 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20  Obj *listObjPtr 
fb40: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
fb50: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28  (0, NULL);..if (
fb60: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
fb70: 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20  FY_PEER) {..    
fb80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fb90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fba0: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
fbb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
fbc0: 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  eer", -1));..}..
fbd0: 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
fbe0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
fbf0: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
fc00: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fc10: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fc20: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
fc30: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fc40: 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65  j("fail if no pe
fc50: 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a  er cert", -1));.
fc60: 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
fc70: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
fc80: 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54  T_ONCE) {..    T
fc90: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
fca0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
fcb0: 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
fcc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c  NewStringObj("cl
fcd0: 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29  ient once", -1))
fce0: 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
fcf0: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  & SSL_VERIFY_POS
fd00: 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09  T_HANDSHAKE) {..
fd10: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
fd20: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
fd30: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
fd40: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
fd50: 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  j("post handshak
fd60: 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41  e", -1));..}..LA
fd70: 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70  PPEND_OBJ(interp
fd80: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
fd90: 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50  yMode", listObjP
fda0: 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  tr).    }..    /
fdb0: 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65  * Verify mode de
fdc0: 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  pth */.    LAPPE
fdd0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
fde0: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65  bjPtr, "verifyDe
fdf0: 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65  pth", SSL_get_ve
fe00: 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65  rify_depth(state
fe10: 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20  Ptr->ssl));..   
fe20: 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73   /* Report the s
fe30: 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
fe40: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
fe50: 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  the negotiation 
fe60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f  */.    SSL_get0_
fe70: 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74  alpn_selected(st
fe80: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72  atePtr->ssl, &pr
fe90: 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20  oto, &len);.    
fea0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
feb0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70  rp, objPtr, "alp
fec0: 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74  n", (char *)prot
fed0: 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  o, (Tcl_Size) le
fee0: 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  n);.    LAPPEND_
fef0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
ff00: 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
ff10: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
ff20: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
ff30: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  -1);..    /* Val
ff40: 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73  id for non-RSA s
ff50: 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53  ignature and TLS
ff60: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28   1.3 */.    if (
ff70: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65  objc == 2) {..re
ff80: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  s = SSL_get_peer
ff90: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
ffa0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
ffb0: 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  id);.    } else 
ffc0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
ffd0: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
ffe0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
fff0: 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
10000 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
10010 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
10020 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10030 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61  tr, "signatureHa
10040 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  shAlgorithm", OB
10050 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
10060 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65  1);..    /* Adde
10070 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31  d in OpenSSL 1.1
10080 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  .1a */.#if OPENS
10090 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
100a0 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c 0a  R > 0x10101000L.
100b0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
100c0 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  2) {..res = SSL_
100d0 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
100e0 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
100f0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10100 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10110 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10120 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
10130 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
10140 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
10150 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
10160 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
10170 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10180 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
10190 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  Type", OBJ_nid2l
101a0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e  n(nid), -1);.#en
101b0 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  dif..    Tcl_Set
101c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
101d0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
101e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
101f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
10200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
10240 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
10250 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
10260 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  connection info 
10270 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a  from OpenSSL.. *
10280 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
10290 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63  A list of connec
102a0 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a  tion info.  *. *
102b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102f0 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
10300 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  int ConnectionIn
10310 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  foObjCmd(ClientD
10320 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
10330 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10340 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
10350 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
10360 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
10370 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
10380 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
10390 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f  set a mode on */
103a0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
103b0 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
103c0 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
103d0 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c  ocket */.    Tcl
103e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c  _Obj *objPtr, *l
103f0 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  istPtr;.    cons
10400 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20  t SSL *ssl;.    
10410 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52  const SSL_CIPHER
10420 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f   *cipher;.    co
10430 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  nst SSL_SESSION 
10440 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f  *session;.    co
10450 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a  nst EVP_MD *md;.
10460 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
10470 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28  tData;..    if (
10480 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
10490 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
104a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
104b0 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
104c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
104d0 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
104e0 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
104f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10500 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10510 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
10520 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
10530 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
10540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10550 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
10560 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
10570 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
10580 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
10590 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
105a0 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
105b0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
105c0 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
105d0 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
105e0 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
105f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10600 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
10610 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
10620 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
10630 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20  .    "\": not a 
10640 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
10650 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  har *) NULL);..T
10660 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
10670 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
10680 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48  CONNECTION", "CH
10690 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
106a0 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
106b0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
106c0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
106d0 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65   objPtr = Tcl_Ne
106e0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
106f0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  );..    /* Conne
10700 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ction info */.  
10710 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
10720 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
10730 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
10740 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20  (chan);.    ssl 
10750 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b  = statePtr->ssl;
10760 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
10770 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e  NULL) {../* conn
10780 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a  ection state */.
10790 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
107a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
107b0 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f  ate", SSL_state_
107c0 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29  string_long(ssl)
107d0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
107e0 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65  SNI requested se
107f0 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  rver name */..LA
10800 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10810 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65  , objPtr, "serve
10820 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f  rname", SSL_get_
10830 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
10840 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
10850 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b  host_name), -1);
10860 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63  .../* Get protoc
10870 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  ol */..LAPPEND_S
10880 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10890 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53  r, "protocol", S
108a0 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
108b0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52  sl), -1);.../* R
108c0 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c  enegotiation all
108d0 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  owed */..LAPPEND
108e0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
108f0 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61  jPtr, "renegotia
10900 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53  tion_allowed", S
10910 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65  SL_get_secure_re
10920 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70  negotiation_supp
10930 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29  ort((SSL *) ssl)
10940 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75  );.../* Get secu
10950 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c  rity level */..L
10960 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
10970 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75  p, objPtr, "secu
10980 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c  rity_level", SSL
10990 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _get_security_le
109a0 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  vel(ssl));.../* 
109b0 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
109c0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
109d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
109e0 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20  ession_reused", 
109f0 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73  SSL_session_reus
10a00 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49  ed(ssl));.../* I
10a10 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  s server info */
10a20 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
10a30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10a40 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f  is_server", SSL_
10a50 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b  is_server(ssl));
10a60 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f  .../* Is DTLS */
10a70 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
10a80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10a90 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73  is_dtls", SSL_is
10aa0 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20  _dtls(ssl));.   
10ab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65   }..    /* Ciphe
10ac0 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69  r info */.    ci
10ad0 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  pher = SSL_get_c
10ae0 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73  urrent_cipher(ss
10af0 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  l);.    if (ciph
10b00 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  er != NULL) {..c
10b10 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20  har buf[BUFSIZ] 
10b20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73  = {0};..int bits
10b30 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a  , alg_bits;.../*
10b40 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a   Cipher name */.
10b50 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10b60 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
10b70 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45  pher", SSL_CIPHE
10b80 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65  R_get_name(ciphe
10b90 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46  r), -1);.../* RF
10ba0 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72  C name of cipher
10bb0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
10bc0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10bd0 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22   "standard_name"
10be0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61  , SSL_CIPHER_sta
10bf0 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65  ndard_name(ciphe
10c00 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70  r), -1);.../* Op
10c10 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69  enSSL name of ci
10c20 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  pher */..LAPPEND
10c30 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10c40 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61  Ptr, "openssl_na
10c50 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70  me", OPENSSL_cip
10c60 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50  her_name(SSL_CIP
10c70 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d  HER_standard_nam
10c80 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  e(cipher)), -1);
10c90 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .../* number of 
10ca0 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64  secret bits used
10cb0 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09   for cipher */..
10cc0 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45  bits = SSL_CIPHE
10cd0 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65  R_get_bits(ciphe
10ce0 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09  r, &alg_bits);..
10cf0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10d00 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
10d10 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29  ret_bits", bits)
10d20 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  ;..LAPPEND_INT(i
10d30 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10d40 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c  algorithm_bits",
10d50 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20   alg_bits);../* 
10d60 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75  alg_bits is actu
10d70 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69  al key secret bi
10d80 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20  ts. If use bits 
10d90 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f  and secret (algo
10da0 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66  rithm) bits diff
10db0 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74  er,..   the rest
10dc0 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65   of the bits are
10dd0 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72   fixed, i.e. for
10de0 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20   limited export 
10df0 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20  ciphers (bits < 
10e00 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69  56) */.../* Indi
10e10 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f  cates which SSL/
10e20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72  TLS protocol ver
10e30 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e  sion first defin
10e40 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  ed the cipher */
10e50 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10e60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d  terp, objPtr, "m
10e70 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c  in_version", SSL
10e80 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73  _CIPHER_get_vers
10e90 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ion(cipher), -1)
10ea0 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49  ;.../* Cipher NI
10eb0 44 2c 20 64 69 67 65 73 74 20 4e 49 44 20 28 6e  D, digest NID (n
10ec0 6f 6e 65 20 66 6f 72 20 41 45 41 44 20 63 69 70  one for AEAD cip
10ed0 68 65 72 20 73 75 69 74 65 73 29 2c 20 4b 65 79  her suites), Key
10ee0 20 45 78 63 68 61 6e 67 65 20 4e 49 44 2c 20 61   Exchange NID, a
10ef0 6e 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  nd authenticatio
10f00 6e 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e  n NID */..LAPPEN
10f10 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10f20 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44  jPtr, "cipherNID
10f30 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
10f40 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
10f50 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28  _get_cipher_nid(
10f60 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09  cipher)), -1);..
10f70 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10f80 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67  rp, objPtr, "dig
10f90 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  estNID", (char *
10fa0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
10fb0 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73  CIPHER_get_diges
10fc0 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  t_nid(cipher)), 
10fd0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
10fe0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10ff0 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49  , "keyExchangeNI
11000 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
11010 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
11020 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70  R_get_kx_nid(cip
11030 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
11040 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11050 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e   objPtr, "authen
11060 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63  ticationNID", (c
11070 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
11080 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
11090 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29  auth_nid(cipher)
110a0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73  ), -1);.../* mes
110b0 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74  sage authenticat
110c0 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65  ion code - Ciphe
110d0 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20  r is AEAD (e.g. 
110e0 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f  GCM or ChaCha20/
110f0 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74  Poly1305) or not
11100 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69   */../* Authenti
11110 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e  cated Encryption
11120 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64   with associated
11130 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65   data (AEAD) che
11140 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ck */..LAPPEND_B
11150 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
11160 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61  tr, "cipher_is_a
11170 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  ead", SSL_CIPHER
11180 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29  _is_aead(cipher)
11190 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e  );.../* Get Open
111a0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c  SSL-specific ID,
111b0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a   not IANA ID */.
111c0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
111d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
111e0 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20  pher_id", (int) 
111f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
11200 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
11210 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65   Two-byte ID use
11220 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f  d in the TLS pro
11230 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76  tocol of the giv
11240 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  en cipher */..LA
11250 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11260 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f  , objPtr, "proto
11270 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  col_id", (int) S
11280 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72  SL_CIPHER_get_pr
11290 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72  otocol_id(cipher
112a0 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c  ));.../* Textual
112b0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
112c0 74 68 65 20 63 69 70 68 65 72 2e 20 49 6e 63 6c  the cipher. Incl
112d0 75 64 65 73 3a 20 63 69 70 68 65 72 20 6e 61 6d  udes: cipher nam
112e0 65 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  e, protocol vers
112f0 69 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65 78 63  ion, key..   exc
11300 68 61 6e 67 65 2c 20 61 75 74 68 65 6e 74 69 63  hange, authentic
11310 61 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72 69 63  ation, symmetric
11320 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74 68   encryption meth
11330 6f 64 2c 20 6d 65 73 73 61 67 65 20 61 75 74 68  od, message auth
11340 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
11350 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  */..if (SSL_CIPH
11360 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
11370 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
11380 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
11390 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  ) {..    LAPPEND
113a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
113b0 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f  Ptr, "descriptio
113c0 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d  n", buf, -1);..}
113d0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
113e0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
113f0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
11400 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
11410 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
11420 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
11430 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
11440 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
11450 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11460 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
11470 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
11480 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
11490 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , -1);.    }..  
114a0 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66    /* Session inf
114b0 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  o */.    session
114c0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69   = SSL_get_sessi
114d0 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  on(ssl);.    if 
114e0 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c  (session != NULL
114f0 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  ) {..const unsig
11500 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
11510 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a  ;..size_t len2;.
11520 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c  .unsigned int ul
11530 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en;..const unsig
11540 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
11550 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75  n_id, *proto;..u
11560 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66  nsigned char buf
11570 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54  fer[SSL_MAX_MAST
11580 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a  ER_KEY_LENGTH];.
11590 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
115a0 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
115b0 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
115c0 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69   the ALPN negoti
115d0 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45  ation */..SSL_SE
115e0 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f  SSION_get0_alpn_
115f0 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e  selected(session
11600 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29  , &proto, &len2)
11610 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11620 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11630 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20  alpn", (char *) 
11640 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65  proto, (Tcl_Size
11650 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65  ) len2);.../* Re
11660 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
11670 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
11680 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50  result of the NP
11690 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  N negotiation */
116a0 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
116b0 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70  .SSL_get0_next_p
116c0 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28  roto_negotiated(
116d0 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c  ssl, &proto, &ul
116e0 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  en);..LAPPEND_ST
116f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11700 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a  , "npn", (char *
11710 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  ) proto, (Tcl_Si
11720 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69  ze) ulen);.#endi
11730 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65  f.../* Resumable
11740 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50   session */..LAP
11750 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11760 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d  , objPtr, "resum
11770 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  able", SSL_SESSI
11780 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28  ON_is_resumable(
11790 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
117a0 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69  Session start ti
117b0 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63  me (seconds sinc
117c0 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50  e epoch) */..LAP
117d0 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70  PEND_LONG(interp
117e0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74  , objPtr, "start
117f0 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53  _time", SSL_SESS
11800 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73  ION_get_time(ses
11810 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d  sion));.../* Tim
11820 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c  eout value - SSL
11830 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74  _CTX_get_timeout
11840 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f   (in seconds) */
11850 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69  ..LAPPEND_LONG(i
11860 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11870 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45  timeout", SSL_SE
11880 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75  SSION_get_timeou
11890 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
118a0 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54  * Session id - T
118b0 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77  LSv1.2 and below
118c0 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f   only */..sessio
118d0 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
118e0 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f  ON_get_id(sessio
118f0 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  n, &ulen);..LAPP
11900 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
11910 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
11920 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e  ion_id", session
11930 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  _id, (Tcl_Size) 
11940 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ulen);.../* Sess
11950 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  ion context */..
11960 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
11970 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64  _SESSION_get0_id
11980 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e  _context(session
11990 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
119a0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
119b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
119c0 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73  on_context", ses
119d0 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
119e0 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20  ze) ulen);.../* 
119f0 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d  Session ticket -
11a00 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a   client only */.
11a10 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
11a20 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e  0_ticket(session
11a30 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
11a40 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
11a50 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
11a60 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b  r, "session_tick
11a70 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63  et", ticket, (Tc
11a80 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
11a90 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
11aa0 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74  et lifetime hint
11ab0 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f   (in seconds) */
11ac0 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69  ..LAPPEND_LONG(i
11ad0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11ae0 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53  lifetime", SSL_S
11af0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65  ESSION_get_ticke
11b00 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28  t_lifetime_hint(
11b10 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
11b20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20  Ticket app data 
11b30 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
11b40 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
11b50 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c  0x30000000L..SSL
11b60 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
11b70 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53  cket_appdata((SS
11b80 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73  L_SESSION *) ses
11b90 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
11ba0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
11bb0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
11bc0 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61  bjPtr, "ticket_a
11bd0 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74  pp_data", ticket
11be0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
11bf0 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  2);.#endif.../* 
11c00 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a  Get master key *
11c10 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45  /..len2 = SSL_SE
11c20 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72  SSION_get_master
11c30 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75  _key(session, bu
11c40 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41  ffer, SSL_MAX_MA
11c50 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29  STER_KEY_LENGTH)
11c60 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
11c70 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
11c80 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20  , "master_key", 
11c90 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a  buffer, (Tcl_Siz
11ca0 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43  e) len2);.../* C
11cb0 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f  ompression id */
11cc0 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69  ..unsigned int i
11cd0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
11ce0 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28  get_compress_id(
11cf0 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45  session);..LAPPE
11d00 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11d10 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73  bjPtr, "compress
11d20 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31  ion_id", id == 1
11d30 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e   ? "zlib" : "non
11d40 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  e", -1);.    }..
11d50 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69      /* Compressi
11d60 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  on info */.    i
11d70 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
11d80 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53  {.#ifdef HAVE_SS
11d90 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63  L_COMPRESSION..c
11da0 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44  onst COMP_METHOD
11db0 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09   *comp, *expn;..
11dc0 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63  comp = SSL_get_c
11dd0 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69  urrent_compressi
11de0 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d  on(ssl);..expn =
11df0 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
11e00 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b  _expansion(ssl);
11e10 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ...LAPPEND_STR(i
11e20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11e30 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f  compression", co
11e40 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  mp ? SSL_COMP_ge
11e50 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22  t_name(comp) : "
11e60 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
11e70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11e80 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
11e90 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c  ion", expn ? SSL
11ea0 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65  _COMP_get_name(e
11eb0 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d  xpn) : "none", -
11ec0 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45  1);.#else..LAPPE
11ed0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11ee0 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73  bjPtr, "compress
11ef0 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
11f00 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11f10 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11f20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f  "expansion", "no
11f30 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  ne", -1);.#endif
11f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
11f50 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20  erver info */.  
11f60 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d    {..long mode =
11f70 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73   SSL_CTX_get_ses
11f80 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
11f90 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
11fa0 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66  .char *msg;...if
11fb0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
11fc0 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09  S_CACHE_OFF) {..
11fd0 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b      msg = "off";
11fe0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
11ff0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
12000 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20  HE_CLIENT) {..  
12010 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22    msg = "client"
12020 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12030 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12040 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20  CHE_SERVER) {.. 
12050 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72     msg = "server
12060 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12070 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12080 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20  ACHE_BOTH) {..  
12090 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a    msg = "both";.
120a0 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d  .} else {..    m
120b0 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a  sg = "unknown";.
120c0 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  .}..LAPPEND_STR(
120d0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
120e0 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  "session_cache_m
120f0 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a  ode", msg, -1);.
12100 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41      }..    /* CA
12110 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20   List */.    /* 
12120 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c  IF not a server,
12130 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74   same as SSL_get
12140 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20  0_peer_CA_list. 
12150 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61  If server same a
12160 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c  s SSL_CTX_get_cl
12170 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a  ient_CA_list */.
12180 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63      listPtr = Tc
12190 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
121a0 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b  NULL);.    STACK
121b0 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a  _OF(X509_NAME) *
121c0 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20  ca_list;.    if 
121d0 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f  ((ca_list = SSL_
121e0 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  get_client_CA_li
121f0 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c  st(ssl)) != NULL
12200 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72  ) {..char buffer
12210 5b 42 55 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20  [BUFSIZ];...for 
12220 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
12230 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d  sk_X509_NAME_num
12240 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20  (ca_list); i++) 
12250 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  {..    X509_NAME
12260 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39   *name = sk_X509
12270 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c  _NAME_value(ca_l
12280 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66  ist, i);..    if
12290 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39   (name) {...X509
122a0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61  _NAME_oneline(na
122b0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  me, buffer, BUFS
122c0 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  IZ);...Tcl_ListO
122d0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
122e0 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
122f0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12300 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a  j(buffer, -1));.
12310 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
12320 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
12330 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12340 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74  "caList", listPt
12350 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  r);.    LAPPEND_
12360 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12370 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74  tr, "caListCount
12380 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f  ", sk_X509_NAME_
12390 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a  num(ca_list));..
123a0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
123b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
123c0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
123d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
123e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
123f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12420 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
12430 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
12440 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
12450 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
12460 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
12470 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
12480 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
12490 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
124a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124d0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
124e0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
124f0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
12500 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
12510 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
12520 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
12530 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
12540 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
12550 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
12560 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
12570 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
12580 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
12590 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
125a0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
125b0 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b     Tcl_Size cmd;
125c0 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a  .    int isStr;.
125d0 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
125e0 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69  16384];.    (voi
125f0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
12600 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
12610 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
12620 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
12630 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12640 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
12650 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
12660 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
12670 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
12680 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
12690 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
126a0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
126b0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
126c0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
126d0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
126e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
126f0 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
12700 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
12710 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
12720 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
12730 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
12740 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
12750 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
12760 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
12770 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
12780 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
12790 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
127a0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
127b0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
127c0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63  **listv;..    Tc
127d0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20  l_Size listc;.. 
127e0 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20     int i;...    
127f0 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
12800 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
12810 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
12820 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
12830 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
12840 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
12850 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
12860 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
12870 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
12880 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23  l=0,days=365;..#
12890 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
128a0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
128b0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
128c0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
128d0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
128e0 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
128f0 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
12900 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
12910 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
12920 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
12930 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
12940 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12950 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
12960 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
12970 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
12980 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12990 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
129a0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
129b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
129c0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
129d0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
129e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
129f0 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
12a00 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
12a10 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
12a20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
12a30 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
12a40 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
12a50 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
12a60 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
12a70 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
12a80 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
12a90 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
12aa0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
12ab0 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
12ac0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
12ad0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26  terp, objv[5], &
12ae0 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
12af0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
12b00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12b10 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
12b20 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
12b30 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
12b40 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
12b50 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
12b60 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
12b70 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
12b80 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
12b90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12ba0 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
12bb0 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
12bc0 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
12bd0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
12be0 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
12bf0 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
12c00 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
12c10 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12c20 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
12c30 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
12c40 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
12c50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
12c60 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
12c70 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
12c80 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
12c90 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12ca0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
12cb0 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
12cc0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
12cd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
12ce0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
12cf0 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
12d00 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
12d10 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
12d20 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
12d30 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
12d40 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
12d50 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
12d60 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
12d70 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
12d80 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
12d90 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
12da0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
12db0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
12dc0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
12dd0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
12de0 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
12df0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12e00 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12e10 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12e20 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
12e30 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
12e40 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
12e50 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12e60 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
12e70 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
12e80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12e90 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12ea0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
12eb0 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
12ec0 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
12ed0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
12ee0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
12ef0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
12f00 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12f10 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
12f20 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
12f30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12f40 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
12f50 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
12f60 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
12f70 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
12f80 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
12f90 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
12fa0 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
12fb0 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
12fc0 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
12fd0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
12fe0 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
12ff0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
13000 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
13010 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
13020 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
13030 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
13040 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
13050 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
13060 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
13070 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
13080 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
13090 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
130a0 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
130b0 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
130c0 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
130d0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
130e0 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
130f0 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
13100 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
13110 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
13120 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
13130 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
13140 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
13150 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
13160 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
13170 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
13180 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
13190 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
131a0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
131b0 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
131c0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
131d0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
131e0 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
131f0 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
13200 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
13210 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
13220 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
13230 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
13240 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
13250 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
13260 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
13270 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
13280 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
13290 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
132a0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
132b0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
132c0 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
132d0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
132e0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
132f0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
13300 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
13310 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
13320 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
13330 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
13340 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
13350 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
13360 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
13370 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
13380 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
13390 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
133a0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
133b0 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
133c0 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
133d0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
133e0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
133f0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
13400 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
13410 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
13420 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
13430 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
13440 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
13450 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
13460 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
13470 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
13480 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
13490 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
134a0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
134b0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
134c0 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
134d0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
134e0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
134f0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
13500 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13510 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13520 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
13530 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
13540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13550 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ROR;...}....X509
13560 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
13570 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
13580 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
13590 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
135a0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
135b0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
135c0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
135d0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
135e0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
135f0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
13600 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
13610 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
13620 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
13630 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
13640 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
13650 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
13660 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
13670 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
13680 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
13690 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
136a0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
136b0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
136c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
136d0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
136e0 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
136f0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13700 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13710 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
13720 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
13730 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
13740 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
13750 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13760 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13770 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
13780 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
13790 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
137a0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
137b0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
137c0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
137d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
137e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
137f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
13800 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
13810 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
13820 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
13830 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
13840 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
13850 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
13860 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
13870 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
13880 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
13890 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
138a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
138b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
138c0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
138d0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
138e0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
138f0 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
13900 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
13910 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
13920 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
13930 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
13940 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
13950 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
13960 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
13970 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
13980 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
13990 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
139a0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
139b0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
139c0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
139d0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
139e0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
139f0 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
13a00 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
13a10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13a20 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
13a30 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
13a40 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
13a50 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
13a60 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
13a70 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
13a80 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
13a90 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
13aa0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
13ab0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
13ac0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
13ad0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
13ae0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
13af0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
13b00 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
13b10 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
13b20 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
13b30 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
13b40 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
13b50 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
13b60 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
13b70 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
13b80 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
13b90 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
13ba0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
13bb0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
13bc0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
13bd0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13be0 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
13bf0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
13c00 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
13c10 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
13c20 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
13c30 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
13c40 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
13c50 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13c60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  TCL_OK;.}.../***
13c70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13c80 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
13c90 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
13ca0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13cb0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13d00 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
13d10 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
13d20 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
13d30 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
13d40 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
13d50 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
13d60 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
13d70 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
13d80 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
13d90 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
13da0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
13db0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
13dc0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
13e10 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f  id.Tls_Free(tls_
13e20 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b  free_type *block
13e30 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
13e40 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
13e50 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
13e60 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13e70 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
13e80 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
13e90 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
13ea0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
13eb0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ef0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
13f00 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
13f10 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
13f20 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
13f30 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
13f40 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
13f50 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
13f60 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
13f70 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
13f80 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
13f90 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
13fa0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
13fb0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
13fc0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
13fd0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
13fe0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
13ff0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
14000 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14010 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
14020 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14060 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
14070 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
14080 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
14090 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
140a0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
140b0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
140c0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
140d0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
140e0 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
140f0 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
14100 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
14110 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
14120 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
14130 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
14140 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
14150 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
14160 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
14170 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14180 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
14190 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
141a0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
141b0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
141c0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
141d0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
141e0 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
141f0 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
14200 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
14210 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
14220 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
14230 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
14240 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
14250 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
14260 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
14270 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14280 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
14290 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
142a0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
142b0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
142c0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
142d0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
142e0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
142f0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
14300 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
14310 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
14320 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
14330 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14340 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
14350 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
14360 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
14370 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
14380 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
14390 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
143a0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
143b0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
143c0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
143d0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
143e0 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
143f0 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
14400 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14410 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
14420 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
14430 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
14440 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
14450 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
14460 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
14470 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
14480 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144d0 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66  . *. * Build Inf
144e0 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a  o Command --. *.
144f0 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e   *.Create comman
14500 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c  d to return buil
14510 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61  d info for packa
14520 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ge.. *. * Result
14530 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
14540 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20   Tcl result. *. 
14550 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14560 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64   *.Created build
14570 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20  -info command.. 
14580 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
145d0 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46  #ifndef STRINGIF
145e0 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  Y.#  define STRI
145f0 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49  NGIFY(x) STRINGI
14600 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65  FY1(x).#  define
14610 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23   STRINGIFY1(x) #
14620 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75  x.#endif..int.Bu
14630 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54  ildInfoCommand(T
14640 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72  cl_Interp* inter
14650 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64  p) {.    Tcl_Cmd
14660 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
14670 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if (Tcl_GetComma
14680 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22  ndInfo(interp, "
14690 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66  ::tcl::build-inf
146a0 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54  o", &info)) {..T
146b0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
146c0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
146d0 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c  ls::build-info",
146e0 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28   info.objProc, (
146f0 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41  void *)(...PACKA
14700 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53  GE_VERSION "+" S
14710 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52  TRINGIFY(TLS_VER
14720 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64  SION_UUID).#if d
14730 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
14740 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) && defined(__c
14750 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09  lang_major__)...
14760 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53  .    ".clang-" S
14770 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
14780 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f  _major__).#if __
14790 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20  clang_minor__ < 
147a0 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65  10....    "0".#e
147b0 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49  ndif....    STRI
147c0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69  NGIFY(__clang_mi
147d0 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  nor__).#endif.#i
147e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
147f0 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e  splus) && !defin
14800 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09  ed(__OBJC__)....
14810 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22      ".cplusplus"
14820 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
14830 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e  NDEBUG....    ".
14840 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69  debug".#endif.#i
14850 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  f !defined(__cla
14860 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  ng__) && !define
14870 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  d(__INTEL_COMPIL
14880 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ER) && defined(_
14890 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20  _GNUC__)....    
148a0 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".gcc-" STRINGIF
148b0 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20  Y(__GNUC__).#if 
148c0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c  __GNUC_MINOR__ <
148d0 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
148e0 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
148f0 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49  INGIFY(__GNUC_MI
14900 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  NOR__).#endif.#i
14910 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  fdef __INTEL_COM
14920 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69  PILER....    ".i
14930 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
14940 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
14950 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
14960 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09  CL_MEM_DEBUG....
14970 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a      ".memdebug".
14980 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
14990 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09  ed(_MSC_VER)....
149a0 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52      ".msvc-" STR
149b0 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29  INGIFY(_MSC_VER)
149c0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55  .#endif.#ifdef U
149d0 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20  SE_NMAKE....    
149e0 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a  ".nmake".#endif.
149f0 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f  #ifndef TCL_CFG_
14a00 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20  OPTIMIZED....   
14a10 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a   ".no-optimize".
14a20 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
14a30 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e  OBJC__....    ".
14a40 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66  objective-c".#if
14a50 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
14a60 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c  plus)....    "pl
14a70 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23  usplus".#endif.#
14a80 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
14a90 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09  _CFG_PROFILED...
14aa0 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a  .    ".profile".
14ab0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55  #endif.#ifdef PU
14ac0 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75  RIFY....    ".pu
14ad0 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66  rify".#endif.#if
14ae0 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44  def STATIC_BUILD
14af0 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63  ....    ".static
14b00 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55  ".#endif...), NU
14b10 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  LL);.    }.    r
14b20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
14b30 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
14b80 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
14b90 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
14ba0 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
14bb0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
14bc0 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
14bd0 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68  *.by Tcl when th
14be0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
14bf0 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
14c00 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
14c10 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c   * Results:  Ssl
14c20 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20   configured and 
14c30 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64  loaded. *. * Sid
14c40 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63  e effects:. *. c
14c50 72 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f  reate the ssl co
14c60 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a  mmand, initializ
14c70 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a  e ssl context. *
14c80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cc0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20  ------. */..#if 
14cd0 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
14ce0 4e 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49  N > 8.#define MI
14cf0 4e 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a  N_VERSION "9.0".
14d00 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49  #else.#define MI
14d10 4e 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a  N_VERSION "8.5".
14d20 23 65 6e 64 69 66 0a 0a 73 74 61 74 69 63 20 63  #endif..static c
14d30 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
14d40 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
14d50 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
14d60 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
14d70 7d 3b 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e  };..DLLEXPORT in
14d80 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49  t Tls_Init(Tcl_I
14d90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
14da0 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
14db0 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66  alled");..#ifdef
14dc0 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20   USE_TCL_STUBS. 
14dd0 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53     if (Tcl_InitS
14de0 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e  tubs(interp, MIN
14df0 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20  _VERSION, 0) == 
14e00 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
14e10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14e20 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28  .#endif.    if (
14e30 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69  Tcl_PkgRequire(i
14e40 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49  nterp, "Tcl", MI
14e50 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d  N_VERSION, 0) ==
14e60 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
14e70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14e80 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69  }..    if (TlsLi
14e90 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f  bInit(0) != TCL_
14ea0 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  OK) {..Tcl_Appen
14eb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14ec0 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69  "could not initi
14ed0 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72  alize SSL librar
14ee0 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  y", (char *) NUL
14ef0 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
14f00 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
14f10 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
14f20 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
14f30 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f  ::tls::connectio
14f40 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
14f50 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
14f60 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
14f70 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
14f80 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
14f90 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
14fa0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
14fb0 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48  s::handshake", H
14fc0 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20  andshakeObjCmd, 
14fd0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
14fe0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
14ff0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15000 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15010 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15020 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22   "::tls::import"
15030 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  , ImportObjCmd, 
15040 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15050 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15060 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15070 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15080 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15090 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20   "::tls::misc", 
150a0 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MiscObjCmd, (Cli
150b0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
150c0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
150d0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
150e0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
150f0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
15100 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20  tls::unimport", 
15110 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  UnimportObjCmd, 
15120 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15130 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15140 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15150 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15160 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15170 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b   "::tls::unstack
15180 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
15190 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
151a0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
151b0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
151c0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
151d0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
151e0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74  rp, "::tls::stat
151f0 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d  us", StatusObjCm
15200 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15210 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
15220 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15230 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49 6e 66  );..    BuildInf
15240 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 29  oCommand(interp)
15250 3b 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74  ;.    Tls_Digest
15260 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29  Commands(interp)
15270 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63 72 79 70  ;.    Tls_Encryp
15280 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70  tCommands(interp
15290 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43  );.    Tls_InfoC
152a0 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b  ommands(interp);
152b0 0a 20 20 20 20 54 6c 73 5f 4b 44 46 43 6f 6d 6d  .    Tls_KDFComm
152c0 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20  ands(interp);.  
152d0 20 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e    Tls_RandComman
152e0 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20  ds(interp);..   
152f0 20 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54   if (interp && T
15300 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
15310 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
15320 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
15330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15340 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
15350 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn Tcl_PkgProvi
15360 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41  de(interp, PACKA
15370 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45  GE_NAME, PACKAGE
15380 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a  _VERSION);.}../*
15390 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
153a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
153d0 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
153e0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
153f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15410 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e  -------*. *.Stan
15420 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72  dard procedure r
15430 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64  equired by 'load
15440 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  '.. *.Initialize
15450 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  s this extension
15460 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65   for a safe inte
15470 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d  rpreter.. *.----
15480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
154b0 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
154c0 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73  :. *..As of 'Tls
154d0 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73  _Init'. *. *.Res
154e0 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64  ult:. *..A stand
154f0 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f  ard Tcl error co
15500 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15540 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
15550 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28  nt Tls_SafeInit(
15560 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15570 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  rp) {.    dprint
15580 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
15590 20 72 65 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74   return Tls_Init
155a0 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a  (interp);.}../*.
155b0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
155f0 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a  TlsLibInit --. *
15600 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15630 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  ----*. *.Initial
15640 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
15650 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
15660 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  ation. *.-------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
156a0 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20  .Side effects:. 
156b0 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53  *..initializes S
156c0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a  SL library. *. *
156d0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e  .Result:. *..non
156e0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
156f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
15720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
15730 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69  sLibInit(int uni
15740 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20  nitialize) {.   
15750 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74   static int init
15760 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20  ialized = 0;.   
15770 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43   int status = TC
15780 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  L_OK;.#if define
15790 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
157a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
157b0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73  L_THREADS).    s
157c0 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  ize_t num_locks;
157d0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
157e0 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b  (uninitialize) {
157f0 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a  ..if (!initializ
15800 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  ed) {..    dprin
15810 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
15820 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
15830 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
15840 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72  lized");...    r
15850 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d  eturn TCL_OK;..}
15860 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b 65  ...dprintf("Aske
15870 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a  d to uninitializ
15880 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e");..#if define
15890 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
158a0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
158b0 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f  L_THREADS)..Tcl_
158c0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
158d0 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73  mx);...if (locks
158e0 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c 6f  ) {..    free(lo
158f0 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73  cks);..    locks
15900 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f   = NULL;..    lo
15910 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d  cksCount = 0;..}
15920 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c  .#endif..initial
15930 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64  ized = 0;..#if d
15940 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
15950 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
15960 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
15970 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b  .Tcl_MutexUnlock
15980 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64  (&init_mx);.#end
15990 69 66 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  if...return TCL_
159a0 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OK;.    }..    i
159b0 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20  f (initialized) 
159c0 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c  {..dprintf("Call
159d0 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61  ed, but using ca
159e0 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72  ched value");..r
159f0 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 20 20  eturn status;.  
15a00 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
15a10 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
15a20 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15a30 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15a40 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15a50 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c  ).    Tcl_MutexL
15a60 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
15a70 65 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61  endif.    initia
15a80 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20  lized = 1;..#if 
15a90 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15aa0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15ab0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15ac0 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d  .    num_locks =
15ad0 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75   1;.    locksCou
15ae0 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c  nt = (int) num_l
15af0 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20  ocks;.    locks 
15b00 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  = malloc(sizeof(
15b10 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f  *locks) * num_lo
15b20 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  cks);.    memset
15b30 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f  (locks, 0, sizeo
15b40 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f  f(*locks) * num_
15b50 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a  locks);.#endif..
15b60 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a      /* Initializ
15b70 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f  e BOTH libcrypto
15b80 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a   and libssl. */.
15b90 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74      OPENSSL_init
15ba0 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49  _ssl(OPENSSL_INI
15bb0 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e  T_LOAD_SSL_STRIN
15bc0 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  GS | OPENSSL_INI
15bd0 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54  T_LOAD_CRYPTO_ST
15be0 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c  RINGS..| OPENSSL
15bf0 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49  _INIT_ADD_ALL_CI
15c00 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  PHERS | OPENSSL_
15c10 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47  INIT_ADD_ALL_DIG
15c20 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  ESTS, NULL);..  
15c30 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55    BIO_new_tcl(NU
15c40 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 64 65 66  LL, 0);..#if def
15c50 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
15c60 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
15c70 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
15c80 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63    Tcl_MutexUnloc
15c90 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
15ca0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
15cb0 73 74 61 74 75 73 3b 0a 7d 0a                    status;.}.