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 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23  nssl/crypto.h>.#
03b0: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
03c0: 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  /ssl.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e   <openssl/evp.h>
03e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
03f0: 73 6c 2f 6f 62 6a 65 63 74 73 2e 68 3e 0a 23 69  sl/objects.h>.#i
0400: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0410: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
0420: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
0430: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
0440: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
0450: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
0460: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
0470: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0480: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0490: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
04a0: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
04b0: 64 69 66 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77  dif.../*. * Forw
04c0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
04d0: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32  . */..#define F2
04e0: 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28  N(key, dsp) \..(
04f0: 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20  ((key) == NULL) 
0500: 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20  ? (char *) NULL 
0510: 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c  : \...Tcl_Transl
0520: 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
0530: 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29  rp, (key), (dsp)
0540: 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43  ))..static SSL_C
0550: 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61  TX *CTX_Init(Sta
0560: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e  te *statePtr, in
0570: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20  t isServer, int 
0580: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79  proto, char *key
0590: 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 66 69  ,...char *certfi
05a0: 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
05b0: 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73  r *key_asn1, uns
05c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
05d0: 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79  _asn1,...int key
05e0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63  _asn1_len, int c
05f0: 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68  ert_asn1_len, ch
0600: 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72  ar *CApath, char
0610: 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72   *CAfile,...char
0620: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
0630: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69  *ciphersuites, i
0640: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a  nt level, char *
0650: 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74  DHparams);..stat
0660: 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69  ic int.TlsLibIni
0670: 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69  t(int uninitiali
0680: 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c  ze);..#define TL
0690: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78  S_PROTO_SSL2..0x
06a0: 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  01.#define TLS_P
06b0: 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a  ROTO_SSL3..0x02.
06c0: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
06d0: 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65  O_TLS1..0x04.#de
06e0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
06f0: 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69  LS1_1.0x08.#defi
0700: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
0710: 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65  1_2.0x10.#define
0720: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
0730: 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45  3.0x20.#define E
0740: 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73  NABLED(flag, mas
0750: 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d  k).(((flag) & (m
0760: 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29  ask)) == (mask))
0770: 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59  ..#define SSLKEY
0780: 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59  LOGFILE.."SSLKEY
0790: 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20  LOGFILE"../*. * 
07a0: 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20  Thread-Safe TLS 
07b0: 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66  Code. */..#ifdef
07c0: 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65   TCL_THREADS.#de
07d0: 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52  fine OPENSSL_THR
07e0: 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63  EAD_DEFINES.#inc
07f0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70  lude <openssl/op
0800: 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69  ensslconf.h>..#i
0810: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52  fdef OPENSSL_THR
0820: 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  EADS.#include <o
0830: 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e  penssl/crypto.h>
0840: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
0850: 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a  sl/ssl.h>../*. *
0860: 20 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74   Threaded operat
0870: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63  ion requires loc
0880: 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20  king callbacks. 
0890: 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72  * Based from /cr
08a0: 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20  ypto/cryptlib.c 
08b0: 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e  of OpenSSL and N
08c0: 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73  SOpenSSL.. */..s
08d0: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20  tatic Tcl_Mutex 
08e0: 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73  *locks = NULL;.s
08f0: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43  tatic int locksC
0900: 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  ount = 0;.static
0910: 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f   Tcl_Mutex init_
0920: 6d 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50  mx;.#endif /* OP
0930: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f  ENSSL_THREADS */
0940: 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54  .#endif /* TCL_T
0950: 48 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a  HREADS */..../**
0960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0970: 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73  **/./* Callbacks
0980: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
0990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09a0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
09f0: 2a 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20  * Eval Callback 
0a00: 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a  Command --. *. *
0a10: 09 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63  .Eval callback c
0a20: 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68  ommand and catch
0a30: 20 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20   any errors. *. 
0a40: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20  * Results:. *.0 
0a50: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  = Command return
0a60: 65 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20  ed fail or eval 
0a70: 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52  returned TCL_ERR
0a80: 4f 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e  OR. *.1 = Comman
0a90: 64 20 72 65 74 75 72 6e 65 64 20 73 75 63 63 65  d returned succe
0aa0: 73 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72  ss or eval retur
0ab0: 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a  ned TCL_OK. *. *
0ac0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0ad0: 2a 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c  *.Evaluates call
0ae0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a  back command. *.
0af0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
0b40: 20 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63   int.EvalCallbac
0b50: 6b 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  k(Tcl_Interp *in
0b60: 74 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61  terp, State *sta
0b70: 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a  tePtr, Tcl_Obj *
0b80: 63 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e  cmdPtr) {.    in
0b90: 74 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a  t code, ok = 0;.
0ba0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
0bb0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c  lled");..    Tcl
0bc0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0bd0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
0be0: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0bf0: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
0c00: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
0c10: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77   Eval callback w
0c20: 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20  ith success for 
0c30: 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  ok or return val
0c40: 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65  ue 1, fail for e
0c50: 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76  rror or return v
0c60: 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63  alue 0 */.    Tc
0c70: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
0c80: 74 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20  terp);.    code 
0c90: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
0ca0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
0cb0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
0cc0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 45  ;.    dprintf("E
0cd0: 76 61 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22  valCallback: %d"
0ce0: 2c 20 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20  , code);.    if 
0cf0: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29  (code == TCL_OK)
0d00: 20 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73   {../* Check res
0d10: 75 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76  ult for return v
0d20: 61 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a  alue */..Tcl_Obj
0d30: 20 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   *result = Tcl_G
0d40: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
0d50: 72 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74  rp);..if (result
0d60: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f   == NULL || Tcl_
0d70: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
0d80: 74 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f  terp, result, &o
0d90: 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  k) != TCL_OK) {.
0da0: 09 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a  .    ok = 1;..}.
0db0: 09 64 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74  .dprintf("Result
0dc0: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20  : %d", ok);.    
0dd0: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72  } else {../* Err
0de0: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20  or - reject the 
0df0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
0e00: 64 70 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63  dprintf("Tcl_Bac
0e10: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a  kgroundError");.
0e20: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
0e30: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
0e40: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
0e50: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
0e60: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
0e70: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
0e80: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
0e90: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64  tion(interp, cod
0ea0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
0eb0: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
0ec0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0ed0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63  tatePtr);.    Tc
0ee0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
0ef0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
0f00: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d      return ok;.}
0f10: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0f60: 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d  * InfoCallback -
0f70: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
0f80: 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   SSL connection 
0f90: 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65  process. *. * Re
0fa0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
0fb0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0fc0: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
0fd0: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
0fe0: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
1030: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43  tatic void.InfoC
1040: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
1050: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72  L *ssl, int wher
1060: 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20  e, int ret) {.  
1070: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
1080: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
1090: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
10a0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
10b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10c0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
10d0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
10e0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68   *cmdPtr;.    ch
10f0: 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20  ar *major; char 
1100: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72  *minor;..    dpr
1110: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
1120: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
1130: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
1140: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
1150: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20  return;..    if 
1160: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1170: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29  HANDSHAKE_START)
1180: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1190: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
11a0: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d  = "start";.    }
11b0: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
11c0: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
11d0: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f  KE_DONE) {..majo
11e0: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
11f0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22  ..minor = "done"
1200: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1210: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1220: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72  CB_ALERT)..major
1230: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73   = "alert";..els
1240: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1250: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61  L_ST_CONNECT).ma
1260: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b  jor = "connect";
1270: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1280: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54   & SSL_ST_ACCEPT
1290: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65  )..major = "acce
12a0: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  pt";..else.....m
12b0: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  ajor = "unknown"
12c0: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20  ;...if (where & 
12d0: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69  SSL_CB_READ)..mi
12e0: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65  nor = "read";..e
12f0: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1300: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d  SSL_CB_WRITE)..m
1310: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a  inor = "write";.
1320: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1330: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09  & SSL_CB_LOOP)..
1340: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a  minor = "loop";.
1350: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1360: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09  & SSL_CB_EXIT)..
1370: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a  minor = "exit";.
1380: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20  .else.....minor 
1390: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
13a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
13b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
13c0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
13d0: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d   major, minor, m
13e0: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65  essage, and type
13f0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
1400: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
1410: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
1420: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
1430: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1440: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1450: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
1460: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22  StringObj("info"
1470: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
14a0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
14b0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
14c0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
14d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
14e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1500: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1510: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1520: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a  bj(major, -1));.
1530: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1540: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1550: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
1560: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69  _NewStringObj(mi
1570: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  nor, -1));..    
1580: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1590: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c  CB_ALERT) {..Tcl
15a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
15b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
15c0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
15d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
15e0: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e  alert_desc_strin
15f0: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
1600: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
1610: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1620: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1630: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1640: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70  bj(SSL_alert_typ
1650: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65  e_string_long(re
1660: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20  t), -1));.    } 
1670: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  else {..Tcl_List
1680: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1690: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
16a0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
16b0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65  ingObj(SSL_state
16c0: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
16d0: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
16e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
16f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1700: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1710: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29  Obj("info", -1))
1720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1730: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
1740: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
1750: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
1760: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
1770: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
1780: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
1790: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
17a0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
17b0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 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 0a 20 2a  -------------. *
1800: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  . * MessageCallb
1810: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
1820: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63  itors SSL protoc
1830: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20  ol messages. *. 
1840: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
1850: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
1860: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
1870: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
1880: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
18d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
18e0: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
18f0: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73  static void.Mess
1900: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20  ageCallback(int 
1910: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72  write_p, int ver
1920: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e  sion, int conten
1930: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f  t_type, const vo
1940: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  id *buf, size_t 
1950: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76  len, SSL *ssl, v
1960: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
1970: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
1980: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
1990: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
19a0: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
19b0: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
19c0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
19d0: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74     char *ver, *t
19e0: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69  ype;.    BIO *bi
19f0: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  o;.    char buff
1a00: 65 72 5b 33 30 30 30 30 5d 3b 0a 20 20 20 20 62  er[30000];.    b
1a10: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20  uffer[0] = 0;.. 
1a20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
1a30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
1a40: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
1a50: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
1a60: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
1a70: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f     switch(versio
1a80: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  n) {.#if OPENSSL
1a90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1aa0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
1ab0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1ac0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
1ad0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
1ae0: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45      case SSL2_VE
1af0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1b00: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv2";..break;.#
1b10: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
1b20: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
1b30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1b40: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73  NO_SSL3).    cas
1b50: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL3_VERSION:.
1b60: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a  .ver = "SSLv3";.
1b70: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1b80: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52     case TLS1_VER
1b90: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1ba0: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  Sv1";..break;.  
1bb0: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45    case TLS1_1_VE
1bc0: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1bd0: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.1";..break;
1be0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32  .    case TLS1_2
1bf0: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1c00: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65   "TLSv1.2";..bre
1c10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1c20: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_3_VERSION:..ve
1c30: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09  r = "TLSv1.3";..
1c40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c50: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22  0:..ver = "none"
1c60: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;..break;.    de
1c70: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75  fault:..ver = "u
1c80: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b  nknown";..break;
1c90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
1ca0: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65  ch (content_type
1cb0: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ) {.    case SSL
1cc0: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79  3_RT_HEADER:..ty
1cd0: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09  pe = "Header";..
1ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1cf0: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f  SSL3_RT_INNER_CO
1d00: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70  NTENT_TYPE:..typ
1d10: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65  e = "Inner Conte
1d20: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b  nt Type";..break
1d30: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d40: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52  RT_CHANGE_CIPHER
1d50: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22  _SPEC:..type = "
1d60: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a  Change Cipher";.
1d70: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d80: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a   SSL3_RT_ALERT:.
1d90: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b  .type = "Alert";
1da0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1db0: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1dc0: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1dd0: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b  ndshake";..break
1de0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1df0: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44  RT_APPLICATION_D
1e00: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70  ATA:..type = "Ap
1e10: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b  p Data";..break;
1e20: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
1e30: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
1e40: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61  30000000L.    ca
1e50: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52  se DTLS1_RT_HEAR
1e60: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22  TBEAT:..type = "
1e70: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65  Heartbeat";..bre
1e80: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
1e90: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20  efault:..type = 
1ea0: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1eb0: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63  ..    /* Needs c
1ec0: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69  ompile time opti
1ed0: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74  on "enable-ssl-t
1ee0: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66  race". */.    if
1ef0: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77   ((bio = BIO_new
1f00: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21  (BIO_s_mem())) !
1f10: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e  = NULL) {..int n
1f20: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69  ;..SSL_trace(wri
1f30: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63  te_p, version, c
1f40: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66  ontent_type, buf
1f50: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69  , len, ssl, (voi
1f60: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42  d *)bio);..n = B
1f70: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
1f80: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  fer, BIO_pending
1f90: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20  (bio) < 15000 ? 
1fa0: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1fb0: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20   : 14999);..n = 
1fc0: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1fd0: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1fe0: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1ff0: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
2000: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
2010: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
2020: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
2030: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69  n, chan, directi
2040: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70  on, version, typ
2050: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61  e, and message a
2060: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2070: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2080: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2090: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
20a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
20b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
20c0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
20d0: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65  ringObj("message
20e0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
20f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2100: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2110: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
2120: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2130: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2140: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2180: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2190: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53  Obj(write_p ? "S
21a0: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64  ent" : "Received
21b0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
21c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
21d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
21e0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21f0: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29  ingObj(ver, -1))
2200: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2210: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2220: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2230: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2240: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  type, -1));.    
2250: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2260: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2270: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2280: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
2290: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
22a0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
22b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
22c0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
22d0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
22e0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
22f0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2300: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2310: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2320: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
2330: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66  ----. *. * Verif
2380: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  yCallback --. *.
2390: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
23a0: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
23b0: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  dation process. 
23c0: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  Used to control 
23d0: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20  the. *.behavior 
23e0: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52  when the SSL_VER
23f0: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73  IFY_PEER flag is
2400: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61   set. This is ca
2410: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72  lled. *.whenever
2420: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69   a certificate i
2430: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64  s inspected or d
2440: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20  ecided invalid. 
2450: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61  Called for. *.ea
2460: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69  ch certificate i
2470: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e  n the cert chain
2480: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a  .. *. * Checks:.
2490: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61   *.The certifica
24a0: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63  te chain is chec
24b0: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  ked starting wit
24c0: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65  h the deepest ne
24d0: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20  sting level. *. 
24e0: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65   (the root CA ce
24f0: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77  rtificate) and w
2500: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20  orked upward to 
2510: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69  the peer's certi
2520: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73  ficate.. *.All s
2530: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61  ignatures are va
2540: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d  lid, current tim
2550: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73  e is within firs
2560: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64  t and last valid
2570: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65  ity time.. *.Che
2580: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74  ck that the cert
2590: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65  ificate is issue
25a0: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20  d by the issuer 
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75  certificate issu
25c0: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  er.. *.Check the
25d0: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
25e0: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74  us for each cert
25f0: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63  ificate.. *.Chec
2600: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f  k the validity o
2610: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20  f the given CRL 
2620: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76  and the cert rev
2630: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a  ocation status..
2640: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c   *.Check the pol
2650: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65  icies of all the
2660: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a   certificates. *
2670: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76  . * Args. *.prev
2680: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74  erify_ok indicat
2690: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63  es whether the c
26a0: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66  ertificate verif
26b0: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28  ication passed (
26c0: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a  1) or not (0). *
26d0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
26e0: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64  A callback bound
26f0: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d   to the socket m
2700: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ay return one of
2710: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74  :. *.    0...- t
2720: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
2730: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64  s deemed invalid
2740: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74  , send verificat
2750: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c  ion. *....  fail
2760: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65  ure alert to pee
2770: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65  r, and terminate
2780: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2790: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72     1...- the cer
27a0: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
27b0: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e  ed valid, contin
27c0: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  ue with handshak
27d0: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20  e.. *.    empty 
27e0: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e  string.- no chan
27f0: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74  ge to certificat
2800: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a  e validation. *.
2810: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
2820: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
2830: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2840: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
2850: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
2860: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
2870: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2880: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2890: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
28f0: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
2900: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
2910: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
2920: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
2930: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73  tr;.    SSL   *s
2940: 73 6c 20 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f  sl = (SSL*)X509_
2950: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78  STORE_CTX_get_ex
2960: 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67  _data(ctx, SSL_g
2970: 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f  et_ex_data_X509_
2980: 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29  STORE_CTX_idx())
2990: 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65 72  ;.    X509  *cer
29a0: 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  t..= X509_STORE_
29b0: 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  CTX_get_current_
29c0: 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53  cert(ctx);.    S
29d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d  tate *statePtr.=
29e0: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74   (State*)SSL_get
29f0: 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a  _app_data(ssl);.
2a00: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
2a10: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
2a20: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69  r->interp;.    i
2a30: 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30 39  nt depth..= X509
2a40: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
2a50: 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b  rror_depth(ctx);
2a60: 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20  .    int err..= 
2a70: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
2a80: 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a  et_error(ctx);..
2a90: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
2aa0: 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e  led");.    dprin
2ab0: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61  tf("VerifyCallba
2ac0: 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20  ck: %d", ok);.. 
2ad0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
2ae0: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
2af0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55  j*)NULL) {../* U
2b00: 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76  se ok value if v
2b10: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72  erification is r
2b20: 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28  equired */..if (
2b30: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
2b40: 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41   & SSL_VERIFY_FA
2b50: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
2b60: 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  RT) {..    retur
2b70: 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  n ok;..} else {.
2b80: 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09  .    return 1;..
2b90: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  }.    } else if 
2ba0: 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  (cert == NULL ||
2bb0: 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   ssl == NULL) {.
2bc0: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d  .return 0;.    }
2bd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
2be0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65  erifyCallback: e
2bf0: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a  val callback");.
2c00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
2c10: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
2c20: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65  ith fn, chan, de
2c30: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c  pth, cert info l
2c40: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64  ist, status, and
2c50: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20   error args */. 
2c60: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
2c70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
2c80: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
2c90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2ca0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2cb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2cc0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72  ewStringObj("ver
2cd0: 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ify", -1));.    
2ce0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2cf0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2d00: 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65   cmdPtr,..Tcl_Ne
2d10: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
2d20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
2d30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
2d40: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2d50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2d60: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2d70: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2d80: 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c  depth));.    Tcl
2d90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2da0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2db0: 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30  dPtr, Tls_NewX50
2dc0: 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72  9Obj(interp, cer
2dd0: 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  t));.    Tcl_Lis
2de0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2df0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2e00: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2e10: 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ok));.    Tcl_Li
2e20: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2e30: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2e40: 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r,..Tcl_NewStrin
2e50: 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39  gObj((char*)X509
2e60: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
2e70: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20  or_string(err), 
2e80: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72  -1));..    /* Pr
2e90: 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20  event I/O while 
2ea0: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70  callback is in p
2eb0: 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f  rogress */.    /
2ec0: 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  * statePtr->flag
2ed0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c  s |= TLS_TCL_CAL
2ee0: 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f  LBACK; */..    /
2ef0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
2f00: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
2f10: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2f20: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20  cmdPtr);.    ok 
2f30: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
2f40: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
2f50: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
2f60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
2f70: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72  mdPtr);..    dpr
2f80: 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c  intf("VerifyCall
2f90: 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65  back: command re
2fa0: 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b  sult = %d", ok);
2fb0: 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  ..    /* statePt
2fc0: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c  r->flags &= ~(TL
2fd0: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b  S_TCL_CALLBACK);
2fe0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f   */.    return o
2ff0: 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74  k;./* By default
3000: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61  , leave verifica
3010: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20  tion unchanged. 
3020: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  */.}.../*. *----
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3070: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20   *. * Tls_Error 
3080: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63  --. *. *.Calls c
3090: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72  allback with err
30a0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20  or message.. *. 
30b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
30c0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
30d0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
30e0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
30f0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
3100: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
3110: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
3120: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
3130: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
3190: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
31a0: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
31b0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
31c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
31d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
31e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
31f0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
3200: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3210: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3220: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3230: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3240: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3250: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3260: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
3270: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
3280: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3290: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
32a0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d 65  fn, chan, and me
32b0: 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20  ssage args */.  
32c0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
32d0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
32e0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
32f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3300: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3310: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3320: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3330: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3340: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3350: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3360: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3370: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3380: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
3390: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
33a0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
33b0: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
33c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
33d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
33e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
33f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3400: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3410: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
3420: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 6c  cl_GetString(Tcl
3430: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
3440: 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c 29  terp))) != NULL)
3450: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3470: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3490: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
34a0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20  else {..listPtr 
34b0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
34c0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c  (0, NULL);..whil
34d0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65  e ((err = ERR_ge
34e0: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29  t_error()) != 0)
34f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
3500: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3510: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
3520: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3530: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  bj(ERR_reason_er
3540: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
3550: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c   -1));..}..Tcl_L
3560: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3570: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3580: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20  tr, listPtr);.  
3590: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c    }..    /* Eval
35a0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
35b0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
35c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
35d0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
35e0: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
35f0: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
3600: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3610: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c  unt(cmdPtr);.}..
3620: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
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 0a 20 2a 0a 20 2a 20  ---------. *. * 
3670: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d  KeyLogCallback -
3680: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65  -. *. *.Write re
3690: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20  ceived key data 
36a0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a  to log file.. *.
36b0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
36c0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f  -. */.void KeyLo
3720: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  gCallback(const 
3730: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
3740: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20  char *line) {.  
3750: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65    char *str = ge
3760: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
3770: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66  LE);.    FILE *f
3780: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
3790: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
37a0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d  if (str) {..fd =
37b0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29   fopen(str, "a")
37c0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22  ;..fprintf(fd, "
37d0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63  %s\n",line);..fc
37e0: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
37f0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3840: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c   * Password Call
3850: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  back --. *. *.Ca
3860: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
3870: 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 66  word is needed f
3880: 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79  or a private key
3890: 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a   when loading. *
38a0: 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50 45  .or storing a PE
38b0: 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77 69  M certificate wi
38c0: 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45  th encryption. E
38d0: 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20 2a  vals callback. *
38e0: 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75  .script and retu
38f0: 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61  rns the result a
3900: 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 73  s the password s
3910: 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a  tring in buf.. *
3920: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
3930: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
3940: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
3950: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
3960: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
3970: 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f  turns:. *.Passwo
3980: 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  rd size in bytes
3990: 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72   or -1 for an er
39a0: 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ror.. *. *------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
39f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73  /.static int.Pas
3a00: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68  swordCallback(ch
3a10: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a  ar *buf, int siz
3a20: 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76  e, int rwflag, v
3a30: 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20  oid *udata) {.  
3a40: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
3a50: 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64  r.= (State *) ud
3a60: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  ata;.    Tcl_Int
3a70: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
3a80: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
3a90: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
3aa0: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
3ab0: 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  e;.    Tcl_Size 
3ac0: 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  len;..    dprint
3ad0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
3ae0: 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62    /* If no callb
3af0: 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74  ack, use default
3b00: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20   callback */.   
3b10: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
3b20: 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29  assword == NULL)
3b30: 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c   {..if (Tcl_Eval
3b40: 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  Ex(interp, "tls:
3b50: 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20  :password", -1, 
3b60: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3b70: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   == TCL_OK) {.. 
3b80: 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28     char *ret = (
3b90: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53  char *) Tcl_GetS
3ba0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c  tringFromObj(Tcl
3bb0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
3bc0: 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 20  terp), &len);.. 
3bd0: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54 63     if (len > (Tc
3be0: 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20  l_Size) size-1) 
3bf0: 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f 53  {...len = (Tcl_S
3c00: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20 20  ize) size-1;..  
3c10: 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70 79    }..    strncpy
3c20: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3c30: 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 62  _t) len);..    b
3c40: 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  uf[len] = '\0';.
3c50: 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74  .    return (int
3c60: 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b  ) len;..} else {
3c70: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  ..    return -1;
3c80: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
3c90: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
3ca0: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
3cb0: 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 69  , rwflag, and si
3cc0: 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  ze args */.    c
3cd0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
3ce0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
3cf0: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20  r->password);.  
3d00: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3d10: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3d20: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3d30: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73  ewStringObj("pas
3d40: 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20  sword", -1));.  
3d50: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3d60: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3d70: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3d80: 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29  ewIntObj(rwflag)
3d90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3da0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3db0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3dc0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69  Tcl_NewIntObj(si
3dd0: 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50  ze));..    Tcl_P
3de0: 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44  reserve((ClientD
3df0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
3e00: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3e10: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3e20: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  ePtr);..    /* E
3e30: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
3e40: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
3e50: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
3e60: 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d  Ptr);.    code =
3e70: 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
3e80: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3e90: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
3ea0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d  .    if (code !=
3eb0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28   TCL_OK) {.#if (
3ec0: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
3ed0: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
3ee0: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
3ef0: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
3f00: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
3f10: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
3f20: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
3f30: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
3f40: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
3f50: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
3f60: 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54  (cmdPtr);..    T
3f70: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3f80: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
3f90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75  );..    /* If su
3fa0: 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62  ccessful, pass b
3fb0: 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72  ack password str
3fc0: 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65  ing and truncate
3fd0: 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a   if too long */.
3fe0: 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20      if (code == 
3ff0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20  TCL_OK) {..char 
4000: 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20  *ret = (char *) 
4010: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
4020: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  mObj(Tcl_GetObjR
4030: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26  esult(interp), &
4040: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e  len);..if (len >
4050: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
4060: 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d  -1) {..    len =
4070: 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65   (Tcl_Size) size
4080: 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28  -1;..}..strncpy(
4090: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
40a0: 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65  t) len);..buf[le
40b0: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f  n] = '\0';..Tcl_
40c0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
40d0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72  ata) interp);..r
40e0: 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b  eturn (int) len;
40f0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52  .    }.    Tcl_R
4100: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
4110: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
4120: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a   return -1;.}...
4130: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
4180: 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20  ession Callback 
4190: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20  for Clients --. 
41a0: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e  *. *.Called when
41b0: 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69   a new session i
41c0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63  s added to the c
41d0: 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33  ache. In TLS 1.3
41e0: 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20  . *.this may be 
41f0: 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c  received multipl
4200: 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68  e times after th
4210: 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72  e handshake. For
4220: 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73  . *.earlier vers
4230: 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  ions, this will 
4240: 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69  be received duri
4250: 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65  ng the handshake
4260: 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65  .. *.This is the
4270: 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74   preferred way t
4280: 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d  o obtain a resum
4290: 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a  able session.. *
42a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
42b0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
42c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
42d0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
42e0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
42f0: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30  turn codes:. *.0
4300: 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73   = error where s
4310: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69  ession will be i
4320: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76  mmediately remov
4330: 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65  ed from the inte
4340: 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31  rnal cache.. *.1
4350: 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65   = success where
4360: 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73   app retains ses
4370: 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20  sion in session 
4380: 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20  cache, and must 
4390: 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  call SSL_SESSION
43a0: 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e  _free() when don
43b0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
4400: 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69  static int.Sessi
4410: 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a  onCallback(SSL *
4420: 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ssl, SSL_SESSION
4430: 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20   *session) {.   
4440: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
4450: 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67   = (State*)SSL_g
4460: 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c  et_app_data((SSL
4470: 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c   *)ssl);.    Tcl
4480: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
4490: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
44a0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
44b0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e  *cmdPtr;.    con
44c0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
44d0: 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f   *ticket;.    co
44e0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
44f0: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20  r *session_id;. 
4500: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a     size_t len2;.
4510: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
4520: 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69   ulen;..    dpri
4530: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
4540: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4550: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
4560: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
4570: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4580: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
4590: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
45a0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
45b0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
45c0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
45d0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
45e0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
45f0: 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 69   fn, chan, sessi
4600: 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 74  on id, session t
4610: 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 74  icket, and lifet
4620: 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ime args */.    
4630: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
4640: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
4650: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  tr->callback);. 
4660: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4670: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4680: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
4690: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65  NewStringObj("se
46a0: 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20  ssion", -1));.  
46b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
46c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
46d0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
46e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
46f0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
4700: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
4710: 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  lf), -1));..    
4720: 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f  /* Session id */
4730: 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20  .    session_id 
4740: 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
4750: 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75  t_id(session, &u
4760: 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  len);.    Tcl_Li
4770: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4780: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4790: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
47a0: 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69  rayObj(session_i
47b0: 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  d, (Tcl_Size) ul
47c0: 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  en));..    /* Se
47d0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a  ssion ticket */.
47e0: 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f      SSL_SESSION_
47f0: 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
4800: 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
4810: 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  en2);.    Tcl_Li
4820: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4830: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4840: 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  r, Tcl_NewByteAr
4850: 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28  rayObj(ticket, (
4860: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29  Tcl_Size) len2))
4870: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69  ;..    /* Lifeti
4880: 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73  me - number of s
4890: 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63  econds */.    Tc
48a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
48b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
48c0: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c  mdPtr,..Tcl_NewL
48d0: 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53  ongObj((long) SS
48e0: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
48f0: 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
4900: 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a  nt(session)));..
4910: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
4920: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
4930: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4940: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
4950: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
4960: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
4970: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
4980: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
4990: 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  mdPtr);..    /* 
49a0: 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f 77  Return 0 for now
49b0: 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 68   until session h
49c0: 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 6c  andling is compl
49d0: 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ete */.    retur
49e0: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  n 0;.}.../*. *--
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c  -. *. * ALPN Cal
4a40: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
4a50: 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61  s and NPN Callba
4a60: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d  ck for Clients -
4a70: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20  -. *. *.Perform 
4a80: 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31  protocol (http/1
4a90: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e  .1, h2, h3, etc.
4aa0: 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20  ) selection for 
4ab0: 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20  the. *.incoming 
4ac0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c  connection. Call
4ad0: 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61  ed after Hello a
4ae0: 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61  nd server callba
4af0: 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f  cks.. *.Where 'o
4b00: 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 20  ut' is selected 
4b10: 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e  protocol and 'in
4b20: 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 64  ' is the peer ad
4b30: 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20  vertised list.. 
4b40: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4b50: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4b60: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4b70: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4b80: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
4b90: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
4ba0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4bb0: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  K: ALPN protocol
4bc0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
4bd0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
4be0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
4bf0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
4c00: 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f  AL: There was no
4c10: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
4c20: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a   the client's. *
4c30: 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69  .    supplied li
4c40: 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 65  st and the serve
4c50: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  r configuration.
4c60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4c70: 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e  will be aborted.
4c80: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4c90: 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70  RR_NOACK: ALPN p
4ca0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
4cb0: 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61  cted, e.g., beca
4cc0: 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20  use no ALPN. *. 
4cd0: 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65     protocols are
4ce0: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
4cf0: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
4d00: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4d10: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d60: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4d70: 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28  nt.ALPNCallback(
4d80: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
4d90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
4da0: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  out, unsigned ch
4db0: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e  ar *outlen,..con
4dc0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4dd0: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69   *in, unsigned i
4de0: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a  nt inlen, void *
4df0: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
4e00: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
4e10: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
4e20: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4e30: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4e40: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4e50: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
4e60: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20  t code, res;..  
4e70: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
4e80: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
4e90: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
4ea0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
4eb0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4ec0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4ed0: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70  .    /* Select p
4ee0: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69  rotocol */.    i
4ef0: 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65  f (SSL_select_ne
4f00: 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e  xt_proto((unsign
4f10: 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c  ed char **) out,
4f20: 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74   outlen, statePt
4f30: 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65  r->protos, state
4f40: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c  Ptr->protos_len,
4f50: 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20  ..in, inlen) == 
4f60: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f  OPENSSL_NPN_NEGO
4f70: 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61  TIATED) {../* Ma
4f80: 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65  tch found */..re
4f90: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4fa0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4fb0: 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f  e {../* OPENSSL_
4fc0: 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d  NPN_NO_OVERLAP =
4fd0: 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20   No overlap, so 
4fe0: 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66  use first item f
4ff0: 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f  rom client proto
5000: 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73  col list */..res
5010: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5020: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
5030: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
5040: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
5050: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
5060: 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a  urn res;.    }..
5070: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
5080: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
5090: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70  th fn, chan, dep
50a0: 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69  th, cert info li
50b0: 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20  st, status, and 
50c0: 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20  error args */.  
50d0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
50e0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
50f0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5100: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5110: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5120: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5130: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
5140: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
5150: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5160: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5170: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
5180: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
5190: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
51a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
51b0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
51c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
51e0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
51f0: 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 20  Obj((const char 
5200: 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20  *) *out, -1));. 
5210: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5220: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5230: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5240: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65  NewBooleanObj(re
5250: 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  s == SSL_TLSEXT_
5260: 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f  ERR_OK));..    /
5270: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
5280: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
5290: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
52a0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
52b0: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
52c0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
52d0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
52e0: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
52f0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5300: 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ACK;.    } else 
5310: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
5320: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5330: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5340: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
5350: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5360: 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d  ERT_FATAL;.    }
5370: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5380: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5390: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
53a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
53f0: 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74  * Advertise Prot
5400: 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66  ocols Callback f
5410: 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c  or Next Protocol
5420: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50   Negotiation (NP
5430: 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c  N) in ServerHell
5440: 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65  o --. *. *.calle
5450: 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72  d when a TLS ser
5460: 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74  ver needs a list
5470: 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 72   of supported pr
5480: 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74  otocols for Next
5490: 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67  . *.Protocol Neg
54a0: 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  otiation.. *. * 
54b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
54c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
54d0: 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72  cts:. *. * Retur
54e0: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
54f0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e  TLSEXT_ERR_OK: N
5500: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  PN protocol sele
5510: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
5520: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5530: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5540: 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f  R_NOACK: NPN pro
5550: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
5560: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5570: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5580: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65  ------. */.#ifde
55d0: 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63  f USE_NPN.static
55e0: 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b   int.NPNCallback
55f0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
5600: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5610: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
5620: 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e  gned int *outlen
5630: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
5640: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
5650: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
5660: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
5670: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
5680: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c  f (ssl == NULL |
5690: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | arg == NULL) {
56a0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
56b0: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
56c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
56d0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
56e0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
56f0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
5700: 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73  ULL) {..*out = s
5710: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b  tatePtr->protos;
5720: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74  ..*outlen = stat
5730: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
5740: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5750: 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f  *out = NULL;..*o
5760: 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75  utlen = 0;..retu
5770: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5780: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20  R_NOACK;.    }. 
5790: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c     return SSL_TL
57a0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23  SEXT_ERR_OK;.}.#
57b0: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  endif.../*. *---
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5800: 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62  . *. * SNI Callb
5810: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
5820: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
5830: 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49   server-side SNI
5840: 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74   hostname select
5850: 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 76  ion after receiv
5860: 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  ing SNI extensio
5870: 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48  n. *.in Client H
5880: 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74  ello. Called aft
5890: 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63  er hello callbac
58a0: 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50  k but before ALP
58b0: 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  N callback.. *. 
58c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
58d0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
58e0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
58f0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
5900: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
5910: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5920: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5930: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
5940: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f  accepted. The co
5950: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5960: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5970: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
5980: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  L: SNI hostname 
5990: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e  is not accepted.
59a0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   The connection.
59b0: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65   *.    is aborte
59c0: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61  d. Default for a
59d0: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55  lert is SSL_AD_U
59e0: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
59f0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5a00: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5a10: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  G: SNI hostname 
5a20: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c  is not accepted,
5a30: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20   warning alert. 
5a40: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20  *.    sent (not 
5a50: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53  supported in TLS
5a60: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65  v1.3). The conne
5a70: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5a80: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5a90: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f  RR_NOACK: SNI ho
5aa0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5ab0: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61  cepted and not a
5ac0: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09  cknowledged,. *.
5ad0: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20      e.g. if SNI 
5ae0: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e  has not been con
5af0: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e  figured. The con
5b00: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
5b10: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5b60: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61  static int.SNICa
5b70: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
5b80: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
5b90: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
5ba0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
5bb0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
5bc0: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
5bd0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
5be0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
5bf0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
5c00: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
5c10: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
5c20: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
5c30: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70   = NULL;..    dp
5c40: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
5c50: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
5c60: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5c70: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5c80: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5c90: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5ca0: 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66   /* Only works f
5cb0: 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65  or TLS 1.2 and e
5cc0: 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65  arlier */.    se
5cd0: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67  rvername = SSL_g
5ce0: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
5cf0: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
5d00: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20  PE_host_name);. 
5d10: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61     if (!serverna
5d20: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65  me || servername
5d30: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] == '\0') {..
5d40: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5d50: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5d60: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
5d70: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
5d80: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
5d90: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5da0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5db0: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
5dc0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
5dd0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61  with fn, chan, a
5de0: 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61  nd server name a
5df0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
5e00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
5e10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
5e20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
5e30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5e40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5e50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5e60: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b  Obj("sni", -1));
5e70: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5e80: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5e90: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
5ea0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5eb0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5ec0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5ed0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5ee0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5ef0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5f00: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5f10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76  ewStringObj(serv
5f20: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a  ername , -1));..
5f30: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
5f40: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
5f50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5f60: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5f70: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
5f80: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
5f90: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
5fa0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
5fb0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5fc0: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
5fd0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5fe0: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5ff0: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
6000: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
6010: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20  3 */.    } else 
6020: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
6030: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
6040: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
6050: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
6060: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
6070: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65  ERT_FATAL;..*ale
6080: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
6090: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
60a0: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
60b0: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
60c0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
60d0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
60e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
60f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6140: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  *. * ClientHello
6150: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62   Handshake Callb
6160: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
6170: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79  --. *. *.Used by
6180: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69   server to exami
6190: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ne the server na
61a0: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
61b0: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  NI) extension. *
61c0: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65  .provided by the
61d0: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72   client in order
61e0: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70   to select an ap
61f0: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66  propriate certif
6200: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73  icate to. *.pres
6210: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74  ent, and make ot
6220: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
6230: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65  n adjustments re
6240: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73  levant to that s
6250: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e  erver. *.name an
6260: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74  d its configurat
6270: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64  ion. This includ
6280: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20  es swapping out 
6290: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
62a0: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65  *.SSL_CTX pointe
62b0: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  r, modifying the
62c0: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f   server's list o
62d0: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20  f permitted TLS 
62e0: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61  versions,. *.cha
62f0: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  nging the server
6300: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69  's cipher list i
6310: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  n response to th
6320: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65  e client's ciphe
6330: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09  r list, etc.. *.
6340: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e  Called before SN
6350: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62  I and ALPN callb
6360: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  acks.. *. * Resu
6370: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
6380: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
6390: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
63a0: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
63b0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
63c0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  es:. *.SSL_CLIEN
63d0: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73  T_HELLO_RETRY: s
63e0: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73  uspend the hands
63f0: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61  hake, and the ha
6400: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e  ndshake function
6410: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d   will return imm
6420: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f  ediately. *.SSL_
6430: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6440: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72  OR: failure, ter
6450: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f  minate connectio
6460: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20  n. Set alert to 
6470: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53  error code.. *.S
6480: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6490: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73  SUCCESS: success
64a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
64f0: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61  atic int.HelloCa
6500: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
6510: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
6520: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
6530: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
6540: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
6550: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6560: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
6570: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
6580: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
6590: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
65a0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
65b0: 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20  servername;.    
65c0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
65d0: 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65  har *p;.    size
65e0: 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e  _t len, remainin
65f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
6600: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6610: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
6620: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
6630: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
6640: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6650: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
6660: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
6670: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c  (const SSL *)NUL
6680: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69  L || arg == (voi
6690: 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  d *)NULL) {..ret
66a0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
66b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
66c0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61  }..    /* Get na
66d0: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  mes */.    if (!
66e0: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  SSL_client_hello
66f0: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54  _get0_ext(ssl, T
6700: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65  LSEXT_TYPE_serve
6710: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d  r_name, &p, &rem
6720: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69  aining) || remai
6730: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61  ning <= 2) {..*a
6740: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
6750: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
6760: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
6770: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6780: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6790: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
67a0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
67b0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73  the supplied lis
67c0: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20  t of names. */. 
67d0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
67e0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
67f0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
6800: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65  f (len + 2 != re
6810: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6820: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33  rt = SSL_R_SSLV3
6830: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50  _ALERT_ILLEGAL_P
6840: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72  ARAMETER;..retur
6850: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6860: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6870: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
6880: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  len;..    /* The
6890: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63   list in practic
68a0: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e  e only has a sin
68b0: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20  gle element, so 
68c0: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  we only consider
68d0: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20   the first one. 
68e0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
68f0: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b  ning == 0 || *p+
6900: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45  + != TLSEXT_NAME
6910: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20  TYPE_host_name) 
6920: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6930: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6940: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
6950: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6960: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6970: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6980: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  g--;..    /* Now
6990: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20   we can finally 
69a0: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74  pull out the byt
69b0: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
69c0: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65   actual hostname
69d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
69e0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
69f0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6a00: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
6a10: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
6a20: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6a30: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6a40: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
6a50: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
6a60: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
6a70: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72   if (len + 2 > r
6a80: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
6a90: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6aa0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6ab0: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6ac0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6ad0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6ae0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
6af0: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  n;.    servernam
6b00: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
6b10: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  *)p;..    /* Cre
6b20: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
6b30: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
6b40: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61  n, and server na
6b50: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  me args */.    c
6b60: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
6b70: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
6b80: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
6b90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6ba0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6bb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6bc0: 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c  ringObj("hello",
6bd0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6be0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6bf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
6c00: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
6c10: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
6c20: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
6c30: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
6c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
6c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
6c70: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6c80: 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54  j(servername, (T
6c90: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a  cl_Size) len));.
6ca0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
6cb0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
6cc0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6cd0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
6ce0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
6cf0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
6d00: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
6d10: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
6d20: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6d30: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61  HELLO_RETRY;..*a
6d40: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6d50: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41  V1_ALERT_USER_CA
6d60: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65  NCELLED;.    } e
6d70: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
6d80: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6d90: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6da0: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
6db0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
6dc0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6dd0: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6de0: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6df0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20  TERNAL_ERROR;.  
6e00: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
6e10: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6e20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
6e30: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
6e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
6e50: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20  Commands        
6e60: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
6e80: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73  ----. *. * Hands
6ed0: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  hakeObjCmd --. *
6ee0: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64  . *.This command
6ef0: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
6f00: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68  fy whether the h
6f10: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70  andshake is comp
6f20: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a  lete. *.or not..
6f30: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
6f40: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
6f50: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73   result. 1 means
6f60: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c   handshake compl
6f70: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e  ete, 0 means pen
6f80: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ding.. *. * Side
6f90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
6fa0: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74   force SSL negot
6fb0: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70  iation to take p
6fc0: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  lace.. *. *-----
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7010: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61  */.static int Ha
7020: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c  ndshakeObjCmd(Cl
7030: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
7040: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
7060: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
7070: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
7080: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
7090: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
70a0: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
70b0: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
70c0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
70d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65  ;        /* clie
70e0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
70f0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63   socket */.    c
7100: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74  onst char *errSt
7110: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  r = NULL;.    in
7120: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69  t ret = 1;.    i
7130: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20  nt err = 0;.    
7140: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
7150: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
7160: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7170: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
7180: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
7190: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
71a0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
71b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
71c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
71d0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
71e0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
71f0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
7200: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
7210: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
7220: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
7230: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
7240: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
7250: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7260: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
7270: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
7280: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
7290: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
72a0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
72b0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
72c0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
72d0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
72e0: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
72f0: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
7300: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7310: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
7320: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
7330: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20  Name(chan),..   
7340: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20   "\": not a TLS 
7350: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
7360: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  *) NULL);..Tcl_S
7370: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
7380: 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44  rp, "TLS", "HAND
7390: 53 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c  SHAKE", "CHANNEL
73a0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
73b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
73c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
73d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
73e0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
73f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
7400: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
7410: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
7420: 61 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46  alling Tls_WaitF
7430: 6f 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20  orConnect");.   
7440: 20 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46   ret = Tls_WaitF
7450: 6f 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50  orConnect(stateP
7460: 74 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20  tr, &err, 1);.  
7470: 20 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57    dprintf("Tls_W
7480: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65  aitForConnect re
7490: 74 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74  turned: %i", ret
74a0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20  );..    if (ret 
74b0: 3c 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74  < 0 && ((statePt
74c0: 72 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54  r->flags & TLS_T
74d0: 43 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72  CL_ASYNC) && (er
74e0: 72 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b  r == EAGAIN))) {
74f0: 0a 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63  ..dprintf("Async
7500: 20 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45   set and err = E
7510: 41 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20  AGAIN");..ret = 
7520: 30 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  0;.    } else if
7530: 20 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f   (ret < 0) {..lo
7540: 6e 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53  ng result;..errS
7550: 74 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65  tr = statePtr->e
7560: 72 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65  rr;..Tcl_ResetRe
7570: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54  sult(interp);..T
7580: 63 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29  cl_SetErrno(err)
7590: 3b 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20  ;...if (!errStr 
75a0: 7c 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30  || (*errStr == 0
75b0: 29 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72  )) {..    errStr
75c0: 20 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f   = Tcl_PosixErro
75d0: 72 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09  r(interp);..}...
75e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
75f0: 28 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68  (interp, "handsh
7600: 61 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65  ake failed: ", e
7610: 72 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20  rrStr, (char *) 
7620: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73  NULL);..if ((res
7630: 75 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65  ult = SSL_get_ve
7640: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
7650: 65 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58  ePtr->ssl)) != X
7660: 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20  509_V_OK) {..   
7670: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7680: 74 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20  t(interp, " due 
7690: 74 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72  to \"", X509_ver
76a0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
76b0: 74 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22  tring(result), "
76c0: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
76d0: 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74  LL);..}..Tcl_Set
76e0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
76f0: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48  , "TLS", "HANDSH
7700: 41 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  AKE", "FAILED", 
7710: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7720: 09 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e  .dprintf("Return
7730: 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69  ing TCL_ERROR wi
7740: 74 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69  th handshake fai
7750: 6c 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72  led: %s", errStr
7760: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7770: 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65  RROR;.    } else
7780: 20 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30   {..if (err != 0
7790: 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
77a0: 28 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77  ("Got an error w
77b0: 69 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20  ith a completed 
77c0: 68 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d  handshake: err =
77d0: 20 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09   %i", err);..}..
77e0: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a  ret = 1;.    }..
77f0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
7800: 75 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69  urning TCL_OK wi
7810: 74 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c  th data \"%i\"",
7820: 20 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53   ret);.    Tcl_S
7830: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
7840: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
7850: 6a 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74  j(ret));.    ret
7860: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
7870: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
7880: 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 5b   *command_opts [
7890: 5d 20 3d 20 7b 0a 20 20 20 20 22 2d 61 6c 70 6e  ] = {.    "-alpn
78a0: 22 2c 20 22 2d 63 61 64 69 72 22 2c 20 22 2d 63  ", "-cadir", "-c
78b0: 61 66 69 6c 65 22 2c 20 22 2d 63 65 72 74 22 2c  afile", "-cert",
78c0: 20 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 22 2d   "-certfile", "-
78d0: 63 69 70 68 65 72 22 2c 20 22 2d 63 69 70 68 65  cipher", "-ciphe
78e0: 72 73 22 2c 20 22 2d 63 69 70 68 65 72 73 75 69  rs", "-ciphersui
78f0: 74 65 73 22 2c 0a 20 20 20 20 22 2d 63 6f 6d 6d  tes",.    "-comm
7900: 61 6e 64 22 2c 20 22 2d 64 68 70 61 72 61 6d 73  and", "-dhparams
7910: 22 2c 20 22 2d 6b 65 79 22 2c 20 22 2d 6b 65 79  ", "-key", "-key
7920: 66 69 6c 65 22 2c 20 22 2d 6d 6f 64 65 6c 22 2c  file", "-model",
7930: 20 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 22 2d   "-password", "-
7940: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c  post_handshake",
7950: 0a 20 20 20 20 22 2d 72 65 71 75 65 73 74 22 2c  .    "-request",
7960: 20 22 2d 72 65 71 75 69 72 65 22 2c 20 22 2d 73   "-require", "-s
7970: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
7980: 22 2d 73 65 72 76 65 72 22 2c 20 22 2d 73 65 72  "-server", "-ser
7990: 76 65 72 6e 61 6d 65 22 2c 20 22 2d 73 65 73 73  vername", "-sess
79a0: 69 6f 6e 5f 69 64 22 2c 20 22 2d 73 73 6c 32 22  ion_id", "-ssl2"
79b0: 2c 0a 20 20 20 20 22 2d 73 73 6c 33 22 2c 20 22  ,.    "-ssl3", "
79c0: 2d 74 6c 73 31 22 2c 20 22 2d 74 6c 73 31 2e 31  -tls1", "-tls1.1
79d0: 22 2c 20 22 2d 74 6c 73 31 2e 32 22 2c 20 22 2d  ", "-tls1.2", "-
79e0: 74 6c 73 31 2e 33 22 2c 20 22 2d 76 61 6c 69 64  tls1.3", "-valid
79f0: 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 76  atecommand", "-v
7a00: 63 6d 64 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e  cmd", NULL};..en
7a10: 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73  um _command_opts
7a20: 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 61 6c 70 6e   {.    _opt_alpn
7a30: 2c 20 5f 6f 70 74 5f 63 61 64 69 72 2c 20 5f 6f  , _opt_cadir, _o
7a40: 70 74 5f 63 61 66 69 6c 65 2c 20 5f 6f 70 74 5f  pt_cafile, _opt_
7a50: 63 65 72 74 2c 20 5f 6f 70 74 5f 63 65 72 74 66  cert, _opt_certf
7a60: 69 6c 65 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72  ile, _opt_cipher
7a70: 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 2c 0a  , _opt_ciphers,.
7a80: 20 20 20 20 5f 6f 70 74 5f 63 69 70 68 65 72 73      _opt_ciphers
7a90: 75 69 74 65 2c 20 5f 6f 70 74 5f 63 6d 64 2c 20  uite, _opt_cmd, 
7aa0: 5f 6f 70 74 5f 64 68 70 61 72 61 6d 73 2c 20 5f  _opt_dhparams, _
7ab0: 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f 6b 65  opt_key, _opt_ke
7ac0: 79 66 69 6c 65 2c 20 5f 6f 70 74 5f 6d 6f 64 65  yfile, _opt_mode
7ad0: 6c 2c 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64  l, _opt_password
7ae0: 2c 0a 20 20 20 20 5f 6f 70 74 5f 68 61 6e 64 73  ,.    _opt_hands
7af0: 68 61 6b 65 2c 20 5f 6f 70 74 5f 72 65 71 75 65  hake, _opt_reque
7b00: 73 74 2c 20 5f 6f 70 74 5f 72 65 71 75 69 72 65  st, _opt_require
7b10: 2c 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f  , _opt_security_
7b20: 6c 65 76 65 6c 2c 20 5f 6f 70 74 5f 73 65 72 76  level, _opt_serv
7b30: 65 72 2c 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e  er, _opt_servern
7b40: 61 6d 65 2c 0a 20 20 20 20 5f 6f 70 74 5f 73 65  ame,.    _opt_se
7b50: 73 73 69 6f 6e 5f 69 64 2c 20 5f 6f 70 74 5f 73  ssion_id, _opt_s
7b60: 73 6c 32 2c 20 5f 6f 70 74 5f 73 73 6c 33 2c 20  sl2, _opt_ssl3, 
7b70: 5f 6f 70 74 5f 74 6c 73 31 2c 20 5f 6f 70 74 5f  _opt_tls1, _opt_
7b80: 74 6c 73 31 31 2c 20 5f 6f 70 74 5f 74 6c 73 31  tls11, _opt_tls1
7b90: 32 2c 20 5f 6f 70 74 5f 74 6c 73 31 33 2c 0a 20  2, _opt_tls13,. 
7ba0: 20 20 20 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65     _opt_validate
7bb0: 2c 20 5f 6f 70 74 5f 76 63 6d 64 0a 7d 3b 0a 0a  , _opt_vcmd.};..
7bc0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49  --------. *. * I
7c10: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
7c20: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
7c30: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
7c40: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73  o process the "s
7c50: 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20  sl" command. *. 
7c60: 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e  *.The ssl comman
7c70: 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65  d pushes SSL ove
7c80: 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65  r a (newly conne
7c90: 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74  cted) tcp socket
7ca0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
7cb0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
7cc0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
7cd0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
7ce0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
7cf0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
7d00: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
7d60: 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  nt.ImportObjCmd(
7d70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7d80: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7d90: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7da0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7db0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7dc0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
7dd0: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
7de0: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
7df0: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
7e00: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
7e10: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
7e20: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
7e30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74  .    SSL_CTX *ct
7e40: 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  x..= NULL;.    T
7e50: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 09 09  cl_Obj *cmdObj..
7e60: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7e70: 4f 62 6a 20 2a 70 61 73 73 77 64 4f 62 6a 09 09  Obj *passwdObj..
7e80: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7e90: 4f 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c  Obj *vcmd..= NUL
7ea0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
7eb0: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
7ec0: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
7ed0: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
7ee0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
7ef0: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
7f00: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
7f10: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63   int idx;.    Tc
7f20: 6c 5f 53 69 7a 65 20 66 6e 2c 20 6c 65 6e 3b 0a  l_Size fn, len;.
7f30: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 09      int flags...
7f40: 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a  = TLS_TCL_INIT;.
7f50: 20 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09      int server..
7f60: 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e  .= 0;./* is conn
7f70: 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20  ection incoming 
7f80: 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a  or outgoing? */.
7f90: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c      char *keyfil
7fa0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  e..= NULL;.    c
7fb0: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 09 3d  har *certfile..=
7fc0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67   NULL;.    unsig
7fd0: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 09 09 3d  ned char *key..=
7fe0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
7ff0: 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 30  ize key_len..= 0
8000: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
8010: 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c  har *cert..= NUL
8020: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
8030: 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20  cert_len..= 0;. 
8040: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
8050: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
8060: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
8070: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
8080: 61 72 20 2a 43 41 66 69 6c 65 09 09 3d 20 4e 55  ar *CAfile..= NU
8090: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
80a0: 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  path..= NULL;.  
80b0: 20 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73    char *DHparams
80c0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
80d0: 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55  ar *model...= NU
80e0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65  LL;.    char *se
80f0: 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c  rvername..= NULL
8100: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f  ;./* hostname fo
8110: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e  r Server Name In
8120: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  dication */.    
8130: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
8140: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20  har *session_id 
8150: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
8160: 53 69 7a 65 20 73 65 73 73 5f 6c 65 6e 09 09 3d  Size sess_len..=
8170: 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   0;.    Tcl_Obj 
8180: 2a 61 6c 70 6e 4f 62 6a 09 09 3d 20 4e 55 4c 4c  *alpnObj..= NULL
8190: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d  ;.    int ssl2 =
81a0: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20   0, ssl3 = 0;.  
81b0: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20    int tls1 = 1, 
81c0: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31  tls1_1 = 1, tls1
81d0: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d  _2 = 1, tls1_3 =
81e0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74   1;.    int prot
81f0: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d  o = 0, level = -
8200: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66  1;.    int verif
8210: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d  y = 0, require =
8220: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c   0, request = 1,
8230: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
8240: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
8250: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
8260: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8270: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
8280: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
8290: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
82a0: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d  TLS1).    tls1 =
82b0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
82c0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
82d0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
82e0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
82f0: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a      tls1_1 = 0;.
8300: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
8310: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
8320: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
8330: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20  _NO_TLS1_2).    
8340: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64  tls1_2 = 0;.#end
8350: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
8360: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
8370: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8380: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31  TLS1_3).    tls1
8390: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  _3 = 0;.#endif..
83a0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
83b0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
83c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
83d0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
83e0: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65  ?options?");..re
83f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8400: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
8410: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
8420: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
8430: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
8440: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
8450: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
8460: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
8470: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
8480: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
8490: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
84a0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
84b0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
84c0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
84d0: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
84e0: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
84f0: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
8500: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
8510: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
8520: 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  {..if (Tcl_GetIn
8530: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
8540: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f  p, objv[idx], co
8550: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74  mmand_opts, "opt
8560: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d  ion", 0, &fn) !=
8570: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
8580: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8590: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61  ;..}.../* Valida
85a0: 74 65 20 61 72 67 20 68 61 73 20 76 61 6c 75 65  te arg has value
85b0: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e   */..if (++idx >
85c0: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54  = objc) {..    T
85d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
85e0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75  interp, "No valu
85f0: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22  e for option \""
8600: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
8610: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  n], "\"", (char 
8620: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
8630: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8640: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29  ..}...switch(fn)
8650: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 61 6c   {..case _opt_al
8660: 70 6e 3a 0a 09 20 20 20 20 61 6c 70 6e 4f 62 6a  pn:..    alpnObj
8670: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20   = objv[idx];.. 
8680: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8690: 5f 6f 70 74 5f 63 61 64 69 72 3a 0a 09 20 20 20  _opt_cadir:..   
86a0: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28   GET_OPT_STRING(
86b0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 70 61 74  objv[idx], CApat
86c0: 68 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  h, NULL);..    b
86d0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
86e0: 5f 63 61 66 69 6c 65 3a 0a 09 20 20 20 20 47 45  _cafile:..    GE
86f0: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8700: 76 5b 69 64 78 5d 2c 20 43 41 66 69 6c 65 2c 20  v[idx], CAfile, 
8710: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
8720: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 65  k;..case _opt_ce
8730: 72 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  rt:..    GET_OPT
8740: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76  _BYTE_ARRAY(objv
8750: 5b 69 64 78 5d 2c 20 63 65 72 74 2c 20 26 63 65  [idx], cert, &ce
8760: 72 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72  rt_len);..    br
8770: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8780: 63 65 72 74 66 69 6c 65 3a 0a 09 20 20 20 20 47  certfile:..    G
8790: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
87a0: 6a 76 5b 69 64 78 5d 2c 20 63 65 72 74 66 69 6c  jv[idx], certfil
87b0: 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  e, NULL);..    b
87c0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
87d0: 5f 63 69 70 68 65 72 3a 0a 09 63 61 73 65 20 5f  _cipher:..case _
87e0: 6f 70 74 5f 63 69 70 68 65 72 73 3a 0a 09 20 20  opt_ciphers:..  
87f0: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
8800: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68  (objv[idx], ciph
8810: 65 72 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ers, NULL);..   
8820: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8830: 70 74 5f 63 69 70 68 65 72 73 75 69 74 65 3a 0a  pt_ciphersuite:.
8840: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52  .    GET_OPT_STR
8850: 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63  ING(objv[idx], c
8860: 69 70 68 65 72 73 75 69 74 65 73 2c 20 4e 55 4c  iphersuites, NUL
8870: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
8880: 09 63 61 73 65 20 5f 6f 70 74 5f 63 6d 64 3a 0a  .case _opt_cmd:.
8890: 09 20 20 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62  .    cmdObj = ob
88a0: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
88b0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
88c0: 64 68 70 61 72 61 6d 73 3a 0a 09 20 20 20 20 47  dhparams:..    G
88d0: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
88e0: 6a 76 5b 69 64 78 5d 2c 20 44 48 70 61 72 61 6d  jv[idx], DHparam
88f0: 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  s, NULL);..    b
8900: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8910: 5f 6b 65 79 3a 0a 09 20 20 20 20 47 45 54 5f 4f  _key:..    GET_O
8920: 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62  PT_BYTE_ARRAY(ob
8930: 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26 6b  jv[idx], key, &k
8940: 65 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72  ey_len);..    br
8950: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8960: 6b 65 79 66 69 6c 65 3a 0a 09 20 20 20 20 47 45  keyfile:..    GE
8970: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8980: 76 5b 69 64 78 5d 2c 20 6b 65 79 66 69 6c 65 2c  v[idx], keyfile,
8990: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
89a0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6d  ak;..case _opt_m
89b0: 6f 64 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f  odel:..    GET_O
89c0: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69  PT_STRING(objv[i
89d0: 64 78 5d 2c 20 6d 6f 64 65 6c 2c 20 4e 55 4c 4c  dx], model, NULL
89e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
89f0: 63 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f  case _opt_passwo
8a00: 72 64 3a 0a 09 20 20 20 20 70 61 73 73 77 64 4f  rd:..    passwdO
8a10: 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a  bj = objv[idx];.
8a20: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8a30: 65 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65  e _opt_handshake
8a40: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42  :..    GET_OPT_B
8a50: 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  OOL(objv[idx], &
8a60: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
8a70: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8a80: 73 65 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 3a  se _opt_request:
8a90: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f  ..    GET_OPT_BO
8aa0: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72  OL(objv[idx], &r
8ab0: 65 71 75 65 73 74 29 3b 0a 09 20 20 20 20 62 72  equest);..    br
8ac0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8ad0: 72 65 71 75 69 72 65 3a 0a 09 20 20 20 20 47 45  require:..    GE
8ae0: 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b  T_OPT_BOOL(objv[
8af0: 69 64 78 5d 2c 20 26 72 65 71 75 69 72 65 29 3b  idx], &require);
8b00: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8b10: 73 65 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79  se _opt_security
8b20: 5f 6c 65 76 65 6c 3a 0a 09 20 20 20 20 47 45 54  _level:..    GET
8b30: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
8b40: 78 5d 2c 20 26 6c 65 76 65 6c 29 3b 0a 09 20 20  x], &level);..  
8b50: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8b60: 6f 70 74 5f 73 65 72 76 65 72 3a 0a 09 20 20 20  opt_server:..   
8b70: 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62   GET_OPT_BOOL(ob
8b80: 6a 76 5b 69 64 78 5d 2c 20 26 73 65 72 76 65 72  jv[idx], &server
8b90: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8ba0: 63 61 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72  case _opt_server
8bb0: 6e 61 6d 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f  name:..    GET_O
8bc0: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69  PT_STRING(objv[i
8bd0: 64 78 5d 2c 20 73 65 72 76 65 72 6e 61 6d 65 2c  dx], servername,
8be0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
8bf0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73  ak;..case _opt_s
8c00: 65 73 73 69 6f 6e 5f 69 64 3a 0a 09 20 20 20 20  ession_id:..    
8c10: 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52  GET_OPT_BYTE_ARR
8c20: 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65  AY(objv[idx], se
8c30: 73 73 69 6f 6e 5f 69 64 2c 20 26 73 65 73 73 5f  ssion_id, &sess_
8c40: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  len);..    break
8c50: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c  ;..case _opt_ssl
8c60: 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  2:..    GET_OPT_
8c70: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8c80: 73 73 6c 32 29 3b 0a 09 20 20 20 20 62 72 65 61  ssl2);..    brea
8c90: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73  k;..case _opt_ss
8ca0: 6c 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  l3:..    GET_OPT
8cb0: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  _INT(objv[idx], 
8cc0: 26 73 73 6c 33 29 3b 0a 09 20 20 20 20 62 72 65  &ssl3);..    bre
8cd0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74  ak;..case _opt_t
8ce0: 6c 73 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ls1:..    GET_OP
8cf0: 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c  T_INT(objv[idx],
8d00: 20 26 74 6c 73 31 29 3b 0a 09 20 20 20 20 62 72   &tls1);..    br
8d10: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8d20: 74 6c 73 31 31 3a 0a 09 20 20 20 20 47 45 54 5f  tls11:..    GET_
8d30: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8d40: 5d 2c 20 26 74 6c 73 31 5f 31 29 3b 0a 09 20 20  ], &tls1_1);..  
8d50: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8d60: 6f 70 74 5f 74 6c 73 31 32 3a 0a 09 20 20 20 20  opt_tls12:..    
8d70: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76  GET_OPT_INT(objv
8d80: 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f 32 29 3b  [idx], &tls1_2);
8d90: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8da0: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 33 3a 0a 09  se _opt_tls13:..
8db0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
8dc0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8dd0: 5f 33 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  _3);..    break;
8de0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 76 61 6c 69  ..case _opt_vali
8df0: 64 61 74 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74  date:..case _opt
8e00: 5f 76 63 6d 64 3a 0a 09 20 20 20 20 76 63 6d 64  _vcmd:..    vcmd
8e10: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20   = objv[idx];.. 
8e20: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20     break;..}.   
8e30: 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 71 75   }..    if (requ
8e40: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20  est)..verify |= 
8e50: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
8e60: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52  T_ONCE | SSL_VER
8e70: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66  IFY_PEER;.    if
8e80: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71   (request && req
8e90: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20  uire).verify |= 
8ea0: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
8eb0: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b  IF_NO_PEER_CERT;
8ec0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
8ed0: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
8ee0: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  ke).verify |= SS
8ef0: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41  L_VERIFY_POST_HA
8f00: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20  NDSHAKE;.    if 
8f10: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76  (verify == 0)..v
8f20: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49  erify = SSL_VERI
8f30: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72  FY_NONE;..    pr
8f40: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54  oto |= (ssl2 ? T
8f50: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20  LS_PROTO_SSL2 : 
8f60: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
8f70: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f   (ssl3 ? TLS_PRO
8f80: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20  TO_SSL3 : 0);.  
8f90: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
8fa0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8fb0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
8fc0: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54  o |= (tls1_1 ? T
8fd0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20  LS_PROTO_TLS1_1 
8fe0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
8ff0: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53  |= (tls1_2 ? TLS
9000: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20  _PROTO_TLS1_2 : 
9010: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9020: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50   (tls1_3 ? TLS_P
9030: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29  ROTO_TLS1_3 : 0)
9040: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20  ;..    /* reset 
9050: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b  to NULL if blank
9060: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64   string provided
9070: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74   */.    if (cert
9080: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20   && !*cert)..   
9090: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20       cert.      
90a0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
90b0: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09   (key && !*key).
90c0: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20  .        key.   
90d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
90e0: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26   if (certfile &&
90f0: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20   !*certfile)    
9100: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20       certfile.= 
9110: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
9120: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69  yfile && !*keyfi
9130: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20  le)..keyfile.   
9140: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9150: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20   if (ciphers && 
9160: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20  !*ciphers).     
9170: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20     ciphers.     
9180: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9190: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20  f (ciphersuites 
91a0: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65  && !*ciphersuite
91b0: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20  s) ciphersuites 
91c0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
91d0: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43  f (CAfile && !*C
91e0: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43  Afile).        C
91f0: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  Afile.        = 
9200: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
9210: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68  path && !*CApath
9220: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68  ).        CApath
9230: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9240: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
9250: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
9260: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
9270: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
9280: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
9290: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
92a0: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
92b0: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
92c0: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
92d0: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
92e0: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
92f0: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
9300: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
9310: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
9320: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
9330: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
9340: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
9350: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
9360: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
9370: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
9380: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
9390: 20 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20    if (cmdObj != 
93a0: 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29 20  NULL) {..(void) 
93b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
93c0: 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 26 6c 65  mObj(cmdObj, &le
93d0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
93e0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
93f0: 61 6c 6c 62 61 63 6b 20 3d 20 63 6d 64 4f 62 6a  allback = cmdObj
9400: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
9410: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
9420: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a  ->callback);..}.
9430: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
9440: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20  locate password 
9450: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77  */.    if (passw
9460: 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  dObj != NULL) {.
9470: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
9480: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73  tringFromObj(pas
9490: 73 77 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09  swdObj, &len);..
94a0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
94b0: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
94c0: 72 64 20 3d 20 70 61 73 73 77 64 4f 62 6a 3b 0a  rd = passwdObj;.
94d0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
94e0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
94f0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
9500: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
9510: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f  cate validate co
9520: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20  mmand */.    if 
9530: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29  (vcmd) {..(void)
9540: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9550: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e  omObj(vcmd, &len
9560: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
9570: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63      statePtr->vc
9580: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20  md = vcmd;..    
9590: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
95a0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
95b0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
95c0: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
95d0: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
95e0: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
95f0: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
9600: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
9610: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
9620: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
9630: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
9640: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
9650: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
9660: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
9670: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
9680: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9690: 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61  ;..}.../*.. * Ma
96a0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
96b0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
96c0: 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09  t channel.. */..
96d0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
96e0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
96f0: 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e  .if (Tcl_GetChan
9700: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
9710: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
9720: 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  ()) {..    Tcl_A
9730: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9740: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
9750: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
9760: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
9770: 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53  .."\": not a TLS
9780: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
9790: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
97a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
97b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
97c0: 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  "IMPORT", "CHANN
97d0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
97e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
97f0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
9800: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
9810: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
9820: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9830: 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74  ;..}..ctx = ((St
9840: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
9850: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
9860: 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20  (chan))->ctx;.  
9870: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
9880: 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28  (ctx = CTX_Init(
9890: 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72  statePtr, server
98a0: 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65  , proto, keyfile
98b0: 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c  , certfile, key,
98c0: 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b 65 79   cert, (int) key
98d0: 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29  _len,..    (int)
98e0: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74   cert_len, CApat
98f0: 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  h, CAfile, ciphe
9900: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
9910: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
9920: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
9930: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
9940: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
9950: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
9960: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9970: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ..}.    }..    s
9980: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63  tatePtr->ctx = c
9990: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  tx;..    /*.    
99a0: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61   * We need to ma
99b0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
99c0: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69   channel works i
99d0: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68  n binary (for th
99e0: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74  e.     * encrypt
99f0: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67  ion not to get g
9a00: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20  oofed up)..     
9a10: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74  * We only want t
9a20: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66  o adjust the buf
9a30: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32  fering in pre-v2
9a40: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65   channels, where
9a50: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61  .     * each cha
9a60: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63  nnel in the stac
9a70: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73  k maintained its
9a80: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20   own buffers..  
9a90: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53     */.    Tcl_DS
9aa0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
9ab0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
9ac0: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
9ad0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
9ae0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
9af0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9b00: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
9b10: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
9b20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9b30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
9b40: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
9b50: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9b60: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9b70: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65  -eofchar", &uppe
9b80: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
9b90: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
9ba0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9bb0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64  p, chan, "-encod
9bc0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
9bd0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
9be0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9bf0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9c00: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
9c10: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
9c20: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
9c30: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
9c40: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9c50: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
9c60: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
9c70: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
9c80: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
9c90: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
9ca0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
9cb0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20  ", "binary");.  
9cc0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
9cd0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9ce0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
9cf0: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64  , "true");.    d
9d00: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e  printf("Consumin
9d10: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73  g Tcl channel %s
9d20: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
9d30: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20  lName(chan));.  
9d40: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
9d50: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e   = Tcl_StackChan
9d60: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f  nel(interp, Tls_
9d70: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28  ChannelType(), (
9d80: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
9d90: 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44  ePtr,..(TCL_READ
9da0: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
9db0: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20  BLE), chan);.   
9dc0: 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65   dprintf("Create
9dd0: 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20  d channel named 
9de0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
9df0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
9e00: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66  ->self));.    if
9e10: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
9e20: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
9e30: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20  ) NULL) {../*.. 
9e40: 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f  * No use of Tcl_
9e50: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62  EventuallyFree b
9e60: 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62  ecause no possib
9e70: 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e  le Tcl_Preserve.
9e80: 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28  .. */..Tls_Free(
9e90: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
9ea0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
9eb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ec0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
9ed0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9ee0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
9ef0: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c  ->self, "-transl
9f00: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72  ation", Tcl_DStr
9f10: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
9f20: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
9f30: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  n));.    Tcl_Set
9f40: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9f50: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9f60: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  self, "-encoding
9f70: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
9f80: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
9f90: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20  lEncoding));.   
9fa0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9fb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
9fc0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
9fd0: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53  eofchar", Tcl_DS
9fe0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
9ff0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
a000: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
a010: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
a020: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
a030: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  lf, "-blocking",
a040: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
a050: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
a060: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54  locking));.    T
a070: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
a080: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
a090: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
a0a0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
a0b0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
a0c0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
a0d0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
a0e0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
a0f0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a100: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
a110: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20  elBlocking);..  
a120: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
a130: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  Initialization. 
a140: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65      */.    state
a150: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e  Ptr->ssl = SSL_n
a160: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ew(statePtr->ctx
a170: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74  );.    if (!stat
a180: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a  ePtr->ssl) {../*
a190: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72   SSL library err
a1a0: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e  or */..Tcl_Appen
a1b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a1c0: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72  "couldn't constr
a1d0: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a  uct ssl session:
a1e0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
a1f0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
a200: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
a210: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
a220: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
a230: 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41  RT", "INIT", "FA
a240: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
a250: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65  NULL);..Tls_Free
a260: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
a270: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72  *) statePtr);..r
a280: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a290: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
a2a0: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e  et host server n
a2b0: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ame */.    if (s
a2c0: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a  ervername) {../*
a2d0: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72   Sets the server
a2e0: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e   name indication
a2f0: 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74   (SNI) in Client
a300: 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20  Hello extension 
a310: 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36  */../* Per RFC 6
a320: 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73  066, hostname is
a330: 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64   a ASCII encoded
a340: 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20   string, though 
a350: 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54  RFC 4366 says UT
a360: 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  F-8. */..if (!SS
a370: 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73  L_set_tlsext_hos
a380: 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  t_name(statePtr-
a390: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
a3a0: 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a  ) && require) {.
a3b0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a3c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
a3d0: 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e  et SNI extension
a3e0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
a3f0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
a400: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a410: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
a420: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
a430: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e  ", "IMPORT", "SN
a440: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  I", "FAILED", (c
a450: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a460: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
a470: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
a480: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a4a0: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74  .}.../* Set host
a4b0: 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65  name for peer ce
a4c0: 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61  rtificate hostna
a4d0: 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  me verification 
a4e0: 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20  in clients...   
a4f0: 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65  Don't use SSL_se
a500: 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74  t1_host since it
a510: 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73   has limitations
a520: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61  . */..if (!SSL_a
a530: 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74  dd1_host(statePt
a540: 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61  r->ssl, serverna
a550: 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  me)) {..    Tcl_
a560: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a570: 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f  erp, "Set DNS ho
a580: 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22  stname failed: "
a590: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
a5a0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
a5b0: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
a5c0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
a5d0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
a5e0: 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22  ", "HOSTNAME", "
a5f0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
a600: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
a610: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
a620: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
a630: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a640: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
a650: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75    }..    /* Resu
a660: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f  me session id */
a670: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e  .    if (session
a680: 5f 69 64 20 26 26 20 73 65 73 73 5f 6c 65 6e 20  _id && sess_len 
a690: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43  <= SSL_MAX_SID_C
a6a0: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a  TX_LENGTH) {../*
a6b0: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e   SSL_set_session
a6c0: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  () */..if (!SSL_
a6d0: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f  SESSION_set1_id_
a6e0: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f  context(SSL_get_
a6f0: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72  session(statePtr
a700: 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f  ->ssl), session_
a710: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  id, (unsigned in
a720: 74 29 20 73 65 73 73 5f 6c 65 6e 29 29 20 7b 0a  t) sess_len)) {.
a730: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a740: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52  esult(interp, "R
a750: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61  esume session fa
a760: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
a770: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
a780: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a790: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a7a0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a7b0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49  "IMPORT", "SESSI
a7c0: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ON", "FAILED", (
a7d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
a7e0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
a7f0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
a800: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a810: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a820: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a830: 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61  * Enable Applica
a840: 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f  tion-Layer Proto
a850: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
a860: 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68   Examples are: h
a870: 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31  ttp/1.0,..http/1
a880: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c  .1, h2, h3, ftp,
a890: 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70   imap, pop3, xmp
a8a0: 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73  p-client, xmpp-s
a8b0: 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63  erver, mqtt, irc
a8c0: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66  , etc. */.    if
a8d0: 20 28 61 6c 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c   (alpnObj != NUL
a8e0: 4c 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74  L) {../* Convert
a8f0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f   a TCL list into
a900: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74   a protocol-list
a910: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20   in wire-format 
a920: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
a930: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09  r *protos, *p;..
a940: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f  unsigned int pro
a950: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63  tos_len = 0;..Tc
a960: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09  l_Size cnt, i;..
a970: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20  int j;..Tcl_Obj 
a980: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
a990: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
a9a0: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
a9b0: 6e 4f 62 6a 2c 20 26 63 6e 74 2c 20 26 6c 69 73  nObj, &cnt, &lis
a9c0: 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  t) != TCL_OK) {.
a9d0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74  .    Tls_Free((t
a9e0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
a9f0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
aa00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
aa10: 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d  ;..}.../* Determ
aa20: 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72  ine the memory r
aa30: 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20  equired for the 
aa40: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
aa50: 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
aa60: 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20  < cnt; i++) {.. 
aa70: 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
aa80: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c  FromObj(list[i],
aa90: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20   &len);..    if 
aaa0: 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09  (len > 255) {...
aab0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
aac0: 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70  (interp, "ALPN p
aad0: 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f  rotocol names to
aae0: 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a  o long", (char *
aaf0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53  ) NULL);...Tcl_S
ab00: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
ab10: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
ab20: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
ab30: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
ab40: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65  NULL);...Tls_Fre
ab50: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
ab60: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
ab70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ab80: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70  R;..    }..    p
ab90: 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b  rotos_len += 1 +
aba0: 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a   (int) len;..}..
abb0: 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f  ./* Build the co
abc0: 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d  mplete protocol-
abd0: 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20  list */..protos 
abe0: 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73  = ckalloc(protos
abf0: 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f  _len);../* proto
ac00: 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73  col-lists consis
ac10: 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74  t of 8-bit lengt
ac20: 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65  h-prefixed, byte
ac30: 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72   strings */..for
ac40: 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f   (j = 0, p = pro
ac50: 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b  tos; j < cnt; j+
ac60: 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  +) {..    char *
ac70: 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  str = Tcl_GetStr
ac80: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b  ingFromObj(list[
ac90: 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20  j], &len);..    
aca0: 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64  *p++ = (unsigned
acb0: 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20   char) len;..   
acc0: 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20   memcpy(p, str, 
acd0: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09  (size_t) len);..
ace0: 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d      p += len;..}
acf0: 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c  .../* SSL_set_al
ad00: 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20  pn_protos makes 
ad10: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72  a copy of the pr
ad20: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
ad30: 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75  /* Note: This fu
ad40: 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20  nction reverses 
ad50: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
ad60: 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09   convention */..
ad70: 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  if (SSL_set_alpn
ad80: 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72  _protos(statePtr
ad90: 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70  ->ssl, protos, p
ada0: 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20  rotos_len)) {.. 
adb0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
adc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
add0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20   ALPN protocols 
ade0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
adf0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
ae00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ae10: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
ae20: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
ae30: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50  , "IMPORT", "ALP
ae40: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
ae50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ae60: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
ae70: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
ae80: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b  atePtr);..    ck
ae90: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20  free(protos);.. 
aea0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
aeb0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f  ROR;..}.../* Sto
aec0: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  re protocols lis
aed0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  t */..statePtr->
aee0: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b  protos = protos;
aef0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
af00: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f  os_len = protos_
af10: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
af20: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  {..statePtr->pro
af30: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61  tos = NULL;..sta
af40: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
af50: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
af60: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
af70: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a  Callbacks.     *
af80: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70  /.    SSL_set_ap
af90: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d  p_data(statePtr-
afa0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
afb0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e  atePtr);./* poin
afc0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a  t back to us */.
afd0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72  .    SSL_set_ver
afe0: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ify(statePtr->ss
aff0: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66  l, verify, Verif
b000: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
b010: 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c  SSL_set_info_cal
b020: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
b030: 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63  ssl, InfoCallbac
b040: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c  k);..    /* Call
b050: 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69  back for observi
b060: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73  ng protocol mess
b070: 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ages */.#ifndef 
b080: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
b090: 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64  RACE.    /* void
b0a0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_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 63 74 78 2c 20 28 76 6f  atePtr->ctx, (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 76 6f 69 64 20 53 53 4c 5f 43 54 58      void SSL_CTX
b0f0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
b100: 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  k(statePtr->ctx,
b110: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
b120: 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  ); */.    SSL_se
b130: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
b140: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  rg(statePtr->ssl
b150: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
b160: 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  tr);.    SSL_set
b170: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74  _msg_callback(st
b180: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73  atePtr->ssl, Mes
b190: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23  sageCallback);.#
b1a0: 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72  endif..    /* Cr
b1b0: 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  eate Tcl_Channel
b1c0: 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a   BIO Handler */.
b1d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f      statePtr->p_
b1e0: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63  bio.= BIO_new_tc
b1f0: 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f  l(statePtr, BIO_
b200: 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74  NOCLOSE);.    st
b210: 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49  atePtr->bio.= BI
b220: 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28  O_new(BIO_f_ssl(
b230: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72  ));..    if (ser
b240: 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65  ver) {../* Serve
b250: 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09  r callbacks */..
b260: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
b270: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72  xt_servername_ar
b280: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
b290: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
b2a0: 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  r);..SSL_CTX_set
b2b0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
b2c0: 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74  me_callback(stat
b2d0: 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61  ePtr->ctx, SNICa
b2e0: 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54  llback);..SSL_CT
b2f0: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c  X_set_client_hel
b300: 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  lo_cb(statePtr->
b310: 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61  ctx, HelloCallba
b320: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
b330: 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74  ePtr);..if (stat
b340: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
b350: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
b360: 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65  _CTX_set_alpn_se
b370: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
b380: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
b390: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
b3a0: 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55  tePtr);.#ifdef U
b3b0: 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28  SE_NPN..    if (
b3c0: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
b3d0: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09  ls1_3 == 0) {...
b3e0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
b3f0: 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73  _protos_advertis
b400: 65 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ed_cb(statePtr->
b410: 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b  ctx, NPNCallback
b420: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
b430: 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64  tr);..    }.#end
b440: 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c  if..}.../* Enabl
b450: 65 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64  e server to send
b460: 20 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66   cert request af
b470: 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54  ter handshake (T
b480: 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a  LS 1.3 only) */.
b490: 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72  ./* A write oper
b4a0: 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20  ation must take 
b4b0: 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65  place for the Ce
b4c0: 72 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73  rtificate Reques
b4d0: 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74  t to be..   sent
b4e0: 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20   to the client, 
b4f0: 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65  this can be done
b500: 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e   with SSL_do_han
b510: 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66  dshake(). */..if
b520: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
b530: 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74  t_handshake && t
b540: 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53  ls1_3) {..    SS
b550: 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f  L_verify_client_
b560: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73  post_handshake(s
b570: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
b580: 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d  }.../* set autom
b590: 61 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63  atic curve selec
b5a0: 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74  tion */..SSL_set
b5b0: 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65  _ecdh_auto(state
b5c0: 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09  Ptr->ssl, 1);...
b5d0: 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f  /* Set server mo
b5e0: 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  de */..statePtr-
b5f0: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43  >flags |= TLS_TC
b600: 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73  L_SERVER;..SSL_s
b610: 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28  et_accept_state(
b620: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
b630: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a      } else {../*
b640: 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b   Client callback
b650: 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  s */.#ifdef USE_
b660: 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74  NPN..if (statePt
b670: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
b680: 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30  L && tls1_2 == 0
b690: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
b6a0: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
b6b0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73  set_next_proto_s
b6c0: 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74  elect_cb(statePt
b6d0: 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c  r->ctx, ALPNCall
b6e0: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
b6f0: 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64  atePtr);..}.#end
b700: 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  if.../* Session 
b710: 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f  caching */..SSL_
b720: 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f  CTX_set_session_
b730: 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65  cache_mode(state
b740: 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45  Ptr->ctx, SSL_SE
b750: 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20  SS_CACHE_CLIENT 
b760: 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  | SSL_SESS_CACHE
b770: 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f  _NO_INTERNAL_STO
b780: 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  RE);..SSL_CTX_se
b790: 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74  ss_set_new_cb(st
b7a0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73  atePtr->ctx, Ses
b7b0: 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  sionCallback);..
b7c0: 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20  ./* Enable post 
b7d0: 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e  handshake Authen
b7e0: 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69  tication extensi
b7f0: 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  on. TLS 1.3 only
b800: 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f  , not http/2. */
b810: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
b820: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29   post_handshake)
b830: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f   {..    SSL_set_
b840: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61  post_handshake_a
b850: 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uth(statePtr->ss
b860: 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  l, 1);..}.../* S
b870: 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a  et client mode *
b880: 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65  /..SSL_set_conne
b890: 63 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  ct_state(statePt
b8a0: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
b8b0: 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73     SSL_set_bio(s
b8c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74  tatePtr->ssl, st
b8d0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73  atePtr->p_bio, s
b8e0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b  tatePtr->p_bio);
b8f0: 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c  .    BIO_set_ssl
b900: 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20  (statePtr->bio, 
b910: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42  statePtr->ssl, B
b920: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20  IO_NOCLOSE);..  
b930: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20    /*.     * End 
b940: 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20  of SSL Init.    
b950: 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28   */.    dprintf(
b960: 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20  "Returning %s", 
b970: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
b980: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
b990: 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  f));.    Tcl_Set
b9a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
b9b0: 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43  char *) Tcl_GetC
b9c0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
b9d0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f  Ptr->self), TCL_
b9e0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20  VOLATILE);..    
b9f0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ba00: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
ba10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
ba50: 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  * UnimportObjCmd
ba60: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
ba70: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
ba80: 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68  ked to remove th
ba90: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
baa0: 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20  l filter.. *. * 
bab0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
bac0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
bad0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
bae0: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
baf0: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
bb00: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
bb10: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
bb60: 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d  .static int.Unim
bb70: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
bb80: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
bb90: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
bba0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
bbb0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
bbc0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
bbd0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
bbe0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
bbf0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
bc00: 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63   */.    (void) c
bc10: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
bc20: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
bc30: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
bc40: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
bc50: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
bc60: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
bc70: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
bc80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
bc90: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
bca0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
bcb0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
bcc0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
bcd0: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
bce0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
bcf0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
bd00: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bd10: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
bd20: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
bd30: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
bd40: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
bd50: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
bd60: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
bd70: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
bd80: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
bd90: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
bda0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
bdb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bdc0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
bdd0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
bde0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
bdf0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
be00: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
be10: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
be20: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
be30: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e  terp, "TLS", "UN
be40: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45  IMPORT", "CHANNE
be50: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
be60: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
be70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
be80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
be90: 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e  (Tcl_UnstackChan
bea0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
beb0: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20  ) == TCL_ERROR) 
bec0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
bed0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
bee0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
bef0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
bf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
bf40: 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f  * CTX_Init -- co
bf50: 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54  nstruct a SSL_CT
bf60: 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a  X instance. *. *
bf70: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76   Results:. *.A v
bf80: 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73  alid SSL_CTX ins
bf90: 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20  tance or NULL.. 
bfa0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
bfb0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
bfc0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54   SSL context (CT
bfd0: 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  X). *. *--------
bfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
c020: 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a  static SSL_CTX *
c030: 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  .CTX_Init(State 
c040: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
c050: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
c060: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c  to, char *keyfil
c070: 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c  e, char *certfil
c080: 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  e,.    unsigned 
c090: 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67  char *key, unsig
c0a0: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20  ned char *cert, 
c0b0: 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74  int key_len, int
c0c0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72 20   cert_len, char 
c0d0: 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61  *CApath,.    cha
c0e0: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
c0f0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
c100: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
c110: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
c120: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54  Hparams) {.    T
c130: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c140: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
c150: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
c160: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
c170: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
c180: 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d  s;.    int off =
c190: 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20   0, abort = 0;. 
c1a0: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
c1b0: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
c1c0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
c1d0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
c1e0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
c1f0: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
c200: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c210: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
c220: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
c230: 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20  elected", (char 
c240: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c250: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
c260: 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c     /* create SSL
c270: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20   context */.#if 
c280: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
c290: 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30  NUMBER >= 0x1010
c2a0: 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64  0000L || defined
c2b0: 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66  (NO_SSL2) || def
c2c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c2d0: 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e  SSL2).    if (EN
c2e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
c2f0: 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a  _PROTO_SSL2)) {.
c300: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
c310: 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20  t(interp, "SSL2 
c320: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
c330: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
c340: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
c350: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
c360: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
c370: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
c380: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
c390: 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL3).    if (ENA
c3a0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
c3b0: 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09  PROTO_SSL3)) {..
c3c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
c3d0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70  (interp, "SSL3 p
c3e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
c3f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
c400: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
c410: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
c420: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
c430: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
c440: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c450: 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  S1).    if (ENAB
c460: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
c470: 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54  ROTO_TLS1)) {..T
c480: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c490: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30  interp, "TLS 1.0
c4a0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c4b0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c4c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c4d0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c4e0: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c4f0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
c500: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c510: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66  O_TLS1_1).    if
c520: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
c530: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
c540: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
c550: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c560: 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f  "TLS 1.1 protoco
c570: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
c580: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c590: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c5a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
c5b0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
c5c0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
c5d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
c5e0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
c5f0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c600: 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54  TO_TLS1_2)) {..T
c610: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c620: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32  interp, "TLS 1.2
c630: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c640: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c650: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c660: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c670: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c680: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
c690: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c6a0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66  O_TLS1_3).    if
c6b0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
c6c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
c6d0: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
c6e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c6f0: 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f  "TLS 1.3 protoco
c700: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
c710: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c720: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c730: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
c740: 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29   if (proto == 0)
c750: 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20   {../* Use full 
c760: 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54  range */..SSL_CT
c770: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
c780: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
c790: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61  ..SSL_CTX_set_ma
c7a0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
c7b0: 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ctx, 0);.    }..
c7c0: 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74      switch (prot
c7d0: 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  o) {.#if OPENSSL
c7e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
c7f0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
c800: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
c810: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
c820: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
c830: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
c840: 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64  TO_SSL2:..method
c850: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53   = isServer ? SS
c860: 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f  Lv2_server_metho
c870: 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65  d() : SSLv2_clie
c880: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
c890: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
c8a0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
c8b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c8c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
c8d0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
c8e0: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
c8f0: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
c900: 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74  PROTO_SSL3:..met
c910: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c920: 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65   SSLv3_server_me
c930: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63  thod() : SSLv3_c
c940: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
c950: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
c960: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
c970: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
c980: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c990: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c9a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
c9b0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
c9c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09  LS_PROTO_TLS1:..
c9d0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
c9e0: 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72  r ? TLSv1_server
c9f0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
ca00: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
ca10: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
ca20: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
ca30: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
ca40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
ca50: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
ca60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
ca70: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
ca80: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
ca90: 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f  O_TLS1_1:..metho
caa0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
cab0: 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65  LSv1_1_server_me
cac0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31  thod() : TLSv1_1
cad0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
cae0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
caf0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
cb00: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
cb10: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
cb20: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
cb30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
cb40: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
cb50: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
cb60: 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64  _TLS1_2:..method
cb70: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
cb80: 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_2_server_met
cb90: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f  hod() : TLSv1_2_
cba0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
cbb0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
cbc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
cbd0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
cbe0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
cbf0: 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20  LS1_3).    case 
cc00: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
cc10: 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65  :../* Use the ge
cc20: 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64  neric method and
cc30: 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67   constraint rang
cc40: 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20  e after context 
cc50: 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d  is created */..m
cc60: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
cc70: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
cc80: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
cc90: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
cca0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
ccb0: 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65   default:../* Ne
ccc0: 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20  gotiate highest 
ccd0: 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c  available SSL/TL
cce0: 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65  S version */..me
ccf0: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
cd00: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
cd10: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
cd20: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66  nt_method();.#if
cd30: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
cd40: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
cd50: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
cd60: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
cd70: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
cd80: 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20  O_SSL2)..off |= 
cd90: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
cda0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20  TLS_PROTO_SSL2) 
cdb0: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
cdc0: 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66  O_SSLv2);.#endif
cdd0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
cde0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
cdf0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
ce00: 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L3)..off |= (ENA
ce10: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
ce20: 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20  PROTO_SSL3)   ? 
ce30: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
ce40: 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv3);.#endif.#if
ce50: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ce60: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
ce70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
ce80: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
ce90: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cea0: 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20  O_TLS1)   ? 0 : 
ceb0: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29  SSL_OP_NO_TLSv1)
cec0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
ced0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
cee0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
cef0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
cf00: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
cf10: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cf20: 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20  O_TLS1_1) ? 0 : 
cf30: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
cf40: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
cf50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
cf60: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
cf70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
cf80: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
cf90: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
cfa0: 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20  OTO_TLS1_2) ? 0 
cfb0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
cfc0: 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_2);.#endif.#if
cfd0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
cfe0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
cff0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d000: 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _3)..off |= (ENA
d010: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d020: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20  PROTO_TLS1_3) ? 
d030: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
d040: 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09  Sv1_3);.#endif..
d050: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
d060: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
d070: 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20  r();..    ctx = 
d080: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
d090: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74  od);.    if (!ct
d0a0: 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  x) {..return NUL
d0b0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
d0c0: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c   (getenv(SSLKEYL
d0d0: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f  OGFILE)) {..SSL_
d0e0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63  CTX_set_keylog_c
d0f0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79  allback(ctx, Key
d100: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  LogCallback);.  
d110: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
d120: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
d130: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d140: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
d150: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53  if (proto == TLS
d160: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b  _PROTO_TLS1_3) {
d170: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
d180: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
d190: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
d1a0: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
d1b0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
d1c0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
d1d0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d  _VERSION);.    }
d1e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
d1f0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c  Force cipher sel
d200: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20  ection order by 
d210: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66  server */.    if
d220: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
d230: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
d240: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
d250: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
d260: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d  EFERENCE);.    }
d270: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
d280: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d290: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f  x10100000L.    O
d2a0: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61  penSSL_add_all_a
d2b0: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20  lgorithms(); /* 
d2c0: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64  Load ciphers and
d2d0: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64   digests */.#end
d2e0: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  if..    SSL_CTX_
d2f0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
d300: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29  , (void*)interp)
d310: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68  ;./* remember th
d320: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  e interpreter */
d330: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
d340: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
d350: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
d360: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
d370: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
d380: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
d390: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  (ctx, SSL_OP_NO_
d3a0: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a  COMPRESSION);./*
d3b0: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73   disable compres
d3c0: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70  sion even if sup
d3d0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53  ported */.    SS
d3e0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
d3f0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a  s(ctx, off);../*
d400: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f   disable protoco
d410: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69  l versions */.#i
d420: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
d430: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
d440: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43  01000L.    SSL_C
d450: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c  TX_set_mode(ctx,
d460: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52   SSL_MODE_AUTO_R
d470: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65  ETRY);./* handle
d480: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20   new handshakes 
d490: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f  in background. O
d4a0: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20  n by default in 
d4b0: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a  OpenSSL 1.1.1. *
d4c0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c  /.#endif.    SSL
d4d0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61  _CTX_sess_set_ca
d4e0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32  che_size(ctx, 12
d4f0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  8);..    /* Set 
d500: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70  user defined cip
d510: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69  hers, cipher sui
d520: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74  tes, and securit
d530: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
d540: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e  f ((ciphers != N
d550: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
d560: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _set_cipher_list
d570: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20  (ctx, ciphers)) 
d580: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d590: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
d5a0: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
d5b0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
d5c0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
d5d0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
d5e0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
d5f0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
d600: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65  if ((ciphersuite
d610: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
d620: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
d630: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70  rsuites(ctx, cip
d640: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54  hersuites)) {..T
d650: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d660: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
d670: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65  her suites faile
d680: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
d690: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
d6a0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
d6b0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
d6c0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
d6d0: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
d6e0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
d6f0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
d700: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
d710: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
d720: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
d730: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
d740: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
d750: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
d760: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
d770: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
d780: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
d790: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
d7a0: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
d7b0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
d7c0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
d7d0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
d7e0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
d7f0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
d800: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
d810: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
d820: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
d830: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
d840: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d850: 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65  Init(&ds);.#ifde
d860: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a  f OPENSSL_NO_DH.
d870: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
d880: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   != NULL) {..Tcl
d890: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d8a0: 74 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65  terp, "DH parame
d8b0: 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20  ter support not 
d8c0: 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61  available", (cha
d8d0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
d8e0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
d8f0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d900: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a    }.#else.    {.
d910: 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48  .DH* dh;..if (DH
d920: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
d930: 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  {..    BIO *bio;
d940: 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ...    bio = BIO
d950: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
d960: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
d970: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
d980: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
d990: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
d9a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d9b0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
d9c0: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
d9d0: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
d9e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
d9f0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
da00: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
da10: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68  ..    }...    dh
da20: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f   = PEM_read_bio_
da30: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55  DHparams(bio, NU
da40: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
da50: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
da60: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  io);..    Tcl_DS
da70: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
da80: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a  .    if (!dh) {.
da90: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
daa0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
dab0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61  d not read DH pa
dac0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69  rameters from fi
dad0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
dae0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
daf0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
db00: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
db10: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
db20: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
db30: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64  ;..    DH_free(d
db40: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h);...} else {..
db50: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20      /* Use well 
db60: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74  known DH paramet
db70: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75  ers that have bu
db80: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69  ilt-in support i
db90: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20  n OpenSSL */..  
dba0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73    if (!SSL_CTX_s
dbb0: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20  et_dh_auto(ctx, 
dbc0: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  1)) {...Tcl_Appe
dbd0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dbe0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62   "Could not enab
dbf0: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20  le set DH auto: 
dc00: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
dc10: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
dc20: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
dc30: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
dc40: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
dc50: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
dc60: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
dc70: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20  certificate */. 
dc80: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f     load_private_
dc90: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  key = 0;.    if 
dca0: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c  (certfile != NUL
dcb0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
dcc0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66  te_key = 1;...if
dcd0: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
dce0: 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63  rtificate_file(c
dcf0: 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65  tx, F2N(certfile
dd00: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
dd10: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
dd20: 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
dd30: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
dd40: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
dd50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
dd60: 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66  le to set certif
dd70: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
dd80: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
dd90: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
dda0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ddb0: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
ddc0: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
ddd0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09  eturn NULL;..}..
dde0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ddf0: 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73  &ds);..    } els
de00: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
de10: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
de20: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
de30: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
de40: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
de50: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
de60: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
de70: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
de80: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
de90: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
dea0: 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45  cate: ",...GET_E
deb0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
dec0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ded0: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
dee0: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
def0: 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20 20 7d   NULL;..}..    }
df00: 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66 69 6c   else {..certfil
df10: 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30 39 5f  e = (char*)X509_
df20: 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65 72 74  get_default_cert
df30: 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53  _file();...if (S
df40: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
df50: 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c  ficate_file(ctx,
df60: 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46   certfile, SSL_F
df70: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
df80: 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20 20 20  0) {.#if 0..    
df90: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
dfa0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
dfb0: 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20   to use default 
dfc0: 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65  certificate file
dfd0: 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a   ", certfile, ":
dfe0: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45   ",...GET_ERR_RE
dff0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e000: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
e010: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e020: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
e030: 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20  ;.#endif..}.    
e040: 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  }..    /* set ou
e050: 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f  r private key */
e060: 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72  .    if (load_pr
e070: 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66  ivate_key) {..if
e080: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
e090: 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c  L && key == NULL
e0a0: 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65  ) {..    keyfile
e0b0: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a   = certfile;..}.
e0c0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d  ..if (keyfile !=
e0d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
e0e0: 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65   get the private
e0f0: 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20   key associated 
e100: 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66  with this certif
e110: 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66  icate */..    if
e120: 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c   (keyfile == NUL
e130: 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d  L) {...keyfile =
e140: 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20   certfile;..    
e150: 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f  }...    if (SSL_
e160: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
e170: 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  ey_file(ctx, F2N
e180: 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20  (keyfile, &ds), 
e190: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
e1a0: 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f  ) <= 0) {...Tcl_
e1b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e1c0: 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65  ;.../* flush the
e1d0: 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63   passphrase whic
e1e0: 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  h might be left 
e1f0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
e200: 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
e210: 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54  (interp, NULL, T
e220: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63  CL_STATIC);...Tc
e230: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e240: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
e250: 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79  o set public key
e260: 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65   file ", keyfile
e270: 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45 54  , " ",...    GET
e280: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
e290: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e2a0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e2b0: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
e2c0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  L;..    }..    T
e2d0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e2e0: 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66  ds);...} else if
e2f0: 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b   (key != NULL) {
e300: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54  ..    if (SSL_CT
e310: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
e320: 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52  _ASN1(EVP_PKEY_R
e330: 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79  SA, ctx, key,key
e340: 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _len) <= 0) {...
e350: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
e360: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
e370: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
e380: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54  he result */...T
e390: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
e3a0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
e3b0: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70  TATIC);...Tcl_Ap
e3c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e3d0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
e3e0: 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c  t public key: ",
e3f0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
e400: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
e410: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
e420: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
e430: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d   NULL;..    }..}
e440: 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77  ../* Now we know
e450: 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20   that a key and 
e460: 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73  cert have been s
e470: 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74  et against.. * t
e480: 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  he SSL context *
e490: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f  /..if (!SSL_CTX_
e4a0: 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65  check_private_ke
e4b0: 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54  y(ctx)) {..    T
e4c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e4d0: 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65  interp, "private
e4e0: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
e4f0: 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63  tch the certific
e500: 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c  ate public key",
e510: 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a  ....     (char *
e520: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
e530: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e540: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
e550: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  L;..}.    }..   
e560: 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65 20 64   /* Set to use d
e570: 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20  efault location 
e580: 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72  and file for Cer
e590: 74 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69  tificate Authori
e5a0: 74 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63  ty (CA) certific
e5b0: 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20 20 2a  ates. The.     *
e5c0: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
e5d0: 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20 6f 76   store can be ov
e5e0: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
e5f0: 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76  SSL_CERT_DIR env
e600: 20 76 61 72 2e 20 54 68 65 20 76 65 72 69 66 79   var. The verify
e610: 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20 20 2a   file can.     *
e620: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
e630: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46  y the SSL_CERT_F
e640: 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a  ILE env var. */.
e650: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
e660: 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
e670: 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
e680: 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20  {..abort++;.    
e690: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69  }..    /* Overri
e6a0: 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76  des for the CA v
e6b0: 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66  erify path and f
e6c0: 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66  ile */.    {.#if
e6d0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
e6e0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
e6f0: 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74  0000L..if (CApat
e700: 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66  h != NULL || CAf
e710: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
e720: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
e730: 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  ds1;..    Tcl_DS
e740: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
e750: 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  ...    if (!SSL_
e760: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
e770: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46  locations(ctx, F
e780: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c  2N(CAfile, &ds),
e790: 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73   F2N(CApath, &ds
e7a0: 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  1))) {...abort++
e7b0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
e7c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e7d0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  s);..    Tcl_DSt
e7e0: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
e7f0: 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73  ..    /* Set lis
e800: 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64  t of CAs to send
e810: 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20   to client when 
e820: 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69  requesting a cli
e830: 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ent certificate 
e840: 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73  */..    /* https
e850: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  ://sourceforge.n
e860: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37  et/p/tls/bugs/57
e870: 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58  / */..    /* XXX
e880: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75  :TODO: Let the u
e890: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65  ser supply value
e8a0: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f  s here instead o
e8b0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  f something that
e8c0: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66   exists on the f
e8d0: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20  ilesystem */..  
e8e0: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f    STACK_OF(X509_
e8f0: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73  NAME) *certNames
e900: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65   = SSL_load_clie
e910: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43  nt_CA_file(F2N(C
e920: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20  Afile, &ds));.. 
e930: 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73     if (certNames
e940: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53   != NULL) {...SS
e950: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
e960: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65  _CA_list(ctx, ce
e970: 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d  rtNames);..    }
e980: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e990: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a  gFree(&ds);..}..
e9a0: 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70 61 74  #else..if (CApat
e9b0: 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  h != NULL) {..  
e9c0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c    if (!SSL_CTX_l
e9d0: 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63  oad_verify_dir(c
e9e0: 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  tx, F2N(CApath, 
e9f0: 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  &ds))) {...abort
ea00: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
ea10: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ea20: 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28 43 41  &ds);..}..if (CA
ea30: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
ea40: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
ea50: 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69  X_load_verify_fi
ea60: 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69  le(ctx, F2N(CAfi
ea70: 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61  le, &ds))) {...a
ea80: 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  bort++;..    }..
ea90: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
eaa0: 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20  ree(&ds);...    
eab0: 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43  /* Set list of C
eac0: 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c  As to send to cl
ead0: 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73  ient when reques
eae0: 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65  ting a client ce
eaf0: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
eb00: 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f    STACK_OF(X509_
eb10: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73  NAME) *certNames
eb20: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65   = SSL_load_clie
eb30: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43  nt_CA_file(F2N(C
eb40: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20  Afile, &ds));.. 
eb50: 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73     if (certNames
eb60: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53   != NULL) {...SS
eb70: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
eb80: 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65  _CA_list(ctx, ce
eb90: 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d  rtNames);..    }
eba0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
ebb0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23  gFree(&ds);..}.#
ebc0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
ebd0: 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c   return ctx;.}..
ebe0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
ebf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
ec30: 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20  StatusObjCmd -- 
ec40: 72 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61  return certifica
ec50: 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64  te for connected
ec60: 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73   peer.. *. * Res
ec70: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
ec80: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
ec90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
eca0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
ecb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
ecc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ece0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ecf0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
ed00: 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d   int.StatusObjCm
ed10: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
ed20: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
ed30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
ed40: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
ed50: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
ed60: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
ed70: 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70  Ptr;.    X509 *p
ed80: 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  eer;.    Tcl_Obj
ed90: 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63   *objPtr;.    Tc
eda0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a  l_Channel chan;.
edb0: 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65      char *channe
edc0: 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b  lName, *ciphers;
edd0: 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20  .    int mode;. 
ede0: 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65     const unsigne
edf0: 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20  d char *proto;. 
ee00: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
ee10: 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64  len;.    int nid
ee20: 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64  , res;.    (void
ee30: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
ee40: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
ee50: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
ee60: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20  bjc < 2 || objc 
ee70: 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20  > 3 || (objc == 
ee80: 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c  3 && !strcmp(Tcl
ee90: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
eea0: 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29  1]), "-local")))
eeb0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
eec0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
eed0: 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20  objv, "?-local? 
eee0: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
eef0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ef00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
ef10: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20  channel Id */.  
ef20: 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20    channelName = 
ef30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ef40: 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20  jv[(objc == 2 ? 
ef50: 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68  1 : 2)]);.    ch
ef60: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
ef70: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  nel(interp, chan
ef80: 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b  nelName, &mode);
ef90: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
efa0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
efb0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
efc0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
efd0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
efe0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
eff0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
f000: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
f010: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
f020: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69  nel(chan);.    i
f030: 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  f (Tcl_GetChanne
f040: 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54  lType(chan) != T
f050: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
f060: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f070: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
f080: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
f090: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
f0a0: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
f0b0: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
f0c0: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  el", (char *) NU
f0d0: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
f0e0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
f0f0: 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20  TLS", "STATUS", 
f100: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
f110: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
f120: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
f130: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
f140: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
f150: 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43  tate *) Tcl_GetC
f160: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
f170: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f  ta(chan);..    /
f180: 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74  * Get certificat
f190: 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65  e for peer or se
f1a0: 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  lf */.    if (ob
f1b0: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72  jc == 2) {..peer
f1c0: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
f1d0: 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
f1e0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
f1f0: 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d  } else {..peer =
f200: 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69   SSL_get_certifi
f210: 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  cate(statePtr->s
f220: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
f230: 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74  /* Get X509 cert
f240: 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a  ificate info */.
f250: 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
f260: 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
f270: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
f280: 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
f290: 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58  c == 2) {..    X
f2a0: 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a  509_free(peer);.
f2b0: 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c  .    peer = NULL
f2c0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
f2d0: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
f2e0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
f2f0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
f300: 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a  /* Peer name */.
f310: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
f320: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
f330: 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  "peername", SSL_
f340: 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
f350: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
f360: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
f370: 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
f380: 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f  r, "sbits", SSL_
f390: 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
f3a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
f3b0: 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  ULL));..    ciph
f3c0: 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
f3d0: 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
f3e0: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
f3f0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
f400: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
f410: 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d  her", ciphers, -
f420: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  1);..    /* Veri
f430: 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74  fy the X509 cert
f440: 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65  ificate presente
f450: 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f  d by the peer */
f460: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
f470: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f480: 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c   "verifyResult",
f490: 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  ..X509_verify_ce
f4a0: 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
f4b0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
f4c0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
f4d0: 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  ssl)), -1);..   
f4e0: 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
f4f0: 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
f500: 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
f510: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
f520: 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
f530: 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  & SSL_VERIFY_NON
f540: 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  E) {..LAPPEND_ST
f550: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
f560: 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
f570: 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
f580: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
f590: 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d  bj *listObjPtr =
f5a0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
f5b0: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d  0, NULL);..if (m
f5c0: 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
f5d0: 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54  Y_PEER) {..    T
f5e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f5f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f600: 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
f610: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65  NewStringObj("pe
f620: 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  er", -1));..}..i
f630: 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
f640: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
f650: 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20  _PEER_CERT) {.. 
f660: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f670: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f680: 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
f690: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f6a0: 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65  ("fail if no pee
f6b0: 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09  r cert", -1));..
f6c0: 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
f6d0: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
f6e0: 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63  _ONCE) {..    Tc
f6f0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
f700: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
f710: 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
f720: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69  ewStringObj("cli
f730: 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b  ent once", -1));
f740: 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
f750: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
f760: 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20  _HANDSHAKE) {.. 
f770: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f780: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
f790: 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
f7a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
f7b0: 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65  ("post handshake
f7c0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50  ", -1));..}..LAP
f7d0: 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
f7e0: 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
f7f0: 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74  Mode", listObjPt
f800: 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r).    }..    /*
f810: 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70   Verify mode dep
f820: 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  th */.    LAPPEN
f830: 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
f840: 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70  jPtr, "verifyDep
f850: 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  th", SSL_get_ver
f860: 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50  ify_depth(stateP
f870: 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20  tr->ssl));..    
f880: 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
f890: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
f8a0: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
f8b0: 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  he negotiation *
f8c0: 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61  /.    SSL_get0_a
f8d0: 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
f8e0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
f8f0: 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c  to, &len);.    L
f900: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
f910: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e  p, objPtr, "alpn
f920: 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  ", (char *)proto
f930: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
f940: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
f950: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
f960: 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53  r, "protocol", S
f970: 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
f980: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
f990: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69  1);..    /* Vali
f9a0: 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69  d for non-RSA si
f9b0: 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20  gnature and TLS 
f9c0: 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  1.3 */.    if (o
f9d0: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73  bjc == 2) {..res
f9e0: 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
f9f0: 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
fa00: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
fa10: 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
fa20: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
fa30: 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
fa40: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
fa50: 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
fa60: 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
fa70: 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
fa80: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
fa90: 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73  r, "signatureHas
faa0: 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a  hAlgorithm", OBJ
fab0: 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
fac0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
fad0: 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20   == 2) {..res = 
fae0: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67  SSL_get_peer_sig
faf0: 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
fb00: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
fb10: 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  nid);.    } else
fb20: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
fb30: 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65  t_signature_type
fb40: 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
fb50: 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
fb60: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
fb70: 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41  nid = 0;}.    LA
fb80: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
fb90: 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61  , objPtr, "signa
fba0: 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e  tureType", OBJ_n
fbb0: 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
fbc0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
fbd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
fbe0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
fbf0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
fc00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
fc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
fc50: 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
fc60: 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
fc70: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
fc80: 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
fc90: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
fca0: 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
fcb0: 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
fcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd00: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
fd10: 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
fd20: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
fd30: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
fd40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
fd50: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
fd60: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
fd70: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
fd80: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
fd90: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
fda0: 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20   a mode on */.  
fdb0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
fdc0: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
fdd0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
fde0: 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  et */.    Tcl_Ob
fdf0: 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74  j *objPtr, *list
fe00: 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  Ptr;.    const S
fe10: 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e  SL *ssl;.    con
fe20: 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
fe30: 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ipher;.    const
fe40: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65   SSL_SESSION *se
fe50: 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  ssion;.    const
fe60: 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20   EVP_MD *md;.   
fe70: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
fe80: 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ta;..    if (obj
fe90: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
fea0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
feb0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
fec0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
fed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fee0: 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
fef0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
ff00: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ff10: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
ff20: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
ff30: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
ff40: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
ff50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
ff60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
ff70: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
ff80: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
ff90: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
ffa0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
ffb0: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
ffc0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
ffd0: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
ffe0: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
fff0: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
10000 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10010 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
10020 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
10030 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20  lName(chan),..  
10040 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53    "\": not a TLS
10050 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
10060 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f   *) NULL);..Tcl_
10070 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
10080 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
10090 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
100a0 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
100b0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
100c0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
100d0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  R;.    }..    ob
100e0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
100f0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
10100 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
10110 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
10120 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
10130 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
10140 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
10150 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
10160 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
10170 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
10180 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  L) {../* connect
10190 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41  ion state */..LA
101a0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
101b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65  , objPtr, "state
101c0 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  ", SSL_state_str
101d0 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
101e0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49  1);.../* Get SNI
101f0 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65   requested serve
10200 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
10210 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10220 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61  bjPtr, "serverna
10230 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72  me", SSL_get_ser
10240 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
10250 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
10260 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09  t_name), -1);...
10270 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20  /* Get protocol 
10280 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
10290 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
102a0 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f  "protocol", SSL_
102b0 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29  get_version(ssl)
102c0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65  , -1);.../* Rene
102d0 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65  gotiation allowe
102e0 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  d */..LAPPEND_BO
102f0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
10300 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f  r, "renegotiatio
10310 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f  n_allowed", SSL_
10320 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67  get_secure_reneg
10330 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74  otiation_support
10340 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a  ((SSL *) ssl));.
10350 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74  ../* Get securit
10360 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50  y level */..LAPP
10370 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
10380 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74  objPtr, "securit
10390 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65  y_level", SSL_ge
103a0 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
103b0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  (ssl));.../* Ses
103c0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  sion info */..LA
103d0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
103e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
103f0 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c  ion_reused", SSL
10400 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28  _session_reused(
10410 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73  ssl));.../* Is s
10420 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c  erver info */..L
10430 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
10440 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
10450 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f  server", SSL_is_
10460 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09  server(ssl));...
10470 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c  /* Is DTLS */..L
10480 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
10490 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
104a0 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74  dtls", SSL_is_dt
104b0 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a  ls(ssl));.    }.
104c0 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69  .    /* Cipher i
104d0 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65  nfo */.    ciphe
104e0 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  r = SSL_get_curr
104f0 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b  ent_cipher(ssl);
10500 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20  .    if (cipher 
10510 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  != NULL) {..char
10520 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b   buf[BUFSIZ] = {
10530 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61  0};..int bits, a
10540 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69  lg_bits;.../* Ci
10550 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  pher name */..LA
10560 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10570 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
10580 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  r", SSL_CIPHER_g
10590 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  et_name(cipher),
105a0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e   -1);.../* RFC n
105b0 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f  ame of cipher */
105c0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
105d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
105e0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53  tandard_name", S
105f0 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
10600 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  rd_name(cipher),
10610 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53   -1);.../* OpenS
10620 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  SL name of ciphe
10630 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
10640 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10650 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22  , "openssl_name"
10660 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72  , OPENSSL_cipher
10670 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52  _name(SSL_CIPHER
10680 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
10690 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09  ipher)), -1);...
106a0 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  /* number of sec
106b0 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f  ret bits used fo
106c0 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74  r cipher */..bit
106d0 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  s = SSL_CIPHER_g
106e0 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20  et_bits(cipher, 
106f0 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50  &alg_bits);..LAP
10700 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
10710 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74   objPtr, "secret
10720 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09  _bits", bits);..
10730 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10740 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67  rp, objPtr, "alg
10750 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c  orithm_bits", al
10760 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67  g_bits);../* alg
10770 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20  _bits is actual 
10780 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e  key secret bits.
10790 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64   If use bits and
107a0 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74   secret (algorit
107b0 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c  hm) bits differ,
107c0 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66  ..   the rest of
107d0 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69   the bits are fi
107e0 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69  xed, i.e. for li
107f0 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70  mited export cip
10800 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29  hers (bits < 56)
10810 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74   */.../* Indicat
10820 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53  es which SSL/TLS
10830 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
10840 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  n first defined 
10850 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  the cipher */..L
10860 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10870 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f  p, objPtr, "min_
10880 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49  version", SSL_CI
10890 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e  PHER_get_version
108a0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
108b0 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 2c 20  ./* Cipher NID, 
108c0 64 69 67 65 73 74 20 4e 49 44 20 28 6e 6f 6e 65  digest NID (none
108d0 20 66 6f 72 20 41 45 41 44 20 63 69 70 68 65 72   for AEAD cipher
108e0 20 73 75 69 74 65 73 29 2c 20 4b 65 79 20 45 78   suites), Key Ex
108f0 63 68 61 6e 67 65 20 4e 49 44 2c 20 61 6e 64 20  change NID, and 
10900 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 4e  authentication N
10910 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  ID */..LAPPEND_S
10920 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10930 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20  r, "cipherNID", 
10940 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
10950 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
10960 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70  t_cipher_nid(cip
10970 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
10980 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10990 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74   objPtr, "digest
109a0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
109b0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
109c0 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e  HER_get_digest_n
109d0 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
109e0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
109f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10a00 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c  keyExchangeNID",
10a10 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
10a20 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
10a30 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72  et_kx_nid(cipher
10a40 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
10a50 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10a60 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63  jPtr, "authentic
10a70 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72  ationNID", (char
10a80 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
10a90 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74  L_CIPHER_get_aut
10aa0 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  h_nid(cipher)), 
10ab0 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67  -1);.../* messag
10ac0 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e authentication
10ad0 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69   code - Cipher i
10ae0 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d  s AEAD (e.g. GCM
10af0 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c   or ChaCha20/Pol
10b00 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f  y1305) or not */
10b10 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74  ../* Authenticat
10b20 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69  ed Encryption wi
10b30 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  th associated da
10b40 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b 20  ta (AEAD) check 
10b50 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
10b60 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10b70 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64   "cipher_is_aead
10b80 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73  ", SSL_CIPHER_is
10b90 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a  _aead(cipher));.
10ba0 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c  ../* Get OpenSSL
10bb0 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f  -specific ID, no
10bc0 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41  t IANA ID */..LA
10bd0 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
10be0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
10bf0 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  r_id", (int) SSL
10c00 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
10c10 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77  ipher));.../* Tw
10c20 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69  o-byte ID used i
10c30 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63  n the TLS protoc
10c40 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ol of the given 
10c50 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
10c60 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
10c70 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
10c80 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
10c90 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f  CIPHER_get_proto
10ca0 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b  col_id(cipher));
10cb0 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65  .../* Textual de
10cc0 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
10cd0 20 63 69 70 68 65 72 2e 20 49 6e 63 6c 75 64 65   cipher. Include
10ce0 73 3a 20 63 69 70 68 65 72 20 6e 61 6d 65 2c 20  s: cipher name, 
10cf0 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
10d00 2c 20 6b 65 79 0a 09 20 20 20 65 78 63 68 61 6e  , key..   exchan
10d10 67 65 2c 20 61 75 74 68 65 6e 74 69 63 61 74 69  ge, authenticati
10d20 6f 6e 2c 20 73 79 6d 6d 65 74 72 69 63 20 65 6e  on, symmetric en
10d30 63 72 79 70 74 69 6f 6e 20 6d 65 74 68 6f 64 2c  cryption method,
10d40 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
10d50 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a  ication code */.
10d60 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f  .if (SSL_CIPHER_
10d70 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68  description(ciph
10d80 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  er, buf, sizeof(
10d90 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
10da0 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ..    LAPPEND_ST
10db0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10dc0 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c  , "description",
10dd0 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 0a 09   buf, -1);..}...
10de0 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64  /* Digest used d
10df0 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c  uring the SSL/TL
10e00 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e  S handshake when
10e10 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65   using the ciphe
10e20 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f  r. */..md = SSL_
10e30 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73  CIPHER_get_hands
10e40 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68  hake_digest(ciph
10e50 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  er);..LAPPEND_ST
10e60 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10e70 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  , "handshake_dig
10e80 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56  est", (char *)EV
10e90 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d  P_MD_name(md), -
10ea0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
10eb0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
10ec0 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20  /.    session = 
10ed0 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
10ee0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65  ssl);.    if (se
10ef0 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  ssion != NULL) {
10f00 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
10f10 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09   char *ticket;..
10f20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e  size_t len2;..un
10f30 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
10f40 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
10f50 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
10f60 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69  d, *proto;..unsi
10f70 67 6e 65 64 20 63 68 61 72 20 62 75 66 66 65 72  gned char buffer
10f80 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f  [SSL_MAX_MASTER_
10f90 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f  KEY_LENGTH];.../
10fa0 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
10fb0 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
10fc0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
10fd0 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69  e ALPN negotiati
10fe0 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  on */..SSL_SESSI
10ff0 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  ON_get0_alpn_sel
11000 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26  ected(session, &
11010 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09  proto, &len2);..
11020 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70  rp, objPtr, "alp
11040 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f  n", (char *) pro
11050 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  to, (Tcl_Size) l
11060 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  en2);.../* Repor
11070 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
11080 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
11090 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e  ult of the NPN n
110a0 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69  egotiation */.#i
110b0 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53  fdef USE_NPN..SS
110c0 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74  L_get0_next_prot
110d0 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c  o_negotiated(ssl
110e0 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29  , &proto, &ulen)
110f0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11100 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11110 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  npn", (char *) p
11120 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
11130 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a   ulen);.#endif..
11140 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65  ./* Resumable se
11150 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e  ssion */..LAPPEN
11160 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
11170 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c  bjPtr, "resumabl
11180 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
11190 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73  is_resumable(ses
111a0 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  sion));.../* Ses
111b0 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20  sion start time 
111c0 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65  (seconds since e
111d0 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e  poch) */..LAPPEN
111e0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f  D_LONG(interp, o
111f0 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69  bjPtr, "start_ti
11200 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  me", SSL_SESSION
11210 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f  _get_time(sessio
11220 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75  n));.../* Timeou
11230 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54  t value - SSL_CT
11240 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69  X_get_timeout (i
11250 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c  n seconds) */..L
11260 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
11270 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d  rp, objPtr, "tim
11280 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49  eout", SSL_SESSI
11290 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73  ON_get_timeout(s
112a0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
112b0 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76  ession id - TLSv
112c0 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e  1.2 and below on
112d0 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69  ly */..session_i
112e0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
112f0 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
11300 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
11310 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
11320 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
11330 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  _id", session_id
11340 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
11350 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
11360 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73   context */..ses
11370 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
11380 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f  SSION_get0_id_co
11390 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26  ntext(session, &
113a0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
113b0 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
113c0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
113d0 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f  context", sessio
113e0 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29  n_id, (Tcl_Size)
113f0 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73   ulen);.../* Ses
11400 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c  sion ticket - cl
11410 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53  ient only */..SS
11420 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74  L_SESSION_get0_t
11430 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26  icket(session, &
11440 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
11450 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
11460 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11470 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22  "session_ticket"
11480 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53  , ticket, (Tcl_S
11490 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
114a0 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
114b0 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69  lifetime hint (i
114c0 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c  n seconds) */..L
114d0 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
114e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66  rp, objPtr, "lif
114f0 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53  etime", SSL_SESS
11500 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
11510 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
11520 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63  sion));.../* Tic
11530 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a  ket app data */.
11540 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
11550 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
11560 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45  0000000L..SSL_SE
11570 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
11580 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c 5f 53  t_appdata((SSL_S
11590 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f  ESSION *) sessio
115a0 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
115b0 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  2);..LAPPEND_BAR
115c0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
115d0 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f  tr, "ticket_app_
115e0 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28  data", ticket, (
115f0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
11600 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74  .#endif.../* Get
11610 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09   master key */..
11620 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49  len2 = SSL_SESSI
11630 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65  ON_get_master_ke
11640 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65  y(session, buffe
11650 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  r, SSL_MAX_MASTE
11660 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09  R_KEY_LENGTH);..
11670 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
11680 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11690 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66  master_key", buf
116a0 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  fer, (Tcl_Size) 
116b0 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70  len2);.../* Comp
116c0 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75  ression id */..u
116d0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d  nsigned int id =
116e0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
116f0 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73  _compress_id(ses
11700 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  sion);..LAPPEND_
11710 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11720 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
11730 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20  _id", id == 1 ? 
11740 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c  "zlib" : "none",
11750 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
11760 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20   /* Compression 
11770 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
11780 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23  ssl != NULL) {.#
11790 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43  ifdef HAVE_SSL_C
117a0 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73  OMPRESSION..cons
117b0 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63  t COMP_METHOD *c
117c0 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d  omp, *expn;..com
117d0 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  p = SSL_get_curr
117e0 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28  ent_compression(
117f0 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53  ssl);..expn = SS
11800 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78  L_get_current_ex
11810 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09  pansion(ssl);...
11820 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11830 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d  rp, objPtr, "com
11840 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20  pression", comp 
11850 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  ? SSL_COMP_get_n
11860 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e  ame(comp) : "non
11870 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
11880 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11890 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
118a0 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f  ", expn ? SSL_CO
118b0 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e  MP_get_name(expn
118c0 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  ) : "none", -1);
118d0 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f  .#else..LAPPEND_
118e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
118f0 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
11900 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
11910 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11920 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
11930 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  pansion", "none"
11940 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
11950 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76    }..    /* Serv
11960 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b  er info */.    {
11970 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53  ..long mode = SS
11980 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f  L_CTX_get_sessio
11990 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
119a0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68  tePtr->ctx);..ch
119b0 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d  ar *msg;...if (m
119c0 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
119d0 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20  ACHE_OFF) {..   
119e0 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d   msg = "off";..}
119f0 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
11a00 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
11a10 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d  CLIENT) {..    m
11a20 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09  sg = "client";..
11a30 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
11a40 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
11a50 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20  _SERVER) {..    
11a60 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a  msg = "server";.
11a70 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
11a80 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
11a90 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d  E_BOTH) {..    m
11aa0 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20  sg = "both";..} 
11ab0 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20  else {..    msg 
11ac0 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a  = "unknown";..}.
11ad0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11ae0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11af0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
11b00 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  ", msg, -1);.   
11b10 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69   }..    /* CA Li
11b20 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20  st */.    /* IF 
11b30 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61  not a server, sa
11b40 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70  me as SSL_get0_p
11b50 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20  eer_CA_list. If 
11b60 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53  server same as S
11b70 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e  SL_CTX_get_clien
11b80 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20  t_CA_list */.   
11b90 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e   listPtr = Tcl_N
11ba0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
11bb0 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46  L);.    STACK_OF
11bc0 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f  (X509_NAME) *ca_
11bd0 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63  list;.    if ((c
11be0 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74  a_list = SSL_get
11bf0 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
11c00 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ssl)) != NULL) {
11c10 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55  ..char buffer[BU
11c20 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72 20 28 69 6e  FSIZ];...for (in
11c30 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f  t i = 0; i < sk_
11c40 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61  X509_NAME_num(ca
11c50 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09  _list); i++) {..
11c60 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e      X509_NAME *n
11c70 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41  ame = sk_X509_NA
11c80 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74  ME_value(ca_list
11c90 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e  , i);..    if (n
11ca0 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41  ame) {...X509_NA
11cb0 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c  ME_oneline(name,
11cc0 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29   buffer, BUFSIZ)
11cd0 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
11ce0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11cf0 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63  erp, listPtr, Tc
11d00 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62  l_NewStringObj(b
11d10 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20  uffer, -1));..  
11d20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20    }..}.    }.   
11d30 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74   LAPPEND_OBJ(int
11d40 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
11d50 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b  List", listPtr);
11d60 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
11d70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11d80 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20   "caListCount", 
11d90 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d  sk_X509_NAME_num
11da0 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 0a 20 20  (ca_list));...  
11db0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11dc0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
11dd0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
11de0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
11df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e30 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
11e40 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
11e50 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
11e60 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
11e70 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
11e80 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
11e90 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
11ea0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
11eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ee0 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
11ef0 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43  int.MiscObjCmd(C
11f00 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
11f10 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
11f20 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
11f30 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
11f40 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
11f50 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
11f60 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
11f70 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
11f80 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
11f90 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
11fa0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
11fb0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
11fc0 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20  Tcl_Size cmd;.  
11fd0 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20    int isStr;.   
11fe0 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
11ff0 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  84];.    (void) 
12000 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
12010 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12020 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
12030 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
12040 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12050 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62  p, 1, objv, "sub
12060 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29  command ?args?")
12070 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
12080 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
12090 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
120a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
120b0 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73  bjv[1], commands
120c0 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20  , "command", 0, 
120d0 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  &cmd) != TCL_OK)
120e0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
120f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
12100 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
12110 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d  ();..    isStr =
12120 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45   (cmd == C_STRRE
12130 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  Q);.    switch (
12140 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63  (enum command) c
12150 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45  md) {..case C_RE
12160 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45  Q:..case C_STRRE
12170 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b  Q: {..    EVP_PK
12180 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09  EY *pkey=NULL;..
12190 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e      X509 *cert=N
121a0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e  ULL;..    X509_N
121b0 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a  AME *name=NULL;.
121c0 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  .    Tcl_Obj **l
121d0 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53  istv;..    Tcl_S
121e0 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20  ize listc;..    
121f0 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f  int i;...    BIO
12200 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
12210 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a    char *k_C="",*
12220 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c  k_ST="",*k_L="",
12230 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22  *k_O="",*k_OU=""
12240 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61  ,*k_CN="",*k_Ema
12250 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72  il="";..    char
12260 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74   *keyout,*pemout
12270 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20  ,*str;..    int 
12280 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30  keysize,serial=0
12290 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20  ,days=365;..#if 
122a0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
122b0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
122c0 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d  000L..    BIGNUM
122d0 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20   *bne = NULL;.. 
122e0 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55     RSA *rsa = NU
122f0 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45  LL;.#else..    E
12300 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78  VP_PKEY_CTX *ctx
12310 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
12320 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c  ..    if ((objc<
12330 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20  5) || (objc>6)) 
12340 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {...Tcl_WrongNum
12350 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
12360 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b  objv, "keysize k
12370 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20  eyfile certfile 
12380 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75  ?info?");...retu
12390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
123a0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54     }...    if (T
123b0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
123c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
123d0 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54  , &keysize) != T
123e0 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
123f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
12400 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d    }..    keyout=
12410 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12420 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d  jv[3]);..    pem
12430 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
12440 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20  g(objv[4]);..   
12450 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09   if (isStr) {...
12460 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
12470 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,keyout,"",0);.
12480 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
12490 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29  erp,pemout,"",0)
124a0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
124b0 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09  f (objc>=6) {...
124c0 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
124d0 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
124e0 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73  p, objv[5], &lis
124f0 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54  tc, &listv) != T
12500 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72  CL_OK) {...    r
12510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12520 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73  ...}....if ((lis
12530 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09  tc%2) != 0) {...
12540 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
12550 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d  t(interp,"Inform
12560 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20  ation list must 
12570 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72  have even number
12580 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e   of arguments",N
12590 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
125a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
125b0 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  }...for (i=0; i<
125c0 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09  listc; i+=2) {..
125d0 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74  .    str=Tcl_Get
125e0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29  String(listv[i])
125f0 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ;...    if (strc
12600 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d  mp(str,"days")==
12610 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
12620 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
12630 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
12640 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a  &days)!=TCL_OK).
12650 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
12660 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
12670 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
12680 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d  (str,"serial")==
12690 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
126a0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
126b0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
126c0 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b  &serial)!=TCL_OK
126d0 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
126e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
126f0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
12700 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20  mp(str,"C")==0) 
12710 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74  {....k_C=Tcl_Get
12720 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12730 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12740 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12750 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "ST")==0) {....k
12760 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _ST=Tcl_GetStrin
12770 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
12780 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12790 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d  strcmp(str,"L")=
127a0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c  =0) {....k_L=Tcl
127b0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
127c0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
127d0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
127e0 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09  str,"O")==0) {..
127f0 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_O=Tcl_GetStr
12800 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
12810 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
12820 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55   (strcmp(str,"OU
12830 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55  ")==0) {....k_OU
12840 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
12850 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
12860 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
12870 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30  cmp(str,"CN")==0
12880 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f  ) {....k_CN=Tcl_
12890 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
128a0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
128b0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
128c0 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20  tr,"Email")==0) 
128d0 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c  {....k_Email=Tcl
128e0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
128f0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
12900 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65  else {....Tcl_Se
12910 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
12920 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65  Unknown paramete
12930 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74  r",NULL);....ret
12940 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
12950 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
12960 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
12970 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
12980 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
12990 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b   bne = BN_new();
129a0 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f  ..    rsa = RSA_
129b0 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79  new();..    pkey
129c0 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28   = EVP_PKEY_new(
129d0 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20  );..    if (bne 
129e0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d  == NULL || rsa =
129f0 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d  = NULL || pkey =
12a00 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65  = NULL || !BN_se
12a10 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46  t_word(bne,RSA_F
12a20 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e  4) ||...!RSA_gen
12a30 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61  erate_key_ex(rsa
12a40 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20  , keysize, bne, 
12a50 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b  NULL) || !EVP_PK
12a60 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b  EY_assign_RSA(pk
12a70 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56  ey, rsa)) {...EV
12a80 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
12a90 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65  );.../* RSA_free
12aa0 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20  (rsa); freed by 
12ab0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f  EVP_PKEY_free */
12ac0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
12ad0 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79  .#else..    pkey
12ae0 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28   = EVP_RSA_gen((
12af0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65  unsigned int) ke
12b00 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78  ysize);..    ctx
12b10 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
12b20 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a  new(pkey,NULL);.
12b30 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d  .    if (pkey ==
12b40 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20   NULL || ctx == 
12b50 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45  NULL || !EVP_PKE
12b60 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74  Y_keygen_init(ct
12b70 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45  x) ||...!EVP_PKE
12b80 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65  Y_CTX_set_rsa_ke
12b90 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b  ygen_bits(ctx, k
12ba0 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f  eysize) || !EVP_
12bb0 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c  PKEY_keygen(ctx,
12bc0 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50   &pkey)) {...EVP
12bd0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
12be0 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58  ;...EVP_PKEY_CTX
12bf0 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64  _free(ctx);.#end
12c00 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  if...Tcl_SetResu
12c10 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
12c20 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
12c30 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
12c40 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12c50 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
12c60 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  {...if (isStr) {
12c70 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
12c80 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
12c90 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
12ca0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
12cb0 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
12cc0 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
12cd0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
12ce0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
12cf0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
12d00 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
12d10 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
12d20 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
12d30 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
12d40 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66  terp,keyout,buff
12d50 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
12d60 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
12d70 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
12d80 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
12d90 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
12da0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
12db0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
12dc0 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75  lename(out,keyou
12dd0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
12de0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
12df0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
12e00 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
12e10 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d  L);...    /* PEM
12e20 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72  _write_bio_RSAPr
12e30 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73  ivateKey(out, rs
12e40 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  a, NULL, NULL, 0
12e50 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a  , NULL, NULL); *
12e60 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  /...    BIO_free
12e70 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a  _all(out);.. .}.
12e80 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30  ...if ((cert=X50
12e90 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20  9_new())==NULL) 
12ea0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
12eb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
12ec0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ror generating c
12ed0 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65  ertificate reque
12ee0 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  st",NULL);...   
12ef0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
12f00 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
12f10 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
12f20 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
12f30 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
12f40 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
12f50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12f60 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
12f70 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
12f80 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
12f90 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
12fa0 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
12fb0 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
12fc0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
12fd0 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
12fe0 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
12ff0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
13000 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
13010 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
13020 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35  0*24*days);...X5
13030 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65  09_set_pubkey(ce
13040 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d  rt,pkey);....nam
13050 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
13060 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
13070 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13080 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13090 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
130a0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
130b0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
130c0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
130d0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
130e0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
130f0 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
13100 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
13110 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54  ned char *) k_ST
13120 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13130 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13140 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13150 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
13160 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
13170 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20  ed char *) k_L, 
13180 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
13190 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
131a0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
131b0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
131c0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
131d0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31   char *) k_O, -1
131e0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
131f0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
13200 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
13210 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
13220 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
13230 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
13240 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
13250 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
13260 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
13270 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
13280 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
13290 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31  char *) k_CN, -1
132a0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
132b0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
132c0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
132d0 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
132e0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
132f0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61  ed char *) k_Ema
13300 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  il, -1, -1, 0);.
13310 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a  ...X509_set_subj
13320 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61  ect_name(cert,na
13330 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30  me);....if (!X50
13340 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79  9_sign(cert,pkey
13350 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20  ,EVP_sha256())) 
13360 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65  {...    X509_fre
13370 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45  e(cert);...    E
13380 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
13390 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
133a0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
133b0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
133c0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
133d0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63  .#endif...    Tc
133e0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
133f0 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
13400 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
13410 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
13420 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13430 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20  }....if (isStr) 
13440 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
13450 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
13460 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13470 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
13480 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ert);...    i=BI
13490 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
134a0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
134b0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
134c0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
134d0 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
134e0 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
134f0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
13500 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
13510 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
13520 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
13530 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
13540 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
13550 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
13560 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
13570 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
13580 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  pemout);...    P
13590 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
135a0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
135b0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
135c0 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  out);...}....X50
135d0 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
135e0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
135f0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
13600 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
13610 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
13620 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
13630 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ndif..    }..}..
13640 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
13650 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  lt:..break;.    
13660 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
13670 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  _OK;.}.../******
13680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
13690 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20  /* Init         
136a0 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
136b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
136c0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
136d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
13710 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
13720 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
13730 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
13740 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
13750 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
13760 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
13770 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
13780 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
13790 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
137a0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
137b0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
137c0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
137d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13810 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
13820 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65  Tls_Free(tls_fre
13830 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72  e_type *blockPtr
13840 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
13850 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
13860 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20   *)blockPtr;..  
13870 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
13880 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c  d");..    Tls_Cl
13890 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ean(statePtr);. 
138a0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50     ckfree(blockP
138b0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
138c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13900 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61  -. *. * Tls_Clea
13910 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
13920 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
13930 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
13940 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
13950 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
13960 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
13970 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
13980 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68  elow 1.  This sh
13990 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65  ould. *.be calle
139a0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20  d synchronously 
139b0 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63  by the CloseProc
139c0 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09  , not in the. *.
139d0 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63  EventuallyFree c
139e0 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
139f0 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
13a00 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
13a10 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
13a20 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
13a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a70 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  ---. */.void Tls
13a80 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74  _Clean(State *st
13a90 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70  atePtr) {.    dp
13aa0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
13ab0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
13ac0 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68  we're assuming h
13ad0 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73  ere that we're s
13ae0 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20  ingle-threaded. 
13af0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73      */.    if (s
13b00 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21  tatePtr->timer !
13b10 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65  = (Tcl_TimerToke
13b20 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  n) NULL) {..Tcl_
13b30 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c  DeleteTimerHandl
13b40 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d  er(statePtr->tim
13b50 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  er);..statePtr->
13b60 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  timer = NULL;.  
13b70 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
13b80 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b  tePtr->protos) {
13b90 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74  ..ckfree(statePt
13ba0 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61  r->protos);..sta
13bb0 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
13bc0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
13bd0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69  if (statePtr->bi
13be0 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69  o) {../* This wi
13bf0 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74  ll call SSL_shut
13c00 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34  down. Bug 141404
13c10 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42  5 */..dprintf("B
13c20 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22  IO_free_all(%p)"
13c30 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  , statePtr->bio)
13c40 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28  ;..BIO_free_all(
13c50 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
13c60 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d  .statePtr->bio =
13c70 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
13c80 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
13c90 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  sl) {..dprintf("
13ca0 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73  SSL_free(%p)", s
13cb0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
13cc0 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74  SSL_free(statePt
13cd0 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50  r->ssl);..stateP
13ce0 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  tr->ssl = NULL;.
13cf0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
13d00 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09  atePtr->ctx) {..
13d10 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61  SSL_CTX_free(sta
13d20 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74  tePtr->ctx);..st
13d30 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55  atePtr->ctx = NU
13d40 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
13d50 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
13d60 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63  back) {..Tcl_Dec
13d70 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
13d80 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09  tr->callback);..
13d90 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
13da0 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  ck = NULL;.    }
13db0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
13dc0 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  r->password) {..
13dd0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13de0 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
13df0 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ord);..statePtr-
13e00 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c  >password = NULL
13e10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
13e20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20  statePtr->vcmd) 
13e30 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
13e40 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63  unt(statePtr->vc
13e50 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  md);..statePtr->
13e60 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  vcmd = NULL;.   
13e70 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
13e80 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a  "Returning");.}.
13e90 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13eb0 2d 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 0a 20 2a  -------------. *
13ee0 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43  . * Build Info C
13ef0 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ommand --. *. *.
13f00 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
13f10 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69  o return build i
13f20 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e  nfo for package.
13f30 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
13f40 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
13f50 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53  l result. *. * S
13f60 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
13f70 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e  Created build-in
13f80 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20  fo command.. *. 
13f90 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66  -------. */..#if
13fe0 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23  ndef STRINGIFY.#
13ff0 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49    define STRINGI
14000 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31  FY(x) STRINGIFY1
14010 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54  (x).#  define ST
14020 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23  RINGIFY1(x) #x.#
14030 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64  endif..int.Build
14040 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f  InfoCommand(Tcl_
14050 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20  Interp* interp) 
14060 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66  {.    Tcl_CmdInf
14070 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20  o info;..    if 
14080 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  (Tcl_GetCommandI
14090 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  nfo(interp, "::t
140a0 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c  cl::build-info",
140b0 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f   &info)) {..Tcl_
140c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
140d0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
140e0 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e  :build-info", in
140f0 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69  fo.objProc, (voi
14100 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f  d *)(...PACKAGE_
14110 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49  VERSION "+" STRI
14120 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f  NGIFY(TLS_VERSIO
14130 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66 69  N_UUID).#if defi
14140 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26  ned(__clang__) &
14150 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e  & defined(__clan
14160 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20  g_major__)....  
14170 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49    ".clang-" STRI
14180 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61  NGIFY(__clang_ma
14190 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61  jor__).#if __cla
141a0 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a  ng_minor__ < 10.
141b0 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69  ...    "0".#endi
141c0 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49  f....    STRINGI
141d0 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72  FY(__clang_minor
141e0 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  __).#endif.#if d
141f0 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c  efined(__cpluspl
14200 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  us) && !defined(
14210 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20  __OBJC__)....   
14220 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65   ".cplusplus".#e
14230 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45  ndif.#ifndef NDE
14240 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62  BUG....    ".deb
14250 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ug".#endif.#if !
14260 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f  defined(__clang_
14270 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
14280 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
14290 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e   && defined(__GN
142a0 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67  UC__)....    ".g
142b0 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
142c0 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47  _GNUC__).#if __G
142d0 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30  NUC_MINOR__ < 10
142e0 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64  ....    "0".#end
142f0 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47  if....    STRING
14300 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52  IFY(__GNUC_MINOR
14310 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  __).#endif.#ifde
14320 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  f __INTEL_COMPIL
14330 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d  ER....    ".icc-
14340 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e  " STRINGIFY(__IN
14350 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65  TEL_COMPILER).#e
14360 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f  ndif.#ifdef TCL_
14370 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20  MEM_DEBUG....   
14380 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e   ".memdebug".#en
14390 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
143a0 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20  _MSC_VER)....   
143b0 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47   ".msvc-" STRING
143c0 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65  IFY(_MSC_VER).#e
143d0 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f  ndif.#ifdef USE_
143e0 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e  NMAKE....    ".n
143f0 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66  make".#endif.#if
14400 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54  ndef TCL_CFG_OPT
14410 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e  IMIZED....    ".
14420 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e  no-optimize".#en
14430 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a  dif.#ifdef __OBJ
14440 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a  C__....    ".obj
14450 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65  ective-c".#if de
14460 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75  fined(__cplusplu
14470 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70  s)....    "plusp
14480 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64  lus".#endif.#end
14490 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46  if.#ifdef TCL_CF
144a0 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20  G_PROFILED....  
144b0 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e    ".profile".#en
144c0 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 46  dif.#ifdef PURIF
144d0 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 66  Y....    ".purif
144e0 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  y".#endif.#ifdef
144f0 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09   STATIC_BUILD...
14500 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23  .    ".static".#
14510 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29  endif...), NULL)
14520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
14530 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
14540 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14580 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
14590 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Init --. *. *.
145a0 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67  This is a packag
145b0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
145c0 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63   procedure, whic
145d0 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62  h is called. *.b
145e0 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20  y Tcl when this 
145f0 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65  package is to be
14600 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74   added to an int
14610 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20  erpreter.. *. * 
14620 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f  Results:  Ssl co
14630 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61  nfigured and loa
14640 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ded. *. * Side e
14650 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61  ffects:. *. crea
14660 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61  te the ssl comma
14670 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73  nd, initialize s
14680 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a  sl context. *. *
14690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146d0 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 4c  ---. */..#if TCL
146e0 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e  _MAJOR_VERSION >
146f0 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56   8.#define MIN_V
14700 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c  ERSION "9.0".#el
14710 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56  se.#define MIN_V
14720 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e  ERSION "8.5".#en
14730 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  dif..static cons
14740 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69  t char tlsTclIni
14750 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69  tScript[] = {.#i
14760 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e  nclude "tls.tcl.
14770 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a  h"..0x00.    };.
14780 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54  .DLLEXPORT int T
14790 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  ls_Init(Tcl_Inte
147a0 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20  rp *interp) {.. 
147b0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
147c0 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53  ed");..#ifdef US
147d0 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20  E_TCL_STUBS.    
147e0 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62  if (Tcl_InitStub
147f0 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45  s(interp, MIN_VE
14800 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c  RSION, 0) == NUL
14810 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
14820 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
14830 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c  ndif.    if (Tcl
14840 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65  _PkgRequire(inte
14850 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56  rp, "Tcl", MIN_V
14860 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
14870 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
14880 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
14890 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e      if (TlsLibIn
148a0 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
148b0 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
148c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
148d0 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
148e0 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
148f0 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
14900 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
14910 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
14920 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14930 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
14940 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c  ls::connection",
14950 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
14960 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
14970 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
14980 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
14990 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
149a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
149b0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
149c0 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
149d0 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c  shakeObjCmd, (Cl
149e0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
149f0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
14a00 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
14a10 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
14a20 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
14a30 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49  :tls::import", I
14a40 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
14a50 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
14a60 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
14a70 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
14a80 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
14a90 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
14aa0 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73  :tls::misc", Mis
14ab0 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  cObjCmd, (Client
14ac0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
14ad0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
14ae0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
14af0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
14b00 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
14b10 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
14b20 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
14b30 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
14b40 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
14b50 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
14b60 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
14b70 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
14b80 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53  :tls::status", S
14b90 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  tatusObjCmd, (Cl
14ba0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
14bb0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
14bc0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20  oc *) NULL);..  
14bd0 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61    BuildInfoComma
14be0 6e 64 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  nd(interp);.    
14bf0 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e  Tls_DigestComman
14c00 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  ds(interp);.    
14c10 54 6c 73 5f 45 6e 63 72 79 70 74 43 6f 6d 6d 61  Tls_EncryptComma
14c20 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nds(interp);.   
14c30 20 54 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64   Tls_InfoCommand
14c40 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  s(interp);.    T
14c50 6c 73 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 69  ls_KDFCommands(i
14c60 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f  nterp);.    Tls_
14c70 52 61 6e 64 43 6f 6d 6d 61 6e 64 73 28 69 6e 74  RandCommands(int
14c80 65 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69  erp);..    if (i
14c90 6e 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61  nterp && Tcl_Eva
14ca0 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c  l(interp, tlsTcl
14cb0 49 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54  InitScript) != T
14cc0 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
14cd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
14ce0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63  }..    return Tc
14cf0 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
14d00 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d  erp, PACKAGE_NAM
14d10 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49  E, PACKAGE_VERSI
14d20 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  ON);.}../*. *---
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d60 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53  ---*. *. *.Tls_S
14d70 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  afeInit --. *. *
14d80 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
14d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14db0 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70  -*. *.Standard p
14dc0 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65  rocedure require
14dd0 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09  d by 'load'.. *.
14de0 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73  Initializes this
14df0 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61   extension for a
14e00 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65   safe interprete
14e10 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.. *.----------
14e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e40 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69  ------*. *. *.Si
14e50 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09  de effects:. *..
14e60 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  As of 'Tls_Init'
14e70 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20  . *. *.Result:. 
14e80 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63  *..A standard Tc
14e90 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  l error code.. *
14ea0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44  ---------*. */.D
14ee0 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
14ef0 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
14f00 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
14f10 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14f20 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
14f30 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72  n Tls_Init(inter
14f40 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  p);.}../*. *----
14f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f80 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62  --*. *. *.TlsLib
14f90 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
14fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
14fd0 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53   *.Initializes S
14fe0 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20  SL library once 
14ff0 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  per application.
15000 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
15010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15030 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
15040 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69  effects:. *..ini
15050 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
15060 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c  rary. *. *.Resul
15070 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20  t:. *..none. *. 
15080 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
150b0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61  -------*. */.sta
150c0 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e  tic int TlsLibIn
150d0 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
150e0 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69  ize) {.    stati
150f0 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
15100 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  d = 0;.    int s
15110 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  tatus = TCL_OK;.
15120 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15130 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15140 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15150 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20  ADS).    size_t 
15160 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69  num_locks;.#endi
15170 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69  f..    if (unini
15180 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28  tialize) {..if (
15190 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
151a0 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
151b0 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
151c0 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20  ize, but we are 
151d0 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22  not initialized"
151e0 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
151f0 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72  TCL_OK;..}...dpr
15200 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
15210 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a  ninitialize");..
15220 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15230 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15240 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15250 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c  ADS)..Tcl_MutexL
15260 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a  ock(&init_mx);..
15270 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20  .if (locks) {.. 
15280 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a     free(locks);.
15290 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c  .    locks = NUL
152a0 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75  L;..    locksCou
152b0 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69  nt = 0;..}.#endi
152c0 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  f..initialized =
152d0 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   0;..#if defined
152e0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
152f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
15300 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
15310 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
15320 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72  _mx);.#endif...r
15330 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
15340 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69    }..    if (ini
15350 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72  tialized) {..dpr
15360 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75  intf("Called, bu
15370 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76  t using cached v
15380 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20  alue");..return 
15390 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20  status;.    }.. 
153a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
153b0 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
153c0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
153d0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
153e0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
153f0 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
15400 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
15410 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
15420 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 1;..#if define
15430 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15440 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15450 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e  L_THREADS).    n
15460 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20  um_locks = 1;.  
15470 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28    locksCount = (
15480 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  int) num_locks;.
15490 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c      locks = mall
154a0 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  oc(sizeof(*locks
154b0 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
154c0 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73      memset(locks
154d0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63  , 0, sizeof(*loc
154e0 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
154f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
15500 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48   Initialize BOTH
15510 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c   libcrypto and l
15520 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50  ibssl. */.    OP
15530 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f  ENSSL_init_ssl(O
15540 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15550 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f  _SSL_STRINGS | O
15560 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15570 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a  _CRYPTO_STRINGS.
15580 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  .| OPENSSL_INIT_
15590 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20  ADD_ALL_CIPHERS 
155a0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
155b0 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20  DD_ALL_DIGESTS, 
155c0 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
155d0 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29  new_tcl(NULL, 0)
155e0 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a  ;..#if 0.    /*.
155f0 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a       * XXX:TODO:
15600 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64   Remove this cod
15610 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74  e and replace it
15620 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20   with a check.  
15630 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20     * for enough 
15640 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e  entropy and do n
15650 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  ot try to create
15660 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20   our own.     * 
15670 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79  terrible entropy
15680 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a  .     */.    /*.
15690 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20       * Seed the 
156a0 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
156b0 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53  nerator in the S
156c0 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20  SL library,.    
156d0 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f   * using the do/
156e0 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20  while construct 
156f0 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62  because of the b
15700 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20  ug note in the. 
15710 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41      * OpenSSL FA
15720 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e  Q at http://www.
15730 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70  openssl.org/supp
15740 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45  ort/faq.html#USE
15750 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  R1.     *.     *
15760 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65   The crux of the
15770 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74   problem is that
15780 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20   Solaris 7 does 
15790 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20  not have a.     
157a0 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72  * /dev/random or
157b0 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65   /dev/urandom de
157c0 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f  vice so it canno
157d0 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a  t gather enough.
157e0 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66       * entropy f
157f0 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65  rom the RAND_see
15800 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69  d() when TLS ini
15810 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66  tializes and ref
15820 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67  uses.     * to g
15830 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69  o further. Earli
15840 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f  er versions of O
15850 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f  penSSL carried o
15860 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20  n regardless..  
15870 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28     */.    srand(
15880 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74  (unsigned int) t
15890 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e  ime((time_t *) N
158a0 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a  ULL));.    do {.
158b0 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
158c0 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20   16; i++) {..   
158d0 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31   rnd_seed[i] = 1
158e0 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30   + (char) (255.0
158f0 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f   * rand()/(RAND_
15900 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52  MAX+1.0));..}..R
15910 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65  AND_seed(rnd_see
15920 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65  d, sizeof(rnd_se
15930 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c  ed));.    } whil
15940 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29  e (RAND_status()
15950 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a   != 1);.#endif..
15960 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15970 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15980 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15990 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74  ADS).    Tcl_Mut
159a0 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d  exUnlock(&init_m
159b0 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  x);.#endif..    
159c0 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d  return status;.}
159d0 0a                                               .