0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77  dif.../*. * Forw
0440: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73  ard declarations
0450: 0a 20 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32  . */..#define F2
0460: 4e 28 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28  N(key, dsp) \..(
0470: 28 28 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20  ((key) == NULL) 
0480: 3f 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20  ? (char *) NULL 
0490: 3a 20 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c  : \...Tcl_Transl
04a0: 61 74 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65  ateFileName(inte
04b0: 72 70 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29  rp, (key), (dsp)
04c0: 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43  ))..static SSL_C
04d0: 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61  TX *CTX_Init(Sta
04e0: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e  te *statePtr, in
04f0: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20  t isServer, int 
0500: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79  proto, char *key
0510: 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74 66 69  ,...char *certfi
0520: 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
0530: 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73  r *key_asn1, uns
0540: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
0550: 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79  _asn1,...int key
0560: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63  _asn1_len, int c
0570: 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68  ert_asn1_len, ch
0580: 61 72 20 2a 43 41 70 61 74 68 2c 20 63 68 61 72  ar *CApath, char
0590: 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61 72   *CAfile,...char
05a0: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
05b0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69  *ciphersuites, i
05c0: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a  nt level, char *
05d0: 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61 74  DHparams);..stat
05e0: 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e 69  ic int.TlsLibIni
05f0: 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69  t(int uninitiali
0600: 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54 4c  ze);..#define TL
0610: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30 78  S_PROTO_SSL2..0x
0620: 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  01.#define TLS_P
0630: 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32 0a  ROTO_SSL3..0x02.
0640: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0650: 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64 65  O_TLS1..0x04.#de
0660: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
0670: 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66 69  LS1_1.0x08.#defi
0680: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
0690: 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e 65  1_2.0x10.#define
06a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
06b0: 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20 45  3.0x20.#define E
06c0: 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61 73  NABLED(flag, mas
06d0: 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28 6d  k).(((flag) & (m
06e0: 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29 29  ask)) == (mask))
06f0: 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45 59  ..#define SSLKEY
0700: 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45 59  LOGFILE.."SSLKEY
0710: 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20  LOGFILE"../*. * 
0720: 54 68 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20  Thread-Safe TLS 
0730: 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66  Code. */..#ifdef
0740: 20 54 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65   TCL_THREADS.#de
0750: 66 69 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52  fine OPENSSL_THR
0760: 45 41 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63  EAD_DEFINES.#inc
0770: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70  lude <openssl/op
0780: 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69  ensslconf.h>..#i
0790: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52  fdef OPENSSL_THR
07a0: 45 41 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  EADS.#include <o
07b0: 70 65 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e  penssl/crypto.h>
07c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
07d0: 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a  sl/ssl.h>../*. *
07e0: 20 54 68 72 65 61 64 65 64 20 6f 70 65 72 61 74   Threaded operat
07f0: 69 6f 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63  ion requires loc
0800: 6b 69 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20  king callbacks. 
0810: 2a 20 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72  * Based from /cr
0820: 79 70 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20  ypto/cryptlib.c 
0830: 6f 66 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e  of OpenSSL and N
0840: 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73  SOpenSSL.. */..s
0850: 74 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20  tatic Tcl_Mutex 
0860: 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73  *locks = NULL;.s
0870: 74 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43  tatic int locksC
0880: 6f 75 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  ount = 0;.static
0890: 20 54 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f   Tcl_Mutex init_
08a0: 6d 78 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50  mx;.#endif /* OP
08b0: 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f  ENSSL_THREADS */
08c0: 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54  .#endif /* TCL_T
08d0: 48 52 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a  HREADS */..../**
08e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
08f0: 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73  **/./* Callbacks
0900: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
0910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0920: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0970: 2a 20 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20  * Eval Callback 
0980: 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a  Command --. *. *
0990: 09 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63  .Eval callback c
09a0: 6f 6d 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68  ommand and catch
09b0: 20 61 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20   any errors. *. 
09c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20  * Results:. *.0 
09d0: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  = Command return
09e0: 65 64 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20  ed fail or eval 
09f0: 72 65 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52  returned TCL_ERR
0a00: 4f 52 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e  OR. *.1 = Comman
0a10: 64 20 72 65 74 75 72 6e 65 64 20 73 75 63 63 65  d returned succe
0a20: 73 73 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72  ss or eval retur
0a30: 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a  ned TCL_OK. *. *
0a40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0a50: 2a 09 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c  *.Evaluates call
0a60: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a  back command. *.
0a70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
0ac0: 20 69 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63   int.EvalCallbac
0ad0: 6b 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  k(Tcl_Interp *in
0ae0: 74 65 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61  terp, State *sta
0af0: 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a  tePtr, Tcl_Obj *
0b00: 63 6d 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e  cmdPtr) {.    in
0b10: 74 20 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a  t code, ok = 0;.
0b20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
0b30: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 63 6c  lled");..    Tcl
0b40: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0b50: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
0b60: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0b70: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
0b80: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
0b90: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77   Eval callback w
0ba0: 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20  ith success for 
0bb0: 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  ok or return val
0bc0: 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65  ue 1, fail for e
0bd0: 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76  rror or return v
0be0: 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63  alue 0 */.    Tc
0bf0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
0c00: 74 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20  terp);.    code 
0c10: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
0c20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
0c30: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
0c40: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 45  ;.    dprintf("E
0c50: 76 61 6c 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22  valCallback: %d"
0c60: 2c 20 63 6f 64 65 29 3b 0a 20 20 20 20 69 66 20  , code);.    if 
0c70: 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29  (code == TCL_OK)
0c80: 20 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73   {../* Check res
0c90: 75 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76  ult for return v
0ca0: 61 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a  alue */..Tcl_Obj
0cb0: 20 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   *result = Tcl_G
0cc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
0cd0: 72 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74  rp);..if (result
0ce0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f   == NULL || Tcl_
0cf0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
0d00: 74 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f  terp, result, &o
0d10: 6b 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  k) != TCL_OK) {.
0d20: 09 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a  .    ok = 1;..}.
0d30: 09 64 70 72 69 6e 74 66 28 22 52 65 73 75 6c 74  .dprintf("Result
0d40: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 20 20 20 20  : %d", ok);.    
0d50: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72  } else {../* Err
0d60: 6f 72 20 2d 20 72 65 6a 65 63 74 20 74 68 65 20  or - reject the 
0d70: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
0d80: 64 70 72 69 6e 74 66 28 22 54 63 6c 5f 42 61 63  dprintf("Tcl_Bac
0d90: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 22 29 3b 0a  kgroundError");.
0da0: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
0db0: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
0dc0: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
0dd0: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
0de0: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
0df0: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
0e00: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
0e10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64  tion(interp, cod
0e20: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
0e30: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
0e40: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
0e50: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 54 63  tatePtr);.    Tc
0e60: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
0e70: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
0e80: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d      return ok;.}
0e90: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
0ee0: 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 20 2d  * InfoCallback -
0ef0: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
0f00: 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   SSL connection 
0f10: 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20 52 65  process. *. * Re
0f20: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
0f30: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0f40: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
0f50: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
0f60: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
0fb0: 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66 6f 43  tatic void.InfoC
0fc0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
0fd0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68 65 72  L *ssl, int wher
0fe0: 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a 20 20  e, int ret) {.  
0ff0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
1000: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
1010: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
1020: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
1030: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1040: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
1050: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
1060: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68   *cmdPtr;.    ch
1070: 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61 72 20  ar *major; char 
1080: 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64 70 72  *minor;..    dpr
1090: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
10a0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
10b0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
10c0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09  Tcl_Obj*)NULL)..
10d0: 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69 66 20  return;..    if 
10e0: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
10f0: 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52 54 29  HANDSHAKE_START)
1100: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
1110: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
1120: 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20 20 7d  = "start";.    }
1130: 20 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20   else if (where 
1140: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
1150: 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f  KE_DONE) {..majo
1160: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
1170: 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e 65 22  ..minor = "done"
1180: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1190: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11a0: 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a 6f 72  CB_ALERT)..major
11b0: 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65 6c 73   = "alert";..els
11c0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
11d0: 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09 6d 61  L_ST_CONNECT).ma
11e0: 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74 22 3b  jor = "connect";
11f0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
1200: 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45 50 54   & SSL_ST_ACCEPT
1210: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63 63 65  )..major = "acce
1220: 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  pt";..else.....m
1230: 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  ajor = "unknown"
1240: 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20 26 20  ;...if (where & 
1250: 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09 6d 69  SSL_CB_READ)..mi
1260: 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a 09 65  nor = "read";..e
1270: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1280: 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09 09 6d  SSL_CB_WRITE)..m
1290: 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22 3b 0a  inor = "write";.
12a0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12b0: 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09  & SSL_CB_LOOP)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a  minor = "loop";.
12d0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12e0: 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29 09 09  & SSL_CB_EXIT)..
12f0: 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22 3b 0a  minor = "exit";.
1300: 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f 72 20  .else.....minor 
1310: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20  = "unknown";.   
1320: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
1330: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
1340: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
1350: 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c 20 6d   major, minor, m
1360: 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79 70 65  essage, and type
1370: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
1380: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
1390: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
13a0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
13b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
13c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
13d0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
13e0: 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22  StringObj("info"
13f0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1400: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1410: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1420: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1430: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
1440: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
1450: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
1460: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
1470: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1480: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1490: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14a0: 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a  bj(major, -1));.
14b0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
14c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
14e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69  _NewStringObj(mi
14f0: 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  nor, -1));..    
1500: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1510: 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c  CB_ALERT) {..Tcl
1520: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1530: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1540: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1550: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1560: 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e  alert_desc_strin
1570: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
1580: 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  );..Tcl_ListObjA
1590: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
15a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
15b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
15c0: 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70  bj(SSL_alert_typ
15d0: 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65  e_string_long(re
15e0: 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20  t), -1));.    } 
15f0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  else {..Tcl_List
1600: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1610: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1620: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1630: 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65  ingObj(SSL_state
1640: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
1650: 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69  ), -1));..Tcl_Li
1660: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1670: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1680: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
1690: 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29  Obj("info", -1))
16a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
16b0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
16c0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
16d0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
16e0: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
16f0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
1700: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
1710: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
1720: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
1730: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1780: 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  . * MessageCallb
1790: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e  ack --. *. *.Mon
17a0: 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63  itors SSL protoc
17b0: 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20  ol messages. *. 
17c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
17d0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
17e0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
17f0: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
1800: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
1850: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
1860: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
1870: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73  static void.Mess
1880: 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20  ageCallback(int 
1890: 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72  write_p, int ver
18a0: 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e  sion, int conten
18b0: 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f  t_type, const vo
18c0: 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20  id *buf, size_t 
18d0: 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76  len, SSL *ssl, v
18e0: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
18f0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
1900: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
1910: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
1920: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
1930: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
1940: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
1950: 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74     char *ver, *t
1960: 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69  ype;.    BIO *bi
1970: 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  o;.    char buff
1980: 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62  er[15000];.    b
1990: 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20  uffer[0] = 0;.. 
19a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
19b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
19c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
19d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
19e0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
19f0: 20 20 20 73 77 69 74 63 68 28 76 65 72 73 69 6f     switch(versio
1a00: 6e 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  n) {.#if OPENSSL
1a10: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
1a20: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
1a30: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
1a40: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
1a50: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
1a60: 20 20 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45      case SSL2_VE
1a70: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53  RSION:..ver = "S
1a80: 53 4c 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  SLv2";..break;.#
1a90: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
1aa0: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
1ab0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1ac0: 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73  NO_SSL3).    cas
1ad0: 65 20 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL3_VERSION:.
1ae0: 09 76 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a  .ver = "SSLv3";.
1af0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
1b00: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52     case TLS1_VER
1b10: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1b20: 53 76 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  Sv1";..break;.  
1b30: 20 20 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45    case TLS1_1_VE
1b40: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1b50: 4c 53 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.1";..break;
1b60: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32  .    case TLS1_2
1b70: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1b80: 20 22 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65   "TLSv1.2";..bre
1b90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53  ak;.    case TLS
1ba0: 31 5f 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65  1_3_VERSION:..ve
1bb0: 72 20 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09  r = "TLSv1.3";..
1bc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1bd0: 30 3a 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22  0:..ver = "none"
1be0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  ;..break;.    de
1bf0: 66 61 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75  fault:..ver = "u
1c00: 6e 6b 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b  nknown";..break;
1c10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
1c20: 63 68 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65  ch (content_type
1c30: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ) {.    case SSL
1c40: 33 5f 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79  3_RT_HEADER:..ty
1c50: 70 65 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09  pe = "Header";..
1c60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c70: 53 53 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f  SSL3_RT_INNER_CO
1c80: 4e 54 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70  NTENT_TYPE:..typ
1c90: 65 20 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65  e = "Inner Conte
1ca0: 6e 74 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b  nt Type";..break
1cb0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1cc0: 52 54 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52  RT_CHANGE_CIPHER
1cd0: 5f 53 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22  _SPEC:..type = "
1ce0: 43 68 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a  Change Cipher";.
1cf0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
1d00: 20 53 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a   SSL3_RT_ALERT:.
1d10: 09 74 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b  .type = "Alert";
1d20: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d30: 65 20 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48  e SSL3_RT_HANDSH
1d40: 41 4b 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61  AKE:..type = "Ha
1d50: 6e 64 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b  ndshake";..break
1d60: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d70: 52 54 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44  RT_APPLICATION_D
1d80: 41 54 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70  ATA:..type = "Ap
1d90: 70 20 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b  p Data";..break;
1da0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
1db0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
1dc0: 33 30 30 30 30 30 30 30 4c 0a 20 20 20 20 63 61  30000000L.    ca
1dd0: 73 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52  se DTLS1_RT_HEAR
1de0: 54 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22  TBEAT:..type = "
1df0: 48 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65  Heartbeat";..bre
1e00: 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64  ak;.#endif.    d
1e10: 65 66 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20  efault:..type = 
1e20: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d  "unknown";.    }
1e30: 0a 0a 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63  ..    /* Needs c
1e40: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69  ompile time opti
1e50: 6f 6e 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74  on "enable-ssl-t
1e60: 72 61 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66  race". */.    if
1e70: 20 28 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77   ((bio = BIO_new
1e80: 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21  (BIO_s_mem())) !
1e90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e  = NULL) {..int n
1ea0: 3b 0a 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69  ;..SSL_trace(wri
1eb0: 74 65 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63  te_p, version, c
1ec0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66  ontent_type, buf
1ed0: 2c 20 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69  , len, ssl, (voi
1ee0: 64 20 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42  d *)bio);..n = B
1ef0: 49 4f 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66  IO_read(bio, buf
1f00: 66 65 72 2c 20 42 49 4f 5f 70 65 6e 64 69 6e 67  fer, BIO_pending
1f10: 28 62 69 6f 29 20 3c 20 31 35 30 30 30 20 3f 20  (bio) < 15000 ? 
1f20: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1f30: 20 3a 20 31 34 39 39 39 29 3b 0a 09 6e 20 3d 20   : 14999);..n = 
1f40: 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a 09  (n<0) ? 0 : n;..
1f50: 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a 09  buffer[n] = 0;..
1f60: 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68 28  (void)BIO_flush(
1f70: 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 28  bio);..BIO_free(
1f80: 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20 20  bio);.   }..    
1f90: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
1fa0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
1fb0: 6e 2c 20 63 68 61 6e 2c 20 64 69 72 65 63 74 69  n, chan, directi
1fc0: 6f 6e 2c 20 76 65 72 73 69 6f 6e 2c 20 74 79 70  on, version, typ
1fd0: 65 2c 20 61 6e 64 20 6d 65 73 73 61 67 65 20 61  e, and message a
1fe0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
1ff0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2000: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
2010: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
2020: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2030: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2040: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2050: 72 69 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65  ringObj("message
2060: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2070: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2080: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2090: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
20a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
20b0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
20c0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
20d0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20e0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
20f0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2100: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2110: 4f 62 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53  Obj(write_p ? "S
2120: 65 6e 74 22 20 3a 20 22 52 65 63 65 69 76 65 64  ent" : "Received
2130: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
2140: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2150: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2160: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2170: 69 6e 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29  ingObj(ver, -1))
2180: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2190: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
21a0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
21b0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
21c0: 74 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  type, -1));.    
21d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
21e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
21f0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2200: 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72  StringObj(buffer
2210: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
2220: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2230: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2240: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2250: 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43  dPtr);.    EvalC
2260: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2270: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2280: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2290: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
22a0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
22b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66  ----. *. * Verif
2300: 79 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  yCallback --. *.
2310: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
2320: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
2330: 64 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20  dation process. 
2340: 55 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  Used to control 
2350: 74 68 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20  the. *.behavior 
2360: 77 68 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52  when the SSL_VER
2370: 49 46 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73  IFY_PEER flag is
2380: 20 73 65 74 2e 20 54 68 69 73 20 69 73 20 63 61   set. This is ca
2390: 6c 6c 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72  lled. *.whenever
23a0: 20 61 20 63 65 72 74 69 66 69 63 61 74 65 20 69   a certificate i
23b0: 73 20 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64  s inspected or d
23c0: 65 63 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20  ecided invalid. 
23d0: 43 61 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61  Called for. *.ea
23e0: 63 68 20 63 65 72 74 69 66 69 63 61 74 65 20 69  ch certificate i
23f0: 6e 20 74 68 65 20 63 65 72 74 20 63 68 61 69 6e  n the cert chain
2400: 2e 0a 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a  .. *. * Checks:.
2410: 20 2a 09 54 68 65 20 63 65 72 74 69 66 69 63 61   *.The certifica
2420: 74 65 20 63 68 61 69 6e 20 69 73 20 63 68 65 63  te chain is chec
2430: 6b 65 64 20 73 74 61 72 74 69 6e 67 20 77 69 74  ked starting wit
2440: 68 20 74 68 65 20 64 65 65 70 65 73 74 20 6e 65  h the deepest ne
2450: 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20  sting level. *. 
2460: 20 28 74 68 65 20 72 6f 6f 74 20 43 41 20 63 65   (the root CA ce
2470: 72 74 69 66 69 63 61 74 65 29 20 61 6e 64 20 77  rtificate) and w
2480: 6f 72 6b 65 64 20 75 70 77 61 72 64 20 74 6f 20  orked upward to 
2490: 74 68 65 20 70 65 65 72 27 73 20 63 65 72 74 69  the peer's certi
24a0: 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73  ficate.. *.All s
24b0: 69 67 6e 61 74 75 72 65 73 20 61 72 65 20 76 61  ignatures are va
24c0: 6c 69 64 2c 20 63 75 72 72 65 6e 74 20 74 69 6d  lid, current tim
24d0: 65 20 69 73 20 77 69 74 68 69 6e 20 66 69 72 73  e is within firs
24e0: 74 20 61 6e 64 20 6c 61 73 74 20 76 61 6c 69 64  t and last valid
24f0: 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65  ity time.. *.Che
2500: 63 6b 20 74 68 61 74 20 74 68 65 20 63 65 72 74  ck that the cert
2510: 69 66 69 63 61 74 65 20 69 73 20 69 73 73 75 65  ificate is issue
2520: 64 20 62 79 20 74 68 65 20 69 73 73 75 65 72 20  d by the issuer 
2530: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 73 75  certificate issu
2540: 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  er.. *.Check the
2550: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
2560: 75 73 20 66 6f 72 20 65 61 63 68 20 63 65 72 74  us for each cert
2570: 69 66 69 63 61 74 65 2e 0a 20 2a 09 43 68 65 63  ificate.. *.Chec
2580: 6b 20 74 68 65 20 76 61 6c 69 64 69 74 79 20 6f  k the validity o
2590: 66 20 74 68 65 20 67 69 76 65 6e 20 43 52 4c 20  f the given CRL 
25a0: 61 6e 64 20 74 68 65 20 63 65 72 74 20 72 65 76  and the cert rev
25b0: 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a  ocation status..
25c0: 20 2a 09 43 68 65 63 6b 20 74 68 65 20 70 6f 6c   *.Check the pol
25d0: 69 63 69 65 73 20 6f 66 20 61 6c 6c 20 74 68 65  icies of all the
25e0: 20 63 65 72 74 69 66 69 63 61 74 65 73 0a 20 2a   certificates. *
25f0: 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70 72 65 76  . * Args. *.prev
2600: 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74  erify_ok indicat
2610: 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20 63  es whether the c
2620: 65 72 74 69 66 69 63 61 74 65 20 76 65 72 69 66  ertificate verif
2630: 69 63 61 74 69 6f 6e 20 70 61 73 73 65 64 20 28  ication passed (
2640: 31 29 20 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a  1) or not (0). *
2650: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
2660: 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64  A callback bound
2670: 20 74 6f 20 74 68 65 20 73 6f 63 6b 65 74 20 6d   to the socket m
2680: 61 79 20 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66  ay return one of
2690: 3a 0a 20 2a 09 20 20 20 20 30 09 09 09 2d 20 74  :. *.    0...- t
26a0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 69  he certificate i
26b0: 73 20 64 65 65 6d 65 64 20 69 6e 76 61 6c 69 64  s deemed invalid
26c0: 2c 20 73 65 6e 64 20 76 65 72 69 66 69 63 61 74  , send verificat
26d0: 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66 61 69 6c  ion. *....  fail
26e0: 75 72 65 20 61 6c 65 72 74 20 74 6f 20 70 65 65  ure alert to pee
26f0: 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e 61 74 65  r, and terminate
2700: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2710: 20 20 20 31 09 09 09 2d 20 74 68 65 20 63 65 72     1...- the cer
2720: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
2730: 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e  ed valid, contin
2740: 75 65 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  ue with handshak
2750: 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70 74 79 20  e.. *.    empty 
2760: 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e  string.- no chan
2770: 67 65 20 74 6f 20 63 65 72 74 69 66 69 63 61 74  ge to certificat
2780: 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a  e validation. *.
2790: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
27a0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
27b0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
27c0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
27d0: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
27e0: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
27f0: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2800: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2810: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2860: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
2870: 0a 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 28  .VerifyCallback(
2880: 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f  int ok, X509_STO
2890: 52 45 5f 43 54 58 20 2a 63 74 78 29 20 7b 0a 20  RE_CTX *ctx) {. 
28a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
28b0: 74 72 3b 0a 20 20 20 20 53 53 4c 20 20 20 2a 73  tr;.    SSL   *s
28c0: 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58 35 30 39  sl..= (SSL*)X509
28d0: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
28e0: 78 5f 64 61 74 61 28 63 74 78 2c 20 53 53 4c 5f  x_data(ctx, SSL_
28f0: 67 65 74 5f 65 78 5f 64 61 74 61 5f 58 35 30 39  get_ex_data_X509
2900: 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64 78 28 29  _STORE_CTX_idx()
2910: 29 3b 0a 20 20 20 20 58 35 30 39 20 20 2a 63 65  );.    X509  *ce
2920: 72 74 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  rt..= X509_STORE
2930: 5f 43 54 58 5f 67 65 74 5f 63 75 72 72 65 6e 74  _CTX_get_current
2940: 5f 63 65 72 74 28 63 74 78 29 3b 0a 20 20 20 20  _cert(ctx);.    
2950: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
2960: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
2970: 74 5f 61 70 70 5f 64 61 74 61 28 73 73 6c 29 3b  t_app_data(ssl);
2980: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2990: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
29a0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
29b0: 69 6e 74 20 64 65 70 74 68 09 09 3d 20 58 35 30  int depth..= X50
29c0: 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f  9_STORE_CTX_get_
29d0: 65 72 72 6f 72 5f 64 65 70 74 68 28 63 74 78 29  error_depth(ctx)
29e0: 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 09 09 3d  ;.    int err..=
29f0: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2a00: 67 65 74 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a  get_error(ctx);.
2a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
2a20: 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64 70 72 69  lled");.    dpri
2a30: 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62  ntf("VerifyCallb
2a40: 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  ack: %d", ok);..
2a50: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
2a60: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
2a70: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20  bj*)NULL) {../* 
2a80: 55 73 65 20 6f 6b 20 76 61 6c 75 65 20 69 66 20  Use ok value if 
2a90: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 73 20  verification is 
2aa0: 72 65 71 75 69 72 65 64 20 2a 2f 0a 09 69 66 20  required */..if 
2ab0: 28 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67  (statePtr->vflag
2ac0: 73 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  s & SSL_VERIFY_F
2ad0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
2ae0: 45 52 54 29 20 7b 0a 09 20 20 20 20 72 65 74 75  ERT) {..    retu
2af0: 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b  rn ok;..} else {
2b00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ..    return 1;.
2b10: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
2b20: 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c   (cert == NULL |
2b30: 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | ssl == NULL) {
2b40: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ..return 0;.    
2b50: 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
2b60: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2b70: 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b  eval callback");
2b80: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
2b90: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
2ba0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64  with fn, chan, d
2bb0: 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20  epth, cert info 
2bc0: 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e  list, status, an
2bd0: 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a  d error args */.
2be0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
2bf0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
2c00: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20  atePtr->vcmd);. 
2c10: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2c20: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2c30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2c40: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65  NewStringObj("ve
2c50: 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rify", -1));.   
2c60: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c70: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c80: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2c90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
2ca0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
2cb0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
2cc0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2cd0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2ce0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2cf0: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2d00: 28 64 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63  (depth));.    Tc
2d10: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2d20: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2d30: 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35  mdPtr, Tls_NewX5
2d40: 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65  09Obj(interp, ce
2d50: 72 74 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  rt));.    Tcl_Li
2d60: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d70: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2d80: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
2d90: 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  (ok));.    Tcl_L
2da0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2db0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2dc0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2dd0: 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30  ngObj((char*)X50
2de0: 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
2df0: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
2e00: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50   -1));..    /* P
2e10: 72 65 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65  revent I/O while
2e20: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20   callback is in 
2e30: 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20  progress */.    
2e40: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e50: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41  gs |= TLS_TCL_CA
2e60: 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20  LLBACK; */..    
2e70: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
2e80: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
2e90: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2ea0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b  (cmdPtr);.    ok
2eb0: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
2ec0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2ed0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
2ee0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2ef0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 64 70  cmdPtr);..    dp
2f00: 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61 6c  rintf("VerifyCal
2f10: 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72  lback: command r
2f20: 65 73 75 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29  esult = %d", ok)
2f30: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  ;..    /* stateP
2f40: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54  tr->flags &= ~(T
2f50: 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29  LS_TCL_CALLBACK)
2f60: 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
2f70: 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c  ok;./* By defaul
2f80: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63  t, leave verific
2f90: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
2fa0: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   */.}.../*. *---
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
3000: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
3010: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 65 72  callback with er
3020: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a  ror message.. *.
3030: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3040: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
3050: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
3060: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
3070: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
3080: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
3090: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
30a0: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
30b0: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
3110: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
3120: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29  ePtr, char *msg)
3130: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
3140: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
3150: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
3160: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
3170: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
3180: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65   unsigned long e
3190: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rr;.    statePtr
31a0: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20  ->err = msg;..  
31b0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
31c0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
31d0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
31e0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
31f0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
3200: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3210: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
3220: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
3230: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
3240: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3250: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3260: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
3270: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3280: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3290: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
32a0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
32b0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
32c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
32d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32e0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
32f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3300: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3310: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3320: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
3330: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
3340: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3350: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3360: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3370: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3380: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
3390: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
33a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
33b0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
33c0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
33d0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
33e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
33f0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3400: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3410: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
3420: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
3430: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3440: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
3450: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3460: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
3470: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3480: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3490: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
34a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
34b0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
34c0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
34d0: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
34e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
34f0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3500: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
3510: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
3520: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3530: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3540: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3550: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
3560: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
3570: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
3580: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3590: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
35a0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
35f0: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20   KeyLogCallback 
3600: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72  --. *. *.Write r
3610: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61  eceived key data
3620: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a   to log file.. *
3630: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3640: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3690: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c  --. */.void KeyL
36a0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  ogCallback(const
36b0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
36c0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20   char *line) {. 
36d0: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67     char *str = g
36e0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
36f0: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a  ILE);.    FILE *
3700: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  fd;..    dprintf
3710: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3720: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20   if (str) {..fd 
3730: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22  = fopen(str, "a"
3740: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20  );..fprintf(fd, 
3750: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66  "%s\n",line);..f
3760: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
3770: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
37c0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c  . * Password Cal
37d0: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43  lback --. *. *.C
37e0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73  alled when a pas
37f0: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20  sword is needed 
3800: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3810: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20  y when loading. 
3820: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50  *.or storing a P
3830: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77  EM certificate w
3840: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20  ith encryption. 
3850: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20  Evals callback. 
3860: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74  *.script and ret
3870: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  urns the result 
3880: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  as the password 
3890: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20  string in buf.. 
38a0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
38b0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
38c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
38d0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
38e0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
38f0: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77  eturns:. *.Passw
3900: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ord size in byte
3910: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  s or -1 for an e
3920: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3970: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
3980: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63  sswordCallback(c
3990: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69  har *buf, int si
39a0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20  ze, int rwflag, 
39b0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20  void *udata) {. 
39c0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
39d0: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75  tr.= (State *) u
39e0: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  data;.    Tcl_In
39f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3a00: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3a10: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3a20: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3a30: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  de;.    Tcl_Size
3a40: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e   len;..    dprin
3a50: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3a60: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
3a70: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
3a80: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
3a90: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3aa0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
3ab0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
3ac0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3ad0: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3ae0: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3af0: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3b00: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3b10: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3b20: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3b30: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3b40: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3b50: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54      if (len > (T
3b60: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29  cl_Size) size-1)
3b70: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f   {...len = (Tcl_
3b80: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20  Size) size-1;.. 
3b90: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70     }..    strncp
3ba0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3bb0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
3bc0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
3bd0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3be0: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20  t) len;..} else 
3bf0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  {..    return -1
3c00: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3c10: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3c20: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3c30: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73  n, rwflag, and s
3c40: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ize args */.    
3c50: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
3c60: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
3c70: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20  tr->password);. 
3c80: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3c90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3ca0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3cb0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
3cc0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20  ssword", -1));. 
3cd0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3ce0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3cf0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3d00: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67  NewIntObj(rwflag
3d10: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3d20: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3d30: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d40: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
3d50: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ize));..    Tcl_
3d60: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3d70: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3d80: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
3d90: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3da0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3db0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3dc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3dd0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3de0: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
3df0: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3e00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3e10: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3e20: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
3e30: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
3e40: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
3e50: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
3e60: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
3e70: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
3e80: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
3e90: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
3ea0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
3eb0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
3ec0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3ed0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3ee0: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3ef0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3f00: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3f10: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  r);..    /* If s
3f20: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20  uccessful, pass 
3f30: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74  back password st
3f40: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74  ring and truncat
3f50: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  e if too long */
3f60: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
3f70: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
3f80: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3f90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3fa0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3fb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
3fc0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20  &len);..if (len 
3fd0: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  > (Tcl_Size) siz
3fe0: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  e-1) {..    len 
3ff0: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  = (Tcl_Size) siz
4000: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
4010: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
4020: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
4030: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
4040: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
4050: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
4060: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
4070: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
4080: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
4090: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
40a0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c    return -1;.}..
40b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4100: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
4110: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4120: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
4130: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
4140: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4150: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e  cache. In TLS 1.
4160: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65  3. *.this may be
4170: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
4180: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74  le times after t
4190: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f  he handshake. Fo
41a0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72  r. *.earlier ver
41b0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c  sions, this will
41c0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72   be received dur
41d0: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ing the handshak
41e0: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68  e.. *.This is th
41f0: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20  e preferred way 
4200: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75  to obtain a resu
4210: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20  mable session.. 
4220: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4230: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4240: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4250: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4260: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
4270: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
4280: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20  0 = error where 
4290: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20  session will be 
42a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f  immediately remo
42b0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ved from the int
42c0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09  ernal cache.. *.
42d0: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72  1 = success wher
42e0: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65  e app retains se
42f0: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e  ssion in session
4300: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74   cache, and must
4310: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f   call SSL_SESSIO
4320: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f  N_free() when do
4330: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
4380: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73  .static int.Sess
4390: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20  ionCallback(SSL 
43a0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
43b0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
43c0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
43d0: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
43e0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
43f0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
4400: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4410: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4420: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4430: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4440: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4450: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4460: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4470: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4480: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
4490: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
44a0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
44b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
44c0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
44d0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
44e0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
44f0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4500: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4510: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4520: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4530: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4540: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4550: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4560: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
4570: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73  h fn, chan, sess
4580: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20  ion id, session 
4590: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65  ticket, and life
45a0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  time args */.   
45b0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
45c0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
45d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
45e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
45f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4600: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4610: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
4620: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20  ession", -1));. 
4630: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4640: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4650: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
4660: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
4670: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
4680: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
4690: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  elf), -1));..   
46a0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a   /* Session id *
46b0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64  /.    session_id
46c0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
46d0: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
46e0: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  ulen);.    Tcl_L
46f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4700: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4710: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4720: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
4730: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
4740: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  len));..    /* S
4750: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f  ession ticket */
4760: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e  .    SSL_SESSION
4770: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
4780: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
4790: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  len2);.    Tcl_L
47a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
47b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
47c0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
47d0: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
47e0: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
47f0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74  );..    /* Lifet
4800: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20  ime - number of 
4810: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54  seconds */.    T
4820: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4830: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4840: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
4850: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53  LongObj((long) S
4860: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
4870: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
4880: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  int(session)));.
4890: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
48a0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
48b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
48c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
48d0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
48e0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
48f0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
4900: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4910: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  cmdPtr);..    /*
4920: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f   Return 0 for no
4930: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20  w until session 
4940: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70  handling is comp
4950: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
4960: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49b0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61  --. *. * ALPN Ca
49c0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
49d0: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62  rs and NPN Callb
49e0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
49f0: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
4a00: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f   protocol (http/
4a10: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63  1.1, h2, h3, etc
4a20: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72  .) selection for
4a30: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67   the. *.incoming
4a40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c   connection. Cal
4a50: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20  led after Hello 
4a60: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62  and server callb
4a70: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27  acks.. *.Where '
4a80: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64  out' is selected
4a90: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69   protocol and 'i
4aa0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61  n' is the peer a
4ab0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a  dvertised list..
4ac0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4ad0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4ae0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4af0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4b00: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4b10: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4b20: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4b30: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  OK: ALPN protoco
4b40: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
4b50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4b60: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4b70: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4b80: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e  TAL: There was n
4b90: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  o overlap betwee
4ba0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20  n the client's. 
4bb0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c  *.    supplied l
4bc0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76  ist and the serv
4bd0: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
4be0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4bf0: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64   will be aborted
4c00: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4c10: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20  ERR_NOACK: ALPN 
4c20: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
4c30: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63  ected, e.g., bec
4c40: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09  ause no ALPN. *.
4c50: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72      protocols ar
4c60: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  e configured for
4c70: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
4c80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4c90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
4ca0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ce0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4cf0: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  int.ALPNCallback
4d00: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74  (SSL *ssl, const
4d10: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4d20: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4d30: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4d40: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4d50: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4d60: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4d70: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4d80: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4d90: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4da0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4db0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4dc0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4dd0: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4de0: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4df0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4e00: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4e10: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4e20: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4e30: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4e40: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4e50: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4e60: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4e70: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4e80: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67  ext_proto((unsig
4e90: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74  ned char **) out
4ea0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4eb0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4ec0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4ed0: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4ee0: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4ef0: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4f00: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4f10: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4f20: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4f30: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4f40: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4f50: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4f60: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4f70: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4f80: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..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 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4fb0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4fc0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4fd0: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4fe0: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
4ff0: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
5000: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
5010: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65  ith fn, chan, de
5020: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c  pth, cert info l
5030: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64  ist, status, and
5040: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20   error args */. 
5050: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
5060: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
5070: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
5080: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5090: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
50a0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
50b0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
50c0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
50d0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
50e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
50f0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5100: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5110: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5120: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5130: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5140: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5150: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5160: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5170: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72  gObj((const char
5180: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a   *) *out, -1));.
5190: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
51a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
51b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
51c0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
51d0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
51e0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
51f0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5200: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5210: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5220: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5230: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5240: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5250: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5260: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
5270: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5280: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
5290: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
52a0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
52b0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
52c0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
52d0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
52e0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
52f0: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5300: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5310: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5320: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5370: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
5380: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
5390: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
53a0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
53b0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
53c0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
53d0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
53e0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
53f0: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5400: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5410: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5420: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5430: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5440: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5450: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5460: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5470: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5480: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
5490: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
54a0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
54b0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
54c0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
54d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
54e0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
54f0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5500: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5540: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5550: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5560: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
5570: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5580: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
5590: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
55a0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
55b0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
55c0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
55d0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
55e0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
55f0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5600: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5610: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5620: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5630: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5640: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5650: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5660: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
5670: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
5680: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
5690: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
56a0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
56b0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
56c0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
56d0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
56e0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
56f0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5700: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5710: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5720: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5730: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5780: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
5790: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
57a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
57b0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
57c0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
57d0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
57e0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
57f0: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5800: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5810: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5820: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5830: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5840: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5850: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5860: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
5870: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
5880: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
5890: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
58a0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
58b0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
58c0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
58d0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
58e0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
58f0: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5900: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5910: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5920: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5930: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5940: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5950: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5960: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5970: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
5980: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
5990: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
59a0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
59b0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
59c0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
59d0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
59e0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
59f0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5a00: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5a10: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5a20: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5a30: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5a40: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5a50: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5a60: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
5a70: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
5a80: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5a90: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5ae0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5af0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5b00: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5b10: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5b20: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5b30: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5b40: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5b50: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5b60: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5b70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5b80: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
5b90: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
5ba0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
5bb0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
5bc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5bd0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5be0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5bf0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5c00: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5c10: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5c20: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20    /* Only works 
5c30: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20  for TLS 1.2 and 
5c40: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73  earlier */.    s
5c50: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f  ervername = SSL_
5c60: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
5c70: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
5c80: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a  YPE_host_name);.
5c90: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e      if (!servern
5ca0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d  ame || servernam
5cb0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
5cc0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5cd0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5ce0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
5cf0: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
5d00: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
5d10: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5d20: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5d30: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5d40: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
5d50: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
5d60: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  and server name 
5d70: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
5d80: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5d90: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5da0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5db0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5dc0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5dd0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5de0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5df0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5e00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5e10: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5e20: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5e30: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5e40: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5e50: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5e60: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5e70: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5e80: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5e90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5ea0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5eb0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5ec0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5ed0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5ee0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5ef0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5f00: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5f10: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5f20: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5f30: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5f40: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5f50: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5f60: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5f70: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5f80: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5f90: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5fa0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5fb0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5fc0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5fd0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5fe0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5ff0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
6000: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
6010: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
6020: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
6030: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
6040: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6050: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6060: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6070: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
60c0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
60d0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
60e0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
60f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
6100: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
6110: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
6120: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
6130: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
6140: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
6150: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
6160: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
6170: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
6180: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
6190: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
61a0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
61b0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
61c0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
61d0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
61e0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
61f0: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
6200: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
6210: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
6220: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
6230: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
6240: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
6250: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
6260: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
6270: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
6280: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
6290: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
62a0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
62b0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
62c0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
62d0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
62e0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
62f0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
6300: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6310: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
6320: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6330: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6340: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6350: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6360: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
6370: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
6380: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
6390: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
63a0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
63b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
63c0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
63d0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
63e0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
63f0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
6400: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6410: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
6420: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6470: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
6480: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
6490: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
64a0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
64b0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
64c0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
64d0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
64e0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
64f0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
6500: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
6510: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
6520: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6530: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20  *servername;.   
6540: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6550: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a  char *p;.    siz
6560: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69  e_t len, remaini
6570: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ng;..    dprintf
6580: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
6590: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
65a0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
65b0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
65c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
65d0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
65e0: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
65f0: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55   (const SSL *)NU
6600: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f  LL || arg == (vo
6610: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  id *)NULL) {..re
6620: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6630: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6640: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e   }..    /* Get n
6650: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  ames */.    if (
6660: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  !SSL_client_hell
6670: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20  o_get0_ext(ssl, 
6680: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76  TLSEXT_TYPE_serv
6690: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65  er_name, &p, &re
66a0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61  maining) || rema
66b0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
66c0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
66d0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
66e0: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
66f0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6700: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6710: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
6720: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
6730: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
6740: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
6750: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
6760: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
6770: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
6780: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
6790: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
67a0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
67b0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
67c0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
67d0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
67e0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
67f0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
6800: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   len;..    /* Th
6810: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69  e list in practi
6820: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69  ce only has a si
6830: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f  ngle element, so
6840: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65   we only conside
6850: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  r the first one.
6860: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6870: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70  ining == 0 || *p
6880: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d  ++ != TLSEXT_NAM
6890: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
68a0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
68b0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
68c0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
68d0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
68e0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
68f0: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6900: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ng--;..    /* No
6910: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79  w we can finally
6920: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79   pull out the by
6930: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
6940: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d  e actual hostnam
6950: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
6960: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
6970: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6980: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
6990: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
69a0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
69b0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
69c0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  }.    len = (*(p
69d0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
69e0: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
69f0: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20    if (len + 2 > 
6a00: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6a10: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6a20: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6a30: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6a40: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6a50: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6a60: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
6a70: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61  en;.    serverna
6a80: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
6a90: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   *)p;..    /* Cr
6aa0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
6ab0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
6ac0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e  an, and server n
6ad0: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ame args */.    
6ae0: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
6af0: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
6b00: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
6b10: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6b20: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6b30: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6b40: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22  tringObj("hello"
6b50: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6b60: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6b70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6b80: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
6b90: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
6ba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
6bb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
6bc0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
6bd0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6be0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6bf0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6c00: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28  bj(servername, (
6c10: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b  Tcl_Size) len));
6c20: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
6c30: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
6c40: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
6c50: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6c60: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
6c70: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
6c80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
6c90: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
6ca0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6cb0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a  _HELLO_RETRY;..*
6cc0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6cd0: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43  SV1_ALERT_USER_C
6ce0: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20  ANCELLED;.    } 
6cf0: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
6d00: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6d10: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6d20: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6d30: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  e {..res = SSL_C
6d40: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6d50: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  R;..*alert = SSL
6d60: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6d70: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20  NTERNAL_ERROR;. 
6d80: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6d90: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6da0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6db0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s;.}.../********
6dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
6dd0: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20   Commands       
6de0: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
6e00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e40: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68  -----. *. * Ciph
6e50: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  ersObjCmd -- lis
6e60: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6e70: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ers. *. *.This p
6e80: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6e90: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
6ea0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  he "tls::ciphers
6eb0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
6ec0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6ed0: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70  iphers, based up
6ee0: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  on protocol sele
6ef0: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cted.. *. * Resu
6f00: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6f10: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
6f20: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
6f30: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
6f40: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f  ructs and destro
6f50: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ys SSL context (
6f60: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6fb0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6fc0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d  har *protocols[]
6fd0: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73   = {.."ssl2", "s
6fe0: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
6ff0: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
7000: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
7010: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
7020: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
7030: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
7040: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
7050: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
7060: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
7070: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
7080: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
7090: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
70a0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
70b0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
70c0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
70d0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
70e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
70f0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7100: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7110: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7120: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7130: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
7140: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62   *sk;.    char b
7150: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
7160: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
7170: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
7180: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
7190: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
71a0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
71b0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
71c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
71d0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
71e0: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
71f0: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
7200: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7210: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7220: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
7230: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
7240: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7250: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7260: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
7270: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
7280: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
7290: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
72a0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
72b0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
72c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
72d0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
72e0: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
72f0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7300: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7310: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7320: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7330: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7340: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
7350: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
7360: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
7370: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
7380: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
7390: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
73a0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
73b0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
73c0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
73d0: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
73e0: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
73f0: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7400: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7410: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7420: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
7430: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
7440: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7450: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
7460: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7470: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7480: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7490: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
74a0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
74b0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
74c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
74d0: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53  ..    method = S
74e0: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62  SLv2_method(); b
74f0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7500: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7510: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7520: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7530: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7540: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7550: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7560: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
7570: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
7580: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
7590: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
75a0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
75b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
75c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
75d0: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
75e0: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
75f0: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7600: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7610: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
7620: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7630: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7640: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7650: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7660: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
7670: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7680: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7690: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
76a0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
76b0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
76c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
76d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
76e0: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
76f0: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b   TLSv1_method();
7700: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7710: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a  case TLS_TLS1_1:
7720: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7730: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7740: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7750: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7760: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7770: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _1_METHOD)..    
7780: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7790: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
77a0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
77b0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
77c0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
77d0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
77e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
77f0: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7800: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  = TLSv1_1_method
7810: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7820: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7830: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
7840: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7850: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7860: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7870: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7880: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
7890: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
78a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
78b0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
78c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
78d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
78e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
78f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7900: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7910: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
7920: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7930: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7940: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
7950: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7960: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7970: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
7980: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7990: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
79a0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
79b0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
79c0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
79d0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
79e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
79f0: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7a00: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7a10: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7a20: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
7a30: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
7a40: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53  VERSION);..    S
7a50: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
7a60: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
7a70: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
7a80: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  );..    break;.#
7a90: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
7aa0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7ab0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20  S_method();..   
7ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7ad0: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7ae0: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
7af0: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
7b00: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7b10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7b20: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7b30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7b40: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7b50: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
7b60: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
7b70: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
7b80: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7b90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7ba0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
7bb0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7bc0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
7bd0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
7be0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7bf0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
7c00: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
7c10: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
7c20: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
7c30: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
7c40: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
7c50: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7c60: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
7c70: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
7c80: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7c90: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
7ca0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
7cb0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
7cc0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
7cd0: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
7ce0: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68   {..    const ch
7cf0: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a  ar *cp;..    obj
7d00: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7d10: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7d20: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7d30: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7d40: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7d50: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7d60: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7d70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7d80: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7d90: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7da0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7db0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7dc0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7dd0: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7de0: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7df0: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7e00: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7e10: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7e20: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7e30: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
7e40: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20   cp, -1));..    
7e50: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7e60: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7e70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7e80: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7e90: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7ea0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7eb0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7ec0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7ed0: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7ee0: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7ef0: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7f00: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7f10: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7f20: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7f30: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7f40: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7f50: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7f60: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7f70: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7f80: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7f90: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7fa0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7fb0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7fc0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7fd0: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7fe0: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
7ff0: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
8000: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
8010: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
8020: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
8030: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
8040: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
8050: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
8060: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8070: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
8080: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8090: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
80a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80e0: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
80f0: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8100: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8110: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8120: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8130: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8140: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8150: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
8160: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
8170: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
8180: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
8190: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
81a0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
81b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
81c0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
81d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8210: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8220: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8230: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8240: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8250: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8260: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8270: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8280: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
8290: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
82a0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
82b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
82c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
82d0: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
82e0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
82f0: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
8300: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8320: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8330: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
8340: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
8350: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
8360: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
8370: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
8380: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
8390: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
83a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
83b0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
83c0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
83d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
83e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
83f0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8400: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
8410: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8420: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8430: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8440: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
8450: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
8460: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
8470: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8480: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
8490: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
84a0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
84b0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29  [TLS_SSL3], -1))
84c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
84d0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
84e0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
84f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8500: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8510: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8520: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8530: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8540: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8550: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8560: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8570: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8580: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8590: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
85a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
85b0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
85c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85d0: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
85e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
85f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8600: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8610: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8620: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8630: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8640: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8650: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
8660: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8670: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
8680: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8690: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
86a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
86b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
86c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
86d0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
86e0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
86f0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8700: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8710: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8720: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8730: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8740: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8750: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8760: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8770: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8780: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
8790: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
87a0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
87b0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
87c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
87d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
87e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8820: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8830: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8840: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8850: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
8860: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
8870: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
8880: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
8890: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
88a0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
88b0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
88c0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
88d0: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
88e0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
88f0: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8900: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8910: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8920: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8960: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
8970: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
8980: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
8990: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
89a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
89b0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
89c0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
89d0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
89e0: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
89f0: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
8a00: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
8a10: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
8a20: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
8a30: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
8a40: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
8a50: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
8a60: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
8a70: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
8a80: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
8a90: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
8aa0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
8ab0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
8ac0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
8ad0: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8ae0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8af0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8b00: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
8b10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8b20: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8b30: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8b40: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8b50: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8b60: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8b70: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
8b80: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8b90: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8ba0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8bb0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8bc0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8bd0: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8be0: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8bf0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8c00: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8c10: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8c20: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8c30: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8c40: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8c50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8c60: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8c70: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8c80: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8c90: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8ca0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8cb0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8cc0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8cd0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8ce0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8cf0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
8d00: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
8d10: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
8d20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8d30: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
8d40: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
8d50: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
8d60: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
8d70: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
8d80: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8d90: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
8da0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8db0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
8dc0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
8dd0: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
8de0: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
8df0: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
8e00: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
8e10: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
8e20: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
8e30: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
8e40: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
8e50: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
8e60: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
8e70: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
8e80: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
8e90: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
8ea0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
8eb0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8ec0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8ed0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8ee0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8ef0: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8f00: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8f10: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8f20: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8f30: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8f40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8f50: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8f60: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8f70: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8f80: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
8f90: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
8fa0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
8fb0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
8fc0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
8fd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8fe0: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
8ff0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
9000: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
9010: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
9020: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
9030: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
9040: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
9050: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
9060: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
9070: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
9080: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
9090: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
90a0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
90b0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
90c0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
90d0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
90e0: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
90f0: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
9100: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
9110: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
9120: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
9130: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
9140: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
9150: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
9160: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
9170: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
9180: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
9190: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
91a0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
91b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
91c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9210: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
9220: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
9230: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9240: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
9250: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
9260: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
9270: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
9280: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
9290: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
92a0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
92b0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
92c0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
92d0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
92e0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
92f0: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
9300: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
9310: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9360: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
9370: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
9380: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9390: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
93a0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
93b0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
93c0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
93d0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
93e0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
93f0: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9400: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
9410: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
9420: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
9430: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
9440: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
9450: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9460: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
9470: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
9480: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
9490: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
94a0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
94b0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
94c0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
94d0: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
94e0: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
94f0: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9500: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9510: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
9520: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
9530: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
9540: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
9550: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
9560: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
9570: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
9580: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
9590: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
95a0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
95b0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
95c0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
95d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
95e0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
95f0: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9600: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
9610: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
9620: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9630: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
9640: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9650: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
9660: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
9670: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
9680: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
9690: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
96a0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
96b0: 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72  .    char *DHpar
96c0: 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ams..= NULL;.   
96d0: 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d   char *model...=
96e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
96f0: 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e  *servername..= N
9700: 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65  ULL;./* hostname
9710: 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65   for Server Name
9720: 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20   Indication */. 
9730: 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e     char *session
9740: 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  _id..= NULL;.   
9750: 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09   Tcl_Obj *alpn..
9760: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
9770: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
9780: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
9790: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
97a0: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
97b0: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
97c0: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
97d0: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
97e0: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
97f0: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
9800: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
9810: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28  shake = 0;.    (
9820: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
9830: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
9840: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
9850: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
9860: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9870: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
9880: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
9890: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
98a0: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
98b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
98c0: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
98d0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
98e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
98f0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9900: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9910: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
9920: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
9930: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
9940: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
9950: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9960: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
9970: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
9980: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
9990: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
99a0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
99b0: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
99c0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
99d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
99e0: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
99f0: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
9a00: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
9a10: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
9a20: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
9a30: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
9a40: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
9a50: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
9a60: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9a70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
9a80: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
9a90: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
9aa0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
9ab0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
9ac0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
9ad0: 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20  .    for (idx = 
9ae0: 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69  2; idx < objc; i
9af0: 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f  dx++) {..char *o
9b00: 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  pt = Tcl_GetStri
9b10: 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a  ng(objv[idx]);..
9b20: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
9b30: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
9b40: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22  ..OPTOBJ("-alpn"
9b50: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52  , alpn);..OPTSTR
9b60: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74  ("-cadir", CApat
9b70: 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  h);..OPTSTR("-ca
9b80: 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a  file", CAfile);.
9b90: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22  .OPTBYTE("-cert"
9ba0: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e  , cert, cert_len
9bb0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
9bc0: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
9bd0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
9be0: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
9bf0: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c00: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
9c10: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
9c20: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
9c30: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
9c40: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
9c50: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
9c60: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
9c70: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65  );..OPTBYTE("-ke
9c80: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e  y", key, key_len
9c90: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
9ca0: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
9cb0: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
9cc0: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
9cd0: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
9ce0: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
9cf0: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
9d00: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
9d10: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
9d20: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71  ("-request", req
9d30: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
9d40: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75  "-require", requ
9d50: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  ire);..OPTINT("-
9d60: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c  security_level",
9d70: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9d80: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9d90: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9da0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9db0: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9dc0: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9dd0: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9de0: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9df0: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9e00: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9e10: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9e20: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9e30: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9e40: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9e50: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9e60: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9e70: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9e80: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9e90: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9ea0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9eb0: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9ec0: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9ed0: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9ee0: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
9ef0: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
9f00: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
9f10: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
9f20: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
9f30: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
9f40: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
9f50: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
9f60: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
9f70: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d  ecurity_level, -
9f80: 73 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e  server, -servern
9f90: 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64  ame, -session_id
9fa0: 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20  , -ssl2, -ssl3, 
9fb0: 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20  -tls1, -tls1.1, 
9fc0: 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33  -tls1.2, -tls1.3
9fd0: 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f  , or -validateco
9fe0: 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72  mmand");...retur
9ff0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
a000: 20 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65   }.    if (reque
a010: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53  st)..verify |= S
a020: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
a030: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
a040: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
a050: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
a060: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ire).verify |= S
a070: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
a080: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
a090: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
a0a0: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
a0b0: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
a0c0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
a0d0: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28  DSHAKE;.    if (
a0e0: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65  verify == 0)..ve
a0f0: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46  rify = SSL_VERIF
a100: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f  Y_NONE;..    pro
a110: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c  to |= (ssl2 ? TL
a120: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30  S_PROTO_SSL2 : 0
a130: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a140: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl3 ? TLS_PROT
a150: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20  O_SSL3 : 0);.   
a160: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20   proto |= (tls1 
a170: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
a180: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a190: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c   |= (tls1_1 ? TL
a1a0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a  S_PROTO_TLS1_1 :
a1b0: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
a1c0: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f  = (tls1_2 ? TLS_
a1d0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30  PROTO_TLS1_2 : 0
a1e0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
a1f0: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52  (tls1_3 ? TLS_PR
a200: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b  OTO_TLS1_3 : 0);
a210: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74  ..    /* reset t
a220: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20  o NULL if blank 
a230: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20  string provided 
a240: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
a250: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20  && !*cert)..    
a260: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20      cert.       
a270: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a280: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09  (key && !*key)..
a290: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20          key.    
a2a0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a2b0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20  if (certfile && 
a2c0: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20  !*certfile)     
a2d0: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e      certfile.= N
a2e0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
a2f0: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c  file && !*keyfil
a300: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20  e)..keyfile.    
a310: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a320: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21  if (ciphers && !
a330: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20  *ciphers).      
a340: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20    ciphers.      
a350: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a360: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26   (ciphersuites &
a370: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73  & !*ciphersuites
a380: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20  ) ciphersuites  
a390: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a3a0: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
a3b0: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41  file).        CA
a3c0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
a3d0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70  ULL;.    if (CAp
a3e0: 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 29  ath && !*CApath)
a3f0: 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 09  .        CApath.
a400: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a410: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
a420: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
a430: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
a440: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a450: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
a460: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
a470: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
a480: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
a490: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
a4a0: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
a4b0: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
a4c0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
a4d0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
a4e0: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
a4f0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
a500: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
a510: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
a520: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
a530: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
a540: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
a550: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
a560: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
a570: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a580: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
a590: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
a5a0: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a5b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
a5c0: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
a5d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a5e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a5f0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
a600: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
a610: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
a620: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
a630: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a640: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
a650: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
a660: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a670: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
a680: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
a690: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a6a0: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
a6b0: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
a6c0: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a6d0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
a6e0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
a6f0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a700: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a710: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
a720: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a730: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
a740: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
a750: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a760: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
a770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a780: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
a790: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
a7a0: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
a7b0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
a7c0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
a7d0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
a7e0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
a7f0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
a800: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
a810: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
a820: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a830: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a840: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
a850: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
a860: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
a870: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
a880: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a890: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
a8a0: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
a8b0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
a8c0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
a8d0: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
a8e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a8f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
a900: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
a910: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
a920: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
a930: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
a940: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a950: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
a960: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
a970: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48  ", "IMPORT", "CH
a980: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
a990: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a9a0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
a9b0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a9c0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
a9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
a9e0: 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29  ctx = ((State *)
a9f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
aa00: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
aa10: 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c  )->ctx;.    } el
aa20: 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d  se {..if ((ctx =
aa30: 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50   CTX_Init(stateP
aa40: 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74  tr, server, prot
aa50: 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74  o, keyfile, cert
aa60: 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c  file, key, cert,
aa70: 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a   (int) key_len,.
aa80: 09 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f  .    (int) cert_
aa90: 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66  len, CApath, CAf
aaa0: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69  ile, ciphers, ci
aab0: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65  phersuites, leve
aac0: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d  l, DHparams)) ==
aad0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
aae0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
aaf0: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
ab00: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ab10: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
ab20: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
ab30: 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ctx;..    /*.   
ab40: 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d    * We need to m
ab50: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
ab60: 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20  e channel works 
ab70: 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74  in binary (for t
ab80: 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70  he.     * encryp
ab90: 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20  tion not to get 
aba0: 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20  goofed up)..    
abb0: 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20   * We only want 
abc0: 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75  to adjust the bu
abd0: 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76  ffering in pre-v
abe0: 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72  2 channels, wher
abf0: 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68  e.     * each ch
ac00: 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61  annel in the sta
ac10: 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74  ck maintained it
ac20: 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20  s own buffers.. 
ac30: 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44      */.    Tcl_D
ac40: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
ac50: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
ac60: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
ac70: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
ac80: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
ac90: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
aca0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
acb0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
acc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
acd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
ace0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
acf0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ad00: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ad10: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70  "-eofchar", &upp
ad20: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ad30: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ad40: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ad50: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f  rp, chan, "-enco
ad60: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  ding", &upperCha
ad70: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ad80: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ad90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ada0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
adb0: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ion", &upperChan
adc0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
add0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ade0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
adf0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
ae00: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
ae10: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
ae20: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
ae30: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
ae40: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
ae50: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20  n", "binary");. 
ae60: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ae70: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ae80: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
ae90: 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20  ", "true");.    
aea0: 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69  dprintf("Consumi
aeb0: 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25  ng Tcl channel %
aec0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
aed0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20  elName(chan));. 
aee0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c     statePtr->sel
aef0: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61  f = Tcl_StackCha
af00: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73  nnel(interp, Tls
af10: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20  _ChannelType(), 
af20: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
af30: 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41  tePtr,..(TCL_REA
af40: 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54  DABLE | TCL_WRIT
af50: 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20  ABLE), chan);.  
af60: 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74    dprintf("Creat
af70: 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64  ed channel named
af80: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
af90: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
afa0: 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69  r->self));.    i
afb0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  f (statePtr->sel
afc0: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  f == (Tcl_Channe
afd0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09  l) NULL) {../*..
afe0: 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c   * No use of Tcl
aff0: 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20  _EventuallyFree 
b000: 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69  because no possi
b010: 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65  ble Tcl_Preserve
b020: 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65  ... */..Tls_Free
b030: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
b040: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
b050: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
b060: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
b070: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
b080: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
b090: 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20  "-translation", 
b0a0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b0b0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
b0c0: 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20  anslation));.   
b0d0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
b0e0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
b0f0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
b100: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
b110: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
b120: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
b130: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  g));.    Tcl_Set
b140: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
b150: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
b160: 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22  self, "-eofchar"
b170: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b180: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b190: 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54  EOFChar));.    T
b1a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
b1b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
b1c0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c  ePtr->self, "-bl
b1d0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  ocking", Tcl_DSt
b1e0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b1f0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
b200: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b210: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b220: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
b230: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b240: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b250: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
b260: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b270: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
b280: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
b290: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b2a0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
b2b0: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ng);..    /*.   
b2c0: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
b2d0: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
b2e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
b2f0: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
b300: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
b310: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
b320: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
b330: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
b340: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b350: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
b360: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
b370: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f  session: ", GET_
b380: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b390: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b3a0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b3b0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b3c0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e  ", "IMPORT", "IN
b3d0: 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  IT", "FAILED", (
b3e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b3f0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b400: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
b410: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b420: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b430: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
b440: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
b450: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
b460: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
b470: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
b480: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
b490: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
b4a0: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
b4b0: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
b4c0: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
b4d0: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
b4e0: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
b4f0: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
b500: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
b510: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
b520: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b530: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
b540: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b550: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b560: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20  t SNI extension 
b570: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b580: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b590: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b5a0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b5b0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b5c0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b5d0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b5e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b5f0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b600: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b610: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b620: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  RROR;..}.../* Se
b630: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70  t hostname for p
b640: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  eer certificate 
b650: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63  hostname verific
b660: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73  ation in clients
b670: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20  ...   Don't use 
b680: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69  SSL_set1_host si
b690: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74  nce it has limit
b6a0: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28  ations. */..if (
b6b0: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73  !SSL_add1_host(s
b6c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
b6d0: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20  rvername)) {..  
b6e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b6f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b700: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69  DNS hostname fai
b710: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b720: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b730: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b740: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b750: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b760: 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41  IMPORT", "HOSTNA
b770: 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ME", "FAILED", (
b780: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b790: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b7a0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b7b0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b7c0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b7d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b7e0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b7f0: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b800: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b810: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b820: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b830: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b840: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b850: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b860: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b870: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b880: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09  tatePtr->ssl),..
b890: 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  .(const unsigned
b8a0: 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e   char *) session
b8b0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  _id, (unsigned i
b8c0: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69  nt) strlen(sessi
b8d0: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20  on_id))) {..    
b8e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b8f0: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65  (interp, "Resume
b900: 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a   session failed:
b910: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
b920: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
b930: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b940: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b950: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b960: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20  RT", "SESSION", 
b970: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b980: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b990: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b9a0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b9b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b9c0: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
b9d0: 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c 69   /* Enable Appli
b9e0: 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f  cation-Layer Pro
b9f0: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f  tocol Negotiatio
ba00: 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65 3a  n. Examples are:
ba10: 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70   http/1.0,..http
ba20: 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66 74  /1.1, h2, h3, ft
ba30: 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78  p, imap, pop3, x
ba40: 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70  mpp-client, xmpp
ba50: 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20 69  -server, mqtt, i
ba60: 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20  rc, etc. */.    
ba70: 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20  if (alpn) {../* 
ba80: 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69  Convert a TCL li
ba90: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63  st into a protoc
baa0: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d  ol-list in wire-
bab0: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67  format */..unsig
bac0: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73  ned char *protos
bad0: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , *p;..unsigned 
bae0: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  int protos_len =
baf0: 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e   0;..Tcl_Size cn
bb00: 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54  t, i;..int j;..T
bb10: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a  cl_Obj **list;..
bb20: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
bb30: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
bb40: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20  rp, alpn, &cnt, 
bb50: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  &list) != TCL_OK
bb60: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
bb70: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
bb80: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
bb90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
bba0: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
bbb0: 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
bbc0: 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f  ed for the proto
bbd0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72  col-list */..for
bbe0: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74   (i = 0; i < cnt
bbf0: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63  ; i++) {..    Tc
bc00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
bc10: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e  bj(list[i], &len
bc20: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20  );..    if (len 
bc30: 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41  > 255) {...Tcl_A
bc40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
bc50: 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63  rp, "ALPN protoc
bc60: 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e  ol names too lon
bc70: 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  g", (char *) NUL
bc80: 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72  L);...Tcl_SetErr
bc90: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
bca0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
bcb0: 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22  "ALPN", "FAILED"
bcc0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bcd0: 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68  ;...Tls_Free((ch
bce0: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
bcf0: 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
bd00: 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
bd10: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31   protos_len += 1
bd20: 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d   + (int) len;..}
bd30: 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20  .../* Build the 
bd40: 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f  complete protoco
bd50: 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f  l-list */..proto
bd60: 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74  s = ckalloc(prot
bd70: 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f  os_len);../* pro
bd80: 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73  tocol-lists cons
bd90: 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e  ist of 8-bit len
bda0: 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79  gth-prefixed, by
bdb0: 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66  te strings */..f
bdc0: 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70  or (j = 0, p = p
bdd0: 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20  rotos; j < cnt; 
bde0: 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72  j++) {..    char
bdf0: 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53   *str = Tcl_GetS
be00: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73  tringFromObj(lis
be10: 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  t[j], &len);..  
be20: 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e    *p++ = (unsign
be30: 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20  ed char) len;.. 
be40: 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72     memcpy(p, str
be50: 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b  , (size_t) len);
be60: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a  ..    p += len;.
be70: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  .}.../* SSL_set_
be80: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65  alpn_protos make
be90: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
bea0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
beb0: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20  ../* Note: This 
bec0: 66 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65  function reverse
bed0: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
bee0: 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f  ue convention */
bef0: 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c  ..if (SSL_set_al
bf00: 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50  pn_protos(stateP
bf10: 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c  tr->ssl, protos,
bf20: 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a   protos_len)) {.
bf30: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
bf40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
bf50: 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  et ALPN protocol
bf60: 73 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  s failed: ", GET
bf70: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
bf80: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
bf90: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
bfa0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
bfb0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
bfc0: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
bfd0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
bfe0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
bff0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
c000: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
c010: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
c020: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
c030: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
c040: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
c050: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c060: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
c070: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c080: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
c090: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
c0a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
c0b0: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
c0c0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
c0d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
c0e0: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
c0f0: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
c100: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
c110: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c120: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c130: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
c140: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c  to us */.    SSL
c150: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
c160: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
c170: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
c180: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  k);.    SSL_set_
c190: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
c1a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66  atePtr->ssl, Inf
c1b0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20  oCallback);..   
c1c0: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72   /* Callback for
c1d0: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f   observing proto
c1e0: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  col messages */.
c1f0: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
c200: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20  NO_SSL_TRACE.   
c210: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58   /* void SSL_CTX
c220: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c230: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c240: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c250: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64  tePtr);.    void
c260: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
c270: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c280: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65  tr->ctx, Message
c290: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20  Callback); */.  
c2a0: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
c2b0: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
c2c0: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
c2d0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
c2e0: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c2f0: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c300: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ssl, MessageCall
c310: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  back);.#endif.. 
c320: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
c330: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
c340: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
c350: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
c360: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
c370: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
c380: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
c390: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
c3a0: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
c3b0: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
c3c0: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61  /* Server callba
c3d0: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  cks */..SSL_CTX_
c3e0: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c3f0: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50  rname_arg(stateP
c400: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a  tr->ctx, (void *
c410: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
c420: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
c430: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62  servername_callb
c440: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
c450: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b  x, SNICallback);
c460: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
c470: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74  ient_hello_cb(st
c480: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c  atePtr->ctx, Hel
c490: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  loCallback, (voi
c4a0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c4b0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c4c0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  otos != NULL) {.
c4d0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c4e0: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28  _alpn_select_cb(
c4f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
c500: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
c510: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c520: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c530: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d      if (tls1_2 =
c540: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c550: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f   0) {...SSL_CTX_
c560: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f  set_next_protos_
c570: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74  advertised_cb(st
c580: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e  atePtr->ctx, NPN
c590: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
c5a0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
c5b0: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09    }.#endif..}...
c5c0: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72  /* Enable server
c5d0: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65   to send cert re
c5e0: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64  quest after hand
c5f0: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f  shake (TLS 1.3 o
c600: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72  nly) */../* A wr
c610: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75  ite operation mu
c620: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f  st take place fo
c630: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74  r the Certificat
c640: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a  e Request to be.
c650: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20  .   sent to the 
c660: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e  client, this can
c670: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53   be done with SS
c680: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29  L_do_handshake()
c690: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
c6a0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
c6b0: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b  ake && tls1_3) {
c6c0: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79  ..    SSL_verify
c6d0: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e  _client_post_han
c6e0: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d  dshake(statePtr-
c6f0: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73  >ssl);..}.../* s
c700: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72  et automatic cur
c710: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a  ve selection */.
c720: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75  .SSL_set_ecdh_au
c730: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  to(statePtr->ssl
c740: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73  , 1);.../* Set s
c750: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
c760: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
c770: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
c780: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
c790: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c7a0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
c7b0: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
c7c0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
c7d0: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
c7e0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c7f0: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
c800: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c810: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
c820: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c830: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
c840: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c850: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c860: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c870: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
c880: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
c890: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
c8a0: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
c8b0: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
c8c0: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
c8d0: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
c8e0: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
c8f0: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
c900: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
c910: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
c920: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
c930: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
c940: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
c950: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
c960: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
c970: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
c980: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
c990: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
c9a0: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
c9b0: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
c9c0: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
c9d0: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
c9e0: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
c9f0: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
ca00: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
ca10: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
ca20: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73  .    }.    SSL_s
ca30: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d  et_bio(statePtr-
ca40: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e  >ssl, statePtr->
ca50: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  p_bio, statePtr-
ca60: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f  >p_bio);.    BIO
ca70: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74  _set_ssl(statePt
ca80: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72  r->bio, statePtr
ca90: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  ->ssl, BIO_NOCLO
caa0: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  SE);..    /*.   
cab0: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49    * End of SSL I
cac0: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nit.     */.    
cad0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
cae0: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ng %s", Tcl_GetC
caf0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
cb00: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
cb10: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
cb20: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20  nterp, (char *) 
cb30: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cb40: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
cb50: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
cb60: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
cb70: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
cb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cbc0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f  ---. *. * Unimpo
cbd0: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
cbe0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
cbf0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
cc00: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73  emove the topmos
cc10: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72  t channel filter
cc20: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
cc30: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
cc40: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
cc50: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
cc60: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
cc70: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
cc80: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
cc90: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
cce0: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  int.UnimportObjC
ccf0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
cd00: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
cd10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
cd20: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
cd30: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
cd40: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
cd50: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
cd60: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
cd70: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
cd80: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
cd90: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
cda0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
cdb0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
cdc0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
cdd0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
cde0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
cdf0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ce00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  R;.    }..    ch
ce10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
ce20: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
ce30: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
ce40: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
ce50: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
ce60: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
ce70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ce80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
ce90: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
cea0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
ceb0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
cec0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ced0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
cee0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63  an);..    if (Tc
cef0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
cf00: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
cf10: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
cf20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
cf30: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
cf40: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
cf50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
cf60: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
cf70: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
cf80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
cf90: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
cfa0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
cfb0: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c  LS", "UNIMPORT",
cfc0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
cfd0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
cfe0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
cff0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d000: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
d010: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
d020: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
d030: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
d040: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
d050: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
d060: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
d070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d0b0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e  ---. *. * CTX_In
d0c0: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20  it -- construct 
d0d0: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  a SSL_CTX instan
d0e0: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ce. *. * Results
d0f0: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c  :. *.A valid SSL
d100: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72  _CTX instance or
d110: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64   NULL.. *. * Sid
d120: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
d130: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e  nstructs SSL con
d140: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
d150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d190: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53  ---. */.static S
d1a0: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69  SL_CTX *.CTX_Ini
d1b0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
d1c0: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
d1d0: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
d1e0: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20   *keyfile, char 
d1f0: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75  *certfile,.    u
d200: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
d210: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
d220: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f   *cert, int key_
d230: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65  len, int cert_le
d240: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
d250: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
d260: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
d270: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
d280: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
d290: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
d2a0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
d2b0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
d2c0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
d2d0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
d2e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
d2f0: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69  String ds;.    i
d300: 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72  nt off = 0, abor
d310: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  t = 0;.    int l
d320: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b  oad_private_key;
d330: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
d340: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
d350: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
d360: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
d370: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41  !proto) {..Tcl_A
d380: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d390: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72  rp, "no valid pr
d3a0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22  otocol selected"
d3b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d3c0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d3d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
d3e0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
d3f0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
d400: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
d410: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
d420: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
d430: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
d440: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
d450: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d460: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
d470: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
d480: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d490: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
d4a0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d4b0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d4c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d4d0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
d4e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d4f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d500: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
d510: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d520: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
d530: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
d540: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d550: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
d560: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d570: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d580: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d590: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
d5a0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
d5b0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d5c0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
d5d0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
d5e0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
d5f0: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
d600: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d610: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f  "TLS 1.0 protoco
d620: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d630: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d640: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d650: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d660: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d670: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
d680: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
d690: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d6a0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d6b0: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
d6c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d6d0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
d6e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d6f0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d700: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d710: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d720: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
d730: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
d740: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d750: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
d760: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d770: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d780: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
d790: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d7a0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
d7b0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
d7c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d7d0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d7e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
d7f0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
d800: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
d810: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
d820: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d830: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d840: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
d850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d860: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
d870: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
d880: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
d890: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
d8a0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
d8b0: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f  ndif.    if (pro
d8c0: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55  to == 0) {../* U
d8d0: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f  se full range */
d8e0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
d8f0: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
d900: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54  ctx, 0);..SSL_CT
d910: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
d920: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
d930: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
d940: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
d950: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
d960: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
d970: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
d980: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
d990: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d9a0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
d9b0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
d9c0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d9d0: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
d9e0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
d9f0: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
da00: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
da10: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
da20: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
da30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
da40: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
da50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
da60: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
da70: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
da80: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
da90: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
daa0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
dab0: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
dac0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
dad0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
dae0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
daf0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
db00: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
db10: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
db20: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
db30: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
db40: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
db50: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
db60: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
db70: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
db80: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
db90: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
dba0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
dbb0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dbc0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
dbd0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dbe0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
dbf0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
dc00: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
dc10: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
dc20: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
dc30: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
dc40: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
dc50: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
dc60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
dc70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
dc80: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
dc90: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
dca0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dcb0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
dcc0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
dcd0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
dce0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
dcf0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
dd00: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
dd10: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
dd20: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
dd30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dd40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
dd50: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dd60: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
dd70: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
dd80: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
dd90: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
dda0: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
ddb0: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
ddc0: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
ddd0: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
dde0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
ddf0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
de00: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
de10: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
de20: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
de30: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
de40: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
de50: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
de60: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
de70: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
de80: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
de90: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
dea0: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
deb0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
dec0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
ded0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
dee0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
def0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
df00: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
df10: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
df20: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
df30: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
df40: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
df50: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
df60: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
df70: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
df80: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
df90: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
dfa0: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
dfb0: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
dfc0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
dfd0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
dfe0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dff0: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
e000: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e010: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
e020: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
e030: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
e040: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e050: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
e060: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e070: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
e080: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e090: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
e0a0: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e0b0: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
e0c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e0d0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e0e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e0f0: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
e100: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e110: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
e120: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
e130: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
e140: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e150: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
e160: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e170: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
e180: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
e190: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e1a0: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
e1b0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
e1c0: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
e1d0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
e1e0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
e1f0: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
e200: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
e210: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
e220: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e230: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76  ..    if (getenv
e240: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29  (SSLKEYLOGFILE))
e250: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
e260: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28  keylog_callback(
e270: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  ctx, KeyLogCallb
e280: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ack);.    }..#if
e290: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e2a0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
e2b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e2c0: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74  _3).    if (prot
e2d0: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  o == TLS_PROTO_T
e2e0: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54  LS1_3) {..SSL_CT
e2f0: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
e300: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
e310: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53  1_3_VERSION);..S
e320: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
e330: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
e340: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
e350: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
e360: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69  .    /* Force ci
e370: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f  pher selection o
e380: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a  rder by server *
e390: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72  /.    if (!isSer
e3a0: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ver) {..SSL_CTX_
e3b0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
e3c0: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53   SSL_OP_CIPHER_S
e3d0: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45  ERVER_PREFERENCE
e3e0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  );.    }..#if OP
e3f0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
e400: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
e410: 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61  0L.    OpenSSL_a
e420: 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d  dd_all_algorithm
e430: 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70  s(); /* Load cip
e440: 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73  hers and digests
e450: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   */.#endif..    
e460: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
e470: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
e480: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
e490: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
e4a0: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
e4b0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e4c0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
e4d0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
e4e0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
e4f0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e500: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
e510: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53  L_OP_NO_COMPRESS
e520: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65  ION);./* disable
e530: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65   compression eve
e540: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a  n if supported *
e550: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
e560: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f  t_options(ctx, o
e570: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65  ff);../* disable
e580: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
e590: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ns */.#if OPENSS
e5a0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
e5b0: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   < 0x10101000L. 
e5c0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
e5d0: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
e5e0: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f  E_AUTO_RETRY);./
e5f0: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e  * handle new han
e600: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67  dshakes in backg
e610: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66  round. On by def
e620: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20  ault in OpenSSL 
e630: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66  1.1.1. */.#endif
e640: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
e650: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
e660: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
e670: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
e680: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
e690: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
e6a0: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
e6b0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
e6c0: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
e6d0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
e6e0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
e6f0: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
e700: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e710: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
e720: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
e730: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
e740: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
e750: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e760: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e770: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
e780: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
e790: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
e7a0: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
e7b0: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
e7c0: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
e7d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e7e0: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
e7f0: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
e800: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
e810: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
e820: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e830: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
e840: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
e850: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
e860: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65   */.    if (leve
e870: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20  l > -1 && level 
e880: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73  < 6) {../* SSL_s
e890: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
e8a0: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  l */..SSL_CTX_se
e8b0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
e8c0: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20  (ctx, level);.  
e8d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
e8e0: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a  some callbacks *
e8f0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
e900: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
e910: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72  _cb(ctx, Passwor
e920: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  dCallback);.    
e930: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
e940: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73  ult_passwd_cb_us
e950: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  erdata(ctx, (voi
e960: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a  d *)statePtr);..
e970: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69      /* read a Di
e980: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72  ffie-Hellman par
e990: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72  ameters file, or
e9a0: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   use the built-i
e9b0: 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c  n one */.    Tcl
e9c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
e9d0: 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  );.#ifdef OPENSS
e9e0: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
e9f0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
ea00: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
ea10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
ea20: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
ea30: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
ea40: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
ea50: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
ea60: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
ea70: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
ea80: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
ea90: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
eaa0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
eab0: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62  IO *bio;...    b
eac0: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c  io = BIO_new_fil
ead0: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20  e(F2N(DHparams, 
eae0: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20  &ds), "r");..   
eaf0: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54   if (!bio) {...T
eb00: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
eb10: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  ds);...Tcl_Appen
eb20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eb30: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20  "Could not find 
eb40: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69  DH parameters fi
eb50: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
eb60: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
eb70: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
eb80: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
eb90: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
eba0: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
ebb0: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
ebc0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
ebd0: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
ebe0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
ebf0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
ec00: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
ec10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ec20: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65  p, "Could not re
ec30: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  ad DH parameters
ec40: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68   from file", (ch
ec50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
ec60: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ec70: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
ec80: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c  ..    }..    SSL
ec90: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
eca0: 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44  ctx, dh);..    D
ecb0: 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20  H_free(dh);...} 
ecc0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55  else {..    /* U
ecd0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48  se well known DH
ece0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
ecf0: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73   have built-in s
ed00: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53  upport in OpenSS
ed10: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53  L */..    if (!S
ed20: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75  SL_CTX_set_dh_au
ed30: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09  to(ctx, 1)) {...
ed40: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ed50: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
ed60: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44  not enable set D
ed70: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45  H auto: ", GET_E
ed80: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
ed90: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
eda0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
edb0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
edc0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
edd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
ede0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63  set our certific
edf0: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f  ate */.    load_
ee00: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b  private_key = 0;
ee10: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
ee20: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  e != NULL) {..lo
ee30: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
ee40: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54   1;...if (SSL_CT
ee50: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
ee60: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
ee70: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
ee80: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
ee90: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
eea0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
eeb0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
eec0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
eed0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
eee0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
eef0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
ef00: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
ef10: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
ef20: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
ef30: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ef40: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
ef50: 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72  LL;..}..Tcl_DStr
ef60: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20  ingFree(&ds);.. 
ef70: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65     } else if (ce
ef80: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c  rt != NULL) {..l
ef90: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
efa0: 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54  = 1;..if (SSL_CT
efb0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
efc0: 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 74  e_ASN1(ctx, cert
efd0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30  _len, cert) <= 0
efe0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
eff0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f000: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f010: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
f020: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f030: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f040: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f050: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f060: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f070: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
f080: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
f090: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
f0a0: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
f0b0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
f0c0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
f0d0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
f0e0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
f0f0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
f100: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  0..    Tcl_Appen
f110: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f120: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
f130: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
f140: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
f150: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54  ile, ": ",...GET
f160: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f170: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f180: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
f190: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
f1a0: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
f1b0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
f1c0: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65   set our private
f1d0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
f1e0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
f1f0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  ) {..if (keyfile
f200: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20   == NULL && key 
f210: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
f220: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
f230: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79  le;..}...if (key
f240: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
f250: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20  .    /* get the 
f260: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
f270: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
f280: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
f290: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
f2a0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65   == NULL) {...ke
f2b0: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
f2c0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
f2d0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
f2e0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63  rivateKey_file(c
f2f0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c  tx, F2N(keyfile,
f300: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
f310: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
f320: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
f330: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
f340: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
f350: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
f360: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
f370: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
f380: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
f390: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
f3a0: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
f3b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
f3c0: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
f3d0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
f3e0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09  keyfile, " ",...
f3f0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53      GET_ERR_REAS
f400: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
f410: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
f420: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
f430: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
f440: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f450: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20  gFree(&ds);...} 
f460: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20  else if (key != 
f470: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
f480: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
f490: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50  vateKey_ASN1(EVP
f4a0: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20  _PKEY_RSA, ctx, 
f4b0: 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20  key,key_len) <= 
f4c0: 30 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  0) {.../* flush 
f4d0: 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
f4e0: 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
f4f0: 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
f500: 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
f510: 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
f520: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
f530: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f540: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f550: 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
f560: 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  key: ", GET_ERR_
f570: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f580: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
f590: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f5a0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
f5b0: 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20     }..}../* Now 
f5c0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b  we know that a k
f5d0: 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76 65  ey and cert have
f5e0: 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73   been set agains
f5f0: 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f  t.. * the SSL co
f600: 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53  ntext */..if (!S
f610: 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69  SL_CTX_check_pri
f620: 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b  vate_key(ctx)) {
f630: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
f640: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f650: 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73  private key does
f660: 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63   not match the c
f670: 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c 69  ertificate publi
f680: 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20  c key",....     
f690: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f6a0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
f6b0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
f6c0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20  urn NULL;..}.   
f6d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74   }..    /* Set t
f6e0: 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 6c 6f  o use default lo
f6f0: 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20  cation and file 
f700: 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65 20  for Certificate 
f710: 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 63  Authority (CA) c
f720: 65 72 74 69 66 69 63 61 74 65 73 2e 20 54 68 65  ertificates. The
f730: 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79 20 70  .     * verify p
f740: 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61  ath and store ca
f750: 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20  n be overridden 
f760: 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f  by the SSL_CERT_
f770: 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65  DIR env var. The
f780: 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 61 6e   verify file can
f790: 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65 72 72  .     * be overr
f7a0: 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c  idden by the SSL
f7b0: 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 76  _CERT_FILE env v
f7c0: 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  ar. */.    if (!
f7d0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f7e0: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73  ult_verify_paths
f7f0: 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b  (ctx)) {..abort+
f800: 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
f810: 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20 74   Overrides for t
f820: 68 65 20 43 41 20 76 65 72 69 66 79 20 70 61 74  he CA verify pat
f830: 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20  h and file */.  
f840: 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f    {.#if OPENSSL_
f850: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
f860: 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69 66   0x30000000L..if
f870: 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c   (CApath != NULL
f880: 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e 55   || CAfile != NU
f890: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44  LL) {..    Tcl_D
f8a0: 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20 20  String ds1;..   
f8b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
f8c0: 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69 66  (&ds1);...    if
f8d0: 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f   (!SSL_CTX_load_
f8e0: 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73  verify_locations
f8f0: 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65  (ctx, F2N(CAfile
f900: 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61  , &ds), F2N(CApa
f910: 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09  th, &ds1))) {...
f920: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
f930: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
f940: 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
f950: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f960: 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20  &ds1);...    /* 
f970: 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20  Set list of CAs 
f980: 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e  to send to clien
f990: 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  t when requestin
f9a0: 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69  g a client certi
f9b0: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f  ficate */..    /
f9c0: 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65  * https://source
f9d0: 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f  forge.net/p/tls/
f9e0: 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20  bugs/57/ */..   
f9f0: 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65   /* XXX:TODO: Le
fa00: 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c  t the user suppl
fa10: 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e  y values here in
fa20: 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69  stead of somethi
fa30: 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f  ng that exists o
fa40: 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
fa50: 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f   */..    STACK_O
fa60: 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65  F(X509_NAME) *ce
fa70: 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f  rtNames = SSL_lo
fa80: 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c  ad_client_CA_fil
fa90: 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  e(F2N(CAfile, &d
faa0: 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65  s));..    if (ce
fab0: 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29  rtNames != NULL)
fac0: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
fad0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
fae0: 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b  ctx, certNames);
faf0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
fb00: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
fb10: 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66  );..}..#else..if
fb20: 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c   (CApath != NULL
fb30: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53  ) {..    if (!SS
fb40: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
fb50: 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43  y_dir(ctx, F2N(C
fb60: 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a  Apath, &ds))) {.
fb70: 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20  ..abort++;..    
fb80: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
fb90: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a  ngFree(&ds);..}.
fba0: 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e  .if (CAfile != N
fbb0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28  ULL) {..    if (
fbc0: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
fbd0: 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46  rify_file(ctx, F
fbe0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29  2N(CAfile, &ds))
fbf0: 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09  ) {...abort++;..
fc00: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
fc10: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
fc20: 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69  ...    /* Set li
fc30: 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e  st of CAs to sen
fc40: 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e  d to client when
fc50: 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c   requesting a cl
fc60: 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65  ient certificate
fc70: 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f   */..    STACK_O
fc80: 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65  F(X509_NAME) *ce
fc90: 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f  rtNames = SSL_lo
fca0: 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c  ad_client_CA_fil
fcb0: 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  e(F2N(CAfile, &d
fcc0: 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65  s));..    if (ce
fcd0: 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29  rtNames != NULL)
fce0: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
fcf0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
fd00: 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b  ctx, certNames);
fd10: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
fd20: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
fd30: 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20  );..}.#endif.   
fd40: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63   }..    return c
fd50: 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tx;.}.../*. *---
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fda0: 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a  . *. * StatusObj
fdb0: 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65  Cmd -- return ce
fdc0: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f  rtificate for co
fdd0: 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a  nnected peer.. *
fde0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
fdf0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
fe00: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
fe10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
fe20: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
fe30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fe60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
fe70: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74  .static int.Stat
fe80: 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  usObjCmd(ClientD
fe90: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
fea0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
feb0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
fec0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
fed0: 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65  v[]) {.    State
fee0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20   *statePtr;.    
fef0: 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20  X509 *peer;.    
ff00: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
ff10: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
ff20: 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20   chan;.    char 
ff30: 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63  *channelName, *c
ff40: 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20  iphers;.    int 
ff50: 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  mode;.    const 
ff60: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
ff70: 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e  roto;.    unsign
ff80: 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20  ed int len;.    
ff90: 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20  int nid, res;.  
ffa0: 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
ffb0: 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  ata;..    dprint
ffc0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
ffd0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c    if (objc < 2 |
ffe0: 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f  | objc > 3 || (o
fff0: 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72  bjc == 3 && !str
10000 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  cmp(Tcl_GetStrin
10010 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f  g(objv[1]), "-lo
10020 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57  cal"))) {..Tcl_W
10030 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
10040 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d  rp, 1, objv, "?-
10050 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29  local? channel")
10060 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
10070 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
10080 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49  /* Get channel I
10090 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c  d */.    channel
100a0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
100b0 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20  ring(objv[(objc 
100c0 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b  == 2 ? 1 : 2)]);
100d0 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
100e0 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
100f0 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  p, channelName, 
10100 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28  &mode);.    if (
10110 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
10120 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
10130 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10140 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
10150 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
10160 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
10170 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
10180 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10190 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
101a0 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
101b0 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
101c0 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
101d0 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
101e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
101f0 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
10200 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
10210 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
10220 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c  ..."\": not a TL
10230 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61  S channel", (cha
10240 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  r *) NULL);..Tcl
10250 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
10260 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54  terp, "TLS", "ST
10270 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22  ATUS", "CHANNEL"
10280 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
10290 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
102a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
102b0 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
102c0 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54  tr = (State *) T
102d0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
102e0 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
102f0 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72  ..    /* Get cer
10300 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65  tificate for pee
10310 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20  r or self */.   
10320 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
10330 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65  {..peer = SSL_ge
10340 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61  t_peer_certifica
10350 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
10360 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
10370 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
10380 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74  certificate(stat
10390 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
103a0 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30  }.    /* Get X50
103b0 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
103c0 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65  fo */.    if (pe
103d0 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
103e0 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
103f0 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
10400 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
10410 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
10420 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
10430 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
10440 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
10450 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
10460 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
10470 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
10480 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
10490 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
104a0 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22  jPtr, "peername"
104b0 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e  , SSL_get0_peern
104c0 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
104d0 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  l), -1);.    LAP
104e0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
104f0 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22   objPtr, "sbits"
10500 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  , SSL_get_cipher
10510 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
10520 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20  ssl, NULL));..  
10530 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
10540 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
10550 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
10560 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
10570 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10580 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68  , "cipher", ciph
10590 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  ers, -1);..    /
105a0 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
105b0 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
105c0 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
105d0 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  eer */.    LAPPE
105e0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
105f0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65  bjPtr, "verifyRe
10600 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72  sult",..X509_ver
10610 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
10620 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
10630 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
10640 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
10650 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10660 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64   mode */.    mod
10670 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  e = SSL_get_veri
10680 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  fy_mode(statePtr
10690 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  ->ssl);.    if (
106a0 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
106b0 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50  FY_NONE) {..LAPP
106c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
106d0 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
106e0 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ode", "none", -1
106f0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
10700 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62  .Tcl_Obj *listOb
10710 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
10720 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
10730 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
10740 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a  _VERIFY_PEER) {.
10750 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
10760 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
10770 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
10780 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
10790 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b  bj("peer", -1));
107a0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
107b0 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
107c0 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
107d0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
107e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
107f0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
10800 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10810 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20  ingObj("fail if 
10820 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d  no peer cert", -
10830 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
10840 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10850 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09  CLIENT_ONCE) {..
10860 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
10870 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
10880 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
10890 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
108a0 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c  j("client once",
108b0 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
108c0 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
108d0 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
108e0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
108f0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10900 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
10910 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10920 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
10930 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
10940 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
10950 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10960 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
10970 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
10980 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
10990 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
109a0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
109b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
109c0 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
109d0 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
109e0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
109f0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
10a00 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
10a10 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
10a20 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
10a30 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
10a40 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
10a50 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
10a60 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
10a70 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10a80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10a90 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
10aa0 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a  )proto, (Tcl_Siz
10ab0 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  e) len);.    LAP
10ac0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10ad0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
10ae0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
10af0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
10b00 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  sl), -1);..    /
10b10 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
10b20 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
10b30 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
10b40 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
10b50 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
10b60 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
10b70 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10b80 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
10b90 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
10ba0 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10bb0 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10bc0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
10bd0 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
10be0 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
10bf0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10c00 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
10c10 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
10c20 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
10c30 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66  d), -1);..    if
10c40 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10c50 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
10c60 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
10c70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
10c80 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
10c90 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
10ca0 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
10cb0 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
10cc0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10cd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
10ce0 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a  res) {nid = 0;}.
10cf0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
10d00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10d10 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c  "signatureType",
10d20 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
10d30 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  , -1);..    Tcl_
10d40 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
10d50 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
10d60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10d70 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10dc0 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  . * ConnectionIn
10dd0 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  foObjCmd -- retu
10de0 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  rn connection in
10df0 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  fo from OpenSSL.
10e00 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
10e10 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e   *.A list of con
10e20 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a  nection info.  *
10e30 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e70 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
10e80 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f  ic int Connectio
10e90 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65  nInfoObjCmd(Clie
10ea0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
10eb0 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
10ec0 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
10ed0 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
10ee0 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
10ef0 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
10f00 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
10f10 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
10f20 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
10f30 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
10f40 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
10f50 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
10f60 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c  Tcl_Obj *objPtr,
10f70 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63   *listPtr;.    c
10f80 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20  onst SSL *ssl;. 
10f90 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50     const SSL_CIP
10fa0 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20  HER *cipher;.   
10fb0 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49   const SSL_SESSI
10fc0 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20  ON *session;.   
10fd0 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
10fe0 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  d;.    (void) cl
10ff0 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69  ientData;..    i
11000 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
11010 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
11020 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
11030 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
11040 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11050 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
11060 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
11070 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
11080 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11090 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
110a0 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
110b0 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
110c0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
110d0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
110e0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
110f0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
11100 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
11110 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
11120 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
11130 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
11140 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
11150 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
11160 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
11170 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11180 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
11190 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
111a0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
111b0 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
111c0 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
111d0 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
111e0 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
111f0 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
11200 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20  , "CONNECTION", 
11210 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
11220 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
11230 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
11240 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
11250 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
11260 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
11270 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f  ULL);..    /* Co
11280 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f  nnection info */
11290 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
112a0 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
112b0 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
112c0 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73  ata(chan);.    s
112d0 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73  sl = statePtr->s
112e0 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  sl;.    if (ssl 
112f0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63  != NULL) {../* c
11300 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20  onnection state 
11310 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11320 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11330 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61  "state", SSL_sta
11340 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
11350 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47  sl), -1);.../* G
11360 65 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64  et SNI requested
11370 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a   server name */.
11380 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11390 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
113a0 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67  rvername", SSL_g
113b0 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
113c0 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
113d0 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d  PE_host_name), -
113e0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f  1);.../* Get pro
113f0 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  tocol */..LAPPEN
11400 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11410 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
11420 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
11430 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f  n(ssl), -1);.../
11440 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20  * Renegotiation 
11450 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50  allowed */..LAPP
11460 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11470 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f   objPtr, "renego
11480 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22  tiation_allowed"
11490 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65  , SSL_get_secure
114a0 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73  _renegotiation_s
114b0 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73  upport((SSL *) s
114c0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73  sl));.../* Get s
114d0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
114e0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
114f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11500 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
11510 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79  SSL_get_security
11520 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09  _level(ssl));...
11530 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
11540 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11550 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11560 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64   "session_reused
11570 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72  ", SSL_session_r
11580 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f  eused(ssl));.../
11590 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f  * Is server info
115a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
115b0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
115c0 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53  , "is_server", S
115d0 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c  SL_is_server(ssl
115e0 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53  ));.../* Is DTLS
115f0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11600 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11610 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c  , "is_dtls", SSL
11620 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a  _is_dtls(ssl));.
11630 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69      }..    /* Ci
11640 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  pher info */.   
11650 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65   cipher = SSL_ge
11660 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72  t_current_cipher
11670 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63  (ssl);.    if (c
11680 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b  ipher != NULL) {
11690 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49  ..char buf[BUFSI
116a0 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62  Z] = {0};..int b
116b0 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a  its, alg_bits;..
116c0 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20  ./* Cipher name 
116d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
116e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
116f0 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49  "cipher", SSL_CI
11700 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69  PHER_get_name(ci
11710 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  pher), -1);.../*
11720 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70   RFC name of cip
11730 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
11740 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11750 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61  tr, "standard_na
11760 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  me", SSL_CIPHER_
11770 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
11780 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  pher), -1);.../*
11790 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66   OpenSSL name of
117a0 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
117b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
117c0 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c  objPtr, "openssl
117d0 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f  _name", OPENSSL_
117e0 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f  cipher_name(SSL_
117f0 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f  CIPHER_standard_
11800 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d  name(cipher)), -
11810 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20  1);.../* number 
11820 6f 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75  of secret bits u
11830 73 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a  sed for cipher *
11840 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49  /..bits = SSL_CI
11850 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69  PHER_get_bits(ci
11860 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29  pher, &alg_bits)
11870 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  ;..LAPPEND_INT(i
11880 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11890 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69  secret_bits", bi
118a0 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  ts);..LAPPEND_IN
118b0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
118c0 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74  , "algorithm_bit
118d0 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09  s", alg_bits);..
118e0 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61  /* alg_bits is a
118f0 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74  ctual key secret
11900 20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69   bits. If use bi
11910 74 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61  ts and secret (a
11920 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64  lgorithm) bits d
11930 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72  iffer,..   the r
11940 65 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20  est of the bits 
11950 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20  are fixed, i.e. 
11960 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f  for limited expo
11970 72 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73  rt ciphers (bits
11980 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49   < 56) */.../* I
11990 6e 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53  ndicates which S
119a0 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  SL/TLS protocol 
119b0 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65  version first de
119c0 66 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72  fined the cipher
119d0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
119e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
119f0 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20   "min_version", 
11a00 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76  SSL_CIPHER_get_v
11a10 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20  ersion(cipher), 
11a20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72  -1);.../* Cipher
11a30 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44   NID */..LAPPEND
11a40 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11a50 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22  Ptr, "cipherNID"
11a60 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11a70 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11a80 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63  get_cipher_nid(c
11a90 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
11aa0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11ab0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65  p, objPtr, "dige
11ac0 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  stNID", (char *)
11ad0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11ae0 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74  IPHER_get_digest
11af0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
11b00 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
11b10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11b20 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44   "keyExchangeNID
11b30 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
11b40 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
11b50 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68  _get_kx_nid(ciph
11b60 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  er)), -1);..LAPP
11b70 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11b80 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74  objPtr, "authent
11b90 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68  icationNID", (ch
11ba0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
11bb0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61  SSL_CIPHER_get_a
11bc0 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29  uth_nid(cipher))
11bd0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73  , -1);.../* mess
11be0 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69  age authenticati
11bf0 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72  on code - Cipher
11c00 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47   is AEAD (e.g. G
11c10 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50  CM or ChaCha20/P
11c20 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20  oly1305) or not 
11c30 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63  */../* Authentic
11c40 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20  ated Encryption 
11c50 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20  with associated 
11c60 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63  data (AEAD) chec
11c70 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  k */..LAPPEND_BO
11c80 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
11c90 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65  r, "cipher_is_ae
11ca0 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  ad", SSL_CIPHER_
11cb0 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29  is_aead(cipher))
11cc0 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73  ;.../* Digest us
11cd0 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53  ed during the SS
11ce0 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20  L/TLS handshake 
11cf0 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63  when using the c
11d00 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20  ipher. */..md = 
11d10 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68  SSL_CIPHER_get_h
11d20 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28  andshake_digest(
11d30 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e  cipher);..LAPPEN
11d40 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11d50 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65  jPtr, "handshake
11d60 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20  _digest", (char 
11d70 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64  *)EVP_MD_name(md
11d80 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
11d90 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
11da0 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
11db0 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  D */..LAPPEND_IN
11dc0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11dd0 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28  , "cipher_id", (
11de0 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
11df0 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b  get_id(cipher));
11e00 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49  .../* Two-byte I
11e10 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c  D used in the TL
11e20 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68  S protocol of th
11e30 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a  e given cipher *
11e40 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  /..LAPPEND_INT(i
11e50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11e60 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69  protocol_id", (i
11e70 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
11e80 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63  et_protocol_id(c
11e90 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65  ipher));.../* Te
11ea0 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f  xtual descriptio
11eb0 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20  n of the cipher 
11ec0 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  */..if (SSL_CIPH
11ed0 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
11ee0 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
11ef0 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
11f00 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  ) {..    LAPPEND
11f10 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11f20 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f  Ptr, "descriptio
11f30 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d  n", buf, -1);..}
11f40 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
11f50 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
11f60 20 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c     session = SSL
11f70 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c  _get_session(ssl
11f80 29 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69  );.    if (sessi
11f90 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  on != NULL) {..c
11fa0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11fb0 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a  ar *ticket;..siz
11fc0 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67  e_t len2;..unsig
11fd0 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63  ned int ulen;..c
11fe0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
11ff0 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20  ar *session_id, 
12000 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65  *proto;..unsigne
12010 64 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53  d char buffer[SS
12020 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
12030 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52  _LENGTH];.../* R
12040 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
12050 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
12060 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41   result of the A
12070 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  LPN negotiation 
12080 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
12090 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
120a0 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f  ed(session, &pro
120b0 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  to, &len2);..LAP
120c0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
120d0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
120e0 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c   (char *) proto,
120f0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
12100 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  );.../* Report t
12110 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
12120 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
12130 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f   of the NPN nego
12140 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65  tiation */.#ifde
12150 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67  f USE_NPN..SSL_g
12160 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e  et0_next_proto_n
12170 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26  egotiated(ssl, &
12180 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09  proto, &ulen);..
12190 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
121a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e  rp, objPtr, "npn
121b0 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74  ", (char *) prot
121c0 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  o, (Tcl_Size) ul
121d0 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  en);.#endif.../*
121e0 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69   Resumable sessi
121f0 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  on */..LAPPEND_B
12200 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
12210 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c  tr, "resumable",
12220 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f   SSL_SESSION_is_
12230 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f  resumable(sessio
12240 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n));.../* Sessio
12250 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65  n start time (se
12260 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63  conds since epoc
12270 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c  h) */..LAPPEND_L
12280 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ONG(interp, objP
12290 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22  tr, "start_time"
122a0 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
122b0 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29  t_time(session))
122c0 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76  ;.../* Timeout v
122d0 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67  alue - SSL_CTX_g
122e0 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73  et_timeout (in s
122f0 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50  econds) */..LAPP
12300 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
12310 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75   objPtr, "timeou
12320 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  t", SSL_SESSION_
12330 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73  get_timeout(sess
12340 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ion));.../* Sess
12350 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32  ion id - TLSv1.2
12360 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20   and below only 
12370 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
12380 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12390 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  _id(session, &ul
123a0 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  en);..LAPPEND_BA
123b0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
123c0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64  Ptr, "session_id
123d0 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
123e0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
123f0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f  .../* Session co
12400 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f  ntext */..sessio
12410 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  n_id = SSL_SESSI
12420 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65  ON_get0_id_conte
12430 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  xt(session, &ule
12440 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
12450 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12460 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e  tr, "session_con
12470 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69  text", session_i
12480 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c  d, (Tcl_Size) ul
12490 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  en);.../* Sessio
124a0 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e  n ticket - clien
124b0 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53  t only */..SSL_S
124c0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
124d0 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
124e0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
124f0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
12500 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
12510 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74  ssion_ticket", t
12520 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
12530 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65  ) len2);.../* Se
12540 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66  ssion ticket lif
12550 65 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73  etime hint (in s
12560 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50  econds) */..LAPP
12570 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
12580 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69   objPtr, "lifeti
12590 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  me", SSL_SESSION
125a0 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
125b0 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
125c0 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74  n));.../* Ticket
125d0 20 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66   app data */.#if
125e0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
125f0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
12600 30 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49  0000L..SSL_SESSI
12610 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61  ON_get0_ticket_a
12620 70 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53  ppdata((SSL_SESS
12630 49 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20  ION *) session, 
12640 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
12650 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
12660 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12670 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74   "ticket_app_dat
12680 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  a", ticket, (Tcl
12690 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65  _Size) len2);.#e
126a0 6e 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61  ndif.../* Get ma
126b0 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e  ster key */..len
126c0 32 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  2 = SSL_SESSION_
126d0 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73  get_master_key(s
126e0 65 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20  ession, buffer, 
126f0 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b  SSL_MAX_MASTER_K
12700 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50  EY_LENGTH);..LAP
12710 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12720 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73  rp, objPtr, "mas
12730 74 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72  ter_key", buffer
12740 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
12750 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73  2);.../* Compres
12760 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69  sion id */..unsi
12770 67 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53  gned int id = SS
12780 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f  L_SESSION_get_co
12790 6d 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f  mpress_id(sessio
127a0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
127b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
127c0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64   "compression_id
127d0 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c  ", id == 1 ? "zl
127e0 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  ib" : "none", -1
127f0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
12800 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66   Compression inf
12810 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c  o */.    if (ssl
12820 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64   != NULL) {.#ifd
12830 65 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50  ef HAVE_SSL_COMP
12840 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43  RESSION..const C
12850 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70  OMP_METHOD *comp
12860 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d  , *expn;..comp =
12870 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
12880 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c  _compression(ssl
12890 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67  );..expn = SSL_g
128a0 65 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e  et_current_expan
128b0 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50  sion(ssl);...LAP
128c0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
128d0 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
128e0 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53  ssion", comp ? S
128f0 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
12900 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c  (comp) : "none",
12910 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
12920 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12930 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
12940 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  expn ? SSL_COMP_
12950 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a  get_name(expn) :
12960 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
12970 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  lse..LAPPEND_STR
12980 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12990 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
129a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41  "none", -1);..LA
129b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
129c0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e  , objPtr, "expan
129d0 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  sion", "none", -
129e0 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  1);.#endif.    }
129f0 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20  ..    /* Server 
12a00 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c  info */.    {..l
12a10 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43  ong mode = SSL_C
12a20 54 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_get_session_c
12a30 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
12a40 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20  tr->ctx);..char 
12a50 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65  *msg;...if (mode
12a60 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12a70 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73  E_OFF) {..    ms
12a80 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c  g = "off";..} el
12a90 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
12aa0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49  L_SESS_CACHE_CLI
12ab0 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  ENT) {..    msg 
12ac0 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65  = "client";..} e
12ad0 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
12ae0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45  SL_SESS_CACHE_SE
12af0 52 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67  RVER) {..    msg
12b00 20 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20   = "server";..} 
12b10 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20  else if (mode & 
12b20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42  SSL_SESS_CACHE_B
12b30 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  OTH) {..    msg 
12b40 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73  = "both";..} els
12b50 65 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  e {..    msg = "
12b60 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41  unknown";..}..LA
12b70 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12b80 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
12b90 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20  on_cache_mode", 
12ba0 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  msg, -1);.    }.
12bb0 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20  .    /* CA List 
12bc0 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74  */.    /* IF not
12bd0 20 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20   a server, same 
12be0 61 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72  as SSL_get0_peer
12bf0 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72  _CA_list. If ser
12c00 76 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  ver same as SSL_
12c10 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_get_client_C
12c20 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69  A_list */.    li
12c30 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  stPtr = Tcl_NewL
12c40 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
12c50 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
12c60 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73  09_NAME) *ca_lis
12c70 74 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c  t;.    if ((ca_l
12c80 69 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c  ist = SSL_get_cl
12c90 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c  ient_CA_list(ssl
12ca0 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  )) != NULL) {..c
12cb0 68 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49  har buffer[BUFSI
12cc0 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  Z];..for (int i 
12cd0 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39  = 0; i < sk_X509
12ce0 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73  _NAME_num(ca_lis
12cf0 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  t); i++) {..    
12d00 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  X509_NAME *name 
12d10 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76  = sk_X509_NAME_v
12d20 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29  alue(ca_list, i)
12d30 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29  ;..    if (name)
12d40 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f   {...X509_NAME_o
12d50 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66  neline(name, buf
12d60 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09  fer, BUFSIZ);...
12d70 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12d80 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
12d90 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
12da0 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
12db0 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  r, -1));..    }.
12dc0 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  .}.    }.    LAP
12dd0 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
12de0 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
12df0 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  ", listPtr);.   
12e00 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
12e10 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
12e20 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58  ListCount", sk_X
12e30 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
12e40 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c  list));..    Tcl
12e50 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12e60 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20  terp, objPtr);. 
12e70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
12e80 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
12e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
12ed0 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62 6a 43  *. * VersionObjC
12ee0 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76 65 72  md -- return ver
12ef0 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72 6f 6d  sion string from
12f00 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20   OpenSSL.. *. * 
12f10 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
12f20 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
12f30 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
12f40 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
12f50 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f90 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
12fa0 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f 6e 4f  tic int.VersionO
12fb0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
12fc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
12fd0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
12fe0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
12ff0 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
13000 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
13010 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f  *objPtr;.    (vo
13020 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
13030 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 63 3b      (void) objc;
13040 0a 20 20 20 20 28 76 6f 69 64 29 20 6f 62 6a 76  .    (void) objv
13050 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
13060 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f  Called");..    o
13070 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53  bjPtr = Tcl_NewS
13080 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c  tringObj(OPENSSL
13090 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d  _VERSION_TEXT, -
130a0 31 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  1);.    Tcl_SetO
130b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
130c0 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72   objPtr);..    r
130d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
130e0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
130f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13130 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d   MiscObjCmd -- m
13140 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  isc commands. *.
13150 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
13160 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
13170 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
13180 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
13190 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
131d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
131e0 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63 4f  static int.MiscO
131f0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
13200 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
13210 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
13220 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
13230 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
13240 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63  ) {.    static c
13250 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61  onst char *comma
13260 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22  nds [] = { "req"
13270 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c  , "strreq", NULL
13280 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d   };.    enum com
13290 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f  mand { C_REQ, C_
132a0 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20  STRREQ, C_DUMMY 
132b0 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  };.    Tcl_Size 
132c0 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  cmd;.    int isS
132d0 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66  tr;.    char buf
132e0 66 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20 20  fer[16384];.    
132f0 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
13300 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
13310 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
13320 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
13330 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
13340 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
13350 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f  v, "subcommand ?
13360 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  args?");..return
13370 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
13380 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
13390 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
133a0 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63  terp, objv[1], c
133b0 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e  ommands, "comman
133c0 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d 20  d", 0, &cmd) != 
133d0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72  TCL_OK) {..retur
133e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
133f0 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
13400 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
13410 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20  isStr = (cmd == 
13420 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20 73  C_STRREQ);.    s
13430 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d  witch ((enum com
13440 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63 61  mand) cmd) {..ca
13450 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65 20  se C_REQ:..case 
13460 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20 20  C_STRREQ: {..   
13470 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d   EVP_PKEY *pkey=
13480 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 20  NULL;..    X509 
13490 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *cert=NULL;..   
134a0 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65   X509_NAME *name
134b0 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f  =NULL;..    Tcl_
134c0 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20  Obj **listv;..  
134d0 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74 63    Tcl_Size listc
134e0 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a 09  ;..    int i;...
134f0 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c      BIO *out=NUL
13500 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  L;...    char *k
13510 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a  _C="",*k_ST="",*
13520 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a  k_L="",*k_O="",*
13530 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22  k_OU="",*k_CN=""
13540 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20  ,*k_Email="";.. 
13550 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c     char *keyout,
13560 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20  *pemout,*str;.. 
13570 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73     int keysize,s
13580 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35  erial=0,days=365
13590 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
135a0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
135b0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
135c0 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e   BIGNUM *bne = N
135d0 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72  ULL;..    RSA *r
135e0 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65  sa = NULL;.#else
135f0 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43  ..    EVP_PKEY_C
13600 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
13610 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20  #endif...    if 
13620 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62  ((objc<5) || (ob
13630 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57  jc>6)) {...Tcl_W
13640 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
13650 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65  rp, 2, objv, "ke
13660 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65  ysize keyfile ce
13670 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b  rtfile ?info?");
13680 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13690 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ROR;..    }...  
136a0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74    if (Tcl_GetInt
136b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
136c0 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a  objv[2], &keysiz
136d0 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  e) != TCL_OK) {.
136e0 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
136f0 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
13700 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  keyout=Tcl_GetSt
13710 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09  ring(objv[3]);..
13720 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47      pemout=Tcl_G
13730 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
13740 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53 74  );..    if (isSt
13750 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61  r) {...Tcl_SetVa
13760 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c  r(interp,keyout,
13770 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74  "",0);...Tcl_Set
13780 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
13790 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a  t,"",0);..    }.
137a0 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d  ..    if (objc>=
137b0 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c  6) {...if (Tcl_L
137c0 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
137d0 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35  s(interp, objv[5
137e0 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73 74  ], &listc, &list
137f0 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  v) != TCL_OK) {.
13800 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13810 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
13820 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d 20  f ((listc%2) != 
13830 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  0) {...    Tcl_S
13840 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13850 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69 73  "Information lis
13860 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65 6e  t must have even
13870 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
13880 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ents",NULL);... 
13890 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
138a0 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20 28  ROR;...}...for (
138b0 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69 2b  i=0; i<listc; i+
138c0 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72 3d  =2) {...    str=
138d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
138e0 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20 69  stv[i]);...    i
138f0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 64  f (strcmp(str,"d
13900 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ays")==0) {....i
13910 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
13920 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
13930 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d 54  v[i+1],&days)!=T
13940 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65  CL_OK)....    re
13950 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13960 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13970 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65 72  (strcmp(str,"ser
13980 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 69  ial")==0) {....i
13990 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f (Tcl_GetIntFro
139a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73 74  mObj(interp,list
139b0 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29 21  v[i+1],&serial)!
139c0 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20  =TCL_OK)....    
139d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
139e0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
139f0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 43  f (strcmp(str,"C
13a00 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 3d  ")==0) {....k_C=
13a10 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13a20 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13a30 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13a40 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30 29  mp(str,"ST")==0)
13a50 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f 47   {....k_ST=Tcl_G
13a60 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13a70 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13a80 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13a90 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"L")==0) {....
13aa0 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_L=Tcl_GetStrin
13ab0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13ac0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13ad0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29 3d  strcmp(str,"O")=
13ae0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c  =0) {....k_O=Tcl
13af0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
13b00 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
13b10 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13b20 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b 0a  str,"OU")==0) {.
13b30 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74 53  ...k_OU=Tcl_GetS
13b40 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13b50 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13b60 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13b70 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  CN")==0) {....k_
13b80 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  CN=Tcl_GetString
13b90 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13ba0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13bb0 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69 6c  trcmp(str,"Email
13bc0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45 6d  ")==0) {....k_Em
13bd0 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  ail=Tcl_GetStrin
13be0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13bf0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
13c00 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
13c10 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70  nterp,"Unknown p
13c20 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29 3b  arameter",NULL);
13c30 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ....return TCL_E
13c40 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09 09  RROR;...    }...
13c50 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  }..    }..#if OP
13c60 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13c70 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13c80 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42 4e  0L..    bne = BN
13c90 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73 61  _new();..    rsa
13ca0 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09 20   = RSA_new();.. 
13cb0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50 4b     pkey = EVP_PK
13cc0 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 69  EY_new();..    i
13cd0 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c  f (bne == NULL |
13ce0 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  | rsa == NULL ||
13cf0 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   pkey == NULL ||
13d00 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62 6e   !BN_set_word(bn
13d10 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09 21  e,RSA_F4) ||...!
13d20 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65 79  RSA_generate_key
13d30 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a 65  _ex(rsa, keysize
13d40 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20  , bne, NULL) || 
13d50 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67 6e  !EVP_PKEY_assign
13d60 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29 29  _RSA(pkey, rsa))
13d70 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
13d80 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20 52  ee(pkey);.../* R
13d90 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66 72  SA_free(rsa); fr
13da0 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59 5f  eed by EVP_PKEY_
13db0 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72 65  free */...BN_fre
13dc0 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09 20  e(bne);.#else.. 
13dd0 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52 53     pkey = EVP_RS
13de0 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64 20  A_gen((unsigned 
13df0 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a 09  int) keysize);..
13e00 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50 4b      ctx = EVP_PK
13e10 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79 2c  EY_CTX_new(pkey,
13e20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28  NULL);..    if (
13e30 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  pkey == NULL || 
13e40 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21  ctx == NULL || !
13e50 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 5f  EVP_PKEY_keygen_
13e60 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09 21  init(ctx) ||...!
13e70 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74  EVP_PKEY_CTX_set
13e80 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74 73  _rsa_keygen_bits
13e90 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20 7c  (ctx, keysize) |
13ea0 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
13eb0 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29 20  en(ctx, &pkey)) 
13ec0 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  {...EVP_PKEY_fre
13ed0 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f 50  e(pkey);...EVP_P
13ee0 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74 78  KEY_CTX_free(ctx
13ef0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c 5f  );.#endif...Tcl_
13f00 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13f10 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69  ,"Error generati
13f20 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22 2c  ng private key",
13f30 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20  NULL);...return 
13f40 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
13f50 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28 69  } else {...if (i
13f60 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75  sStr) {...    ou
13f70 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  t=BIO_new(BIO_s_
13f80 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45  mem());...    PE
13f90 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76  M_write_bio_Priv
13fa0 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c  ateKey(out,pkey,
13fb0 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c  NULL,NULL,0,NULL
13fc0 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69 3d  ,NULL);...    i=
13fd0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
13fe0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
13ff0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
14000 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
14010 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
14020 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
14030 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
14040 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
14050 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
14060 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14070 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
14080 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
14090 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
140a0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
140b0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
140c0 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20 20  t,keyout);...   
140d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
140e0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
140f0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
14100 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
14110 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62 69   /* PEM_write_bi
14120 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79 28  o_RSAPrivateKey(
14130 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c 20  out, rsa, NULL, 
14140 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e  NULL, 0, NULL, N
14150 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20 42  ULL); */...    B
14160 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
14170 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28 63  ;.. .}....if ((c
14180 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29 3d  ert=X509_new())=
14190 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54  =NULL) {...    T
141a0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
141b0 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
141c0 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  ating certificat
141d0 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c 29  e request",NULL)
141e0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
141f0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
14200 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
14210 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
14220 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
14230 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
14240 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
14250 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
14260 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e  X509_set_version
14270 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31  (cert,2);...ASN1
14280 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35 30  _INTEGER_set(X50
14290 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62  9_get_serialNumb
142a0 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c 29  er(cert),serial)
142b0 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
142c0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
142d0 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30 29  tBefore(cert),0)
142e0 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f  ;...X509_gmtime_
142f0 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f  adj(X509_getm_no
14300 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c 6f  tAfter(cert),(lo
14310 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79 73  ng)60*60*24*days
14320 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70 75  );...X509_set_pu
14330 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29 3b  bkey(cert,pkey);
14340 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65  ....name=X509_ge
14350 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63  t_subject_name(c
14360 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41  ert);....X509_NA
14370 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
14380 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42  txt(name,"C", MB
14390 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
143a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
143b0 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c   *) k_C, -1, -1,
143c0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
143d0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
143e0 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53  t(name,"ST", MBS
143f0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
14400 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
14410 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c  *) k_ST, -1, -1,
14420 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
14430 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
14440 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54  t(name,"L", MBST
14450 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14460 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14470 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_L, -1, -1, 0
14480 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14490 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
144a0 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49  name,"O", MBSTRI
144b0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
144c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
144d0 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_O, -1, -1, 0);
144e0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
144f0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14500 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e  me,"OU", MBSTRIN
14510 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14520 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14530 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _OU, -1, -1, 0);
14540 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
14550 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
14560 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e  me,"CN", MBSTRIN
14570 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14580 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14590 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _CN, -1, -1, 0);
145a0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
145b0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
145c0 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54  me,"Email", MBST
145d0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
145e0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
145f0 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d  ) k_Email, -1, -
14600 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73  1, 0);....X509_s
14610 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
14620 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69  cert,name);....i
14630 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63 65  f (!X509_sign(ce
14640 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61 32  rt,pkey,EVP_sha2
14650 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20 58  56())) {...    X
14660 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
14670 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66  ..    EVP_PKEY_f
14680 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f  ree(pkey);.#if O
14690 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
146a0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
146b0 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65  00L...    BN_fre
146c0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
146d0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
146e0 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
146f0 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66 69   signing certifi
14700 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20  cate",NULL);... 
14710 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14720 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28  ROR;...}....if (
14730 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
14740 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
14750 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
14760 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
14770 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14780 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
14790 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
147a0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
147b0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
147c0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
147d0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
147e0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
147f0 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,pemout,buffer,0
14800 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
14810 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
14820 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
14830 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
14840 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
14850 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
14860 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
14870 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a  me(out,pemout);.
14880 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
14890 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72  bio_X509(out,cer
148a0 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
148b0 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d  ee_all(out);...}
148c0 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63 65  ....X509_free(ce
148d0 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  rt);...EVP_PKEY_
148e0 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
148f0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
14900 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
14910 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62  000L...BN_free(b
14920 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20  ne);.#endif..   
14930 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20   }..}..break;.  
14940 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65 61    default:..brea
14950 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  k;.    }.    ret
14960 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
14970 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
14980 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20  *****/./* Init  
14990 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a             */./*
149a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149b0 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ***/../*. *-----
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14a00 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d  *. * Tls_Free --
14a10 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
14a20 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
14a30 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
14a40 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
14a50 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
14a60 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
14a70 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
14a80 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73   1. *. * Results
14a90 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
14aa0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14ab0 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
14ac0 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
14ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14b10 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65 28  /.void.Tls_Free(
14b20 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29 20  char *blockPtr) 
14b30 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
14b40 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
14b50 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20  )blockPtr;..    
14b60 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
14b70 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61  );..    Tls_Clea
14b80 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  n(statePtr);.   
14b90 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72   ckfree(blockPtr
14ba0 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14bf0 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20   *. * Tls_Clean 
14c00 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
14c10 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75  ocedure cleans u
14c20 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63  p when a SSL soc
14c30 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65  ket based channe
14c40 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61  l. *.is closed a
14c50 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65  nd its reference
14c60 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c   count falls bel
14c70 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75  ow 1.  This shou
14c80 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20  ld. *.be called 
14c90 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79  synchronously by
14ca0 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20   the CloseProc, 
14cb0 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76  not in the. *.Ev
14cc0 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c  entuallyFree cal
14cd0 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
14ce0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
14cf0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
14d00 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
14d10 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43  -. */.void Tls_C
14d70 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74  lean(State *stat
14d80 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69  ePtr) {.    dpri
14d90 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
14da0 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65      /*.     * we
14db0 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72  're assuming her
14dc0 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69 6e  e that we're sin
14dd0 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20  gle-threaded.   
14de0 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61    */.    if (sta
14df0 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20  tePtr->timer != 
14e00 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29  (Tcl_TimerToken)
14e10 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65   NULL) {..Tcl_De
14e20 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72  leteTimerHandler
14e30 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
14e40 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69  );..statePtr->ti
14e50 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  mer = NULL;.    
14e60 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
14e70 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09  Ptr->protos) {..
14e80 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  ckfree(statePtr-
14e90 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65  >protos);..state
14ea0 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
14eb0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
14ec0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
14ed0 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
14ee0 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
14ef0 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
14f00 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
14f10 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
14f20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
14f30 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
14f40 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
14f50 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
14f60 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14f70 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  f (statePtr->ssl
14f80 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53  ) {..dprintf("SS
14f90 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74 61  L_free(%p)", sta
14fa0 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53  tePtr->ssl);..SS
14fb0 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  L_free(statePtr-
14fc0 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72  >ssl);..statePtr
14fd0 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ssl = NULL;.  
14fe0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14ff0 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53  ePtr->ctx) {..SS
15000 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65  L_CTX_free(state
15010 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74  Ptr->ctx);..stat
15020 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c  ePtr->ctx = NULL
15030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
15040 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
15050 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
15060 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
15070 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
15080 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
15090 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
150a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
150b0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
150c0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
150d0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
150e0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
150f0 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
15100 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15110 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a  atePtr->vcmd) {.
15120 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
15130 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
15140 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63  );..statePtr->vc
15150 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  md = NULL;.    }
15160 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52  ..    dprintf("R
15170 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a  eturning");.}...
15180 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
15190 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e  RSION > 8.#defin
151a0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39  e MIN_VERSION "9
151b0 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .0".#else.#defin
151c0 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38  e MIN_VERSION "8
151d0 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20  .5".#endif../*. 
151e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
151f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15210 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15220 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49  ----. *. * Tls_I
15230 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  nit --. *. *.Thi
15240 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69  s is a package i
15250 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
15260 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69  ocedure, which i
15270 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54  s called. *.by T
15280 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63  cl when this pac
15290 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64  kage is to be ad
152a0 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70  ded to an interp
152b0 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  reter.. *. * Res
152c0 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69  ults:  Ssl confi
152d0 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64  gured and loaded
152e0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
152f0 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20  cts:. *. create 
15300 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c  the ssl command,
15310 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20   initialize ssl 
15320 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d  context. *. *---
15330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15370 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
15380 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f  nt Tls_Init(Tcl_
15390 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
153a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
153b0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
153c0 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65  t[] = {.#include
153d0 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78   "tls.tcl.h"..0x
153e0 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64  00.    };..    d
153f0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
15400 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43  ;..#ifdef USE_TC
15410 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28  L_STUBS.    if (
15420 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
15430 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  terp, MIN_VERSIO
15440 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  N, 0) == NULL) {
15450 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
15460 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
15470 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67  .    if (Tcl_Pkg
15480 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
15490 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49  "Tcl", MIN_VERSI
154a0 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20  ON, 0) == NULL) 
154b0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
154c0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
154d0 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30  if (TlsLibInit(0
154e0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
154f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15500 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20  (interp, "could 
15510 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53  not initialize S
15520 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68  SL library", (ch
15530 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
15540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15550 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
15560 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15570 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
15580 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72  ciphers", Cipher
15590 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
155a0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
155b0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
155c0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
155d0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
155e0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
155f0 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43  ::connection", C
15600 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
15610 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15620 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15630 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15640 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15650 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15660 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61  terp, "::tls::ha
15670 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
15680 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  akeObjCmd, (Clie
15690 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
156a0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
156b0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
156c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
156d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
156e0 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70  ls::import", Imp
156f0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
15700 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
15710 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15720 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15730 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15740 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
15750 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55  ls::unimport", U
15760 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28  nimportObjCmd, (
15770 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
15780 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15790 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
157a0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
157b0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
157c0 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c  "::tls::status",
157d0 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28   StatusObjCmd, (
157e0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
157f0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15800 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15810 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15820 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15830 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22  "::tls::version"
15840 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c  , VersionObjCmd,
15850 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
15860 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
15870 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
15880 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
15890 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
158a0 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63 22 2c  , "::tls::misc",
158b0 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c   MiscObjCmd, (Cl
158c0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
158d0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
158e0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
158f0 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15900 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
15910 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22  :tls::protocols"
15920 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  , ProtocolsObjCm
15930 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15940 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
15950 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
15960 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
15970 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28 69  rp && Tcl_Eval(i
15980 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
15990 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c 5f  tScript) != TCL_
159a0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
159b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
159c0 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
159d0 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
159e0 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20  , PACKAGE_NAME, 
159f0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
15a00 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a40 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65  *. *. *.Tls_Safe
15a50 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15a90 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63   *.Standard proc
15aa0 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62  edure required b
15ab0 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69  y 'load'.. *.Ini
15ac0 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78  tializes this ex
15ad0 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61  tension for a sa
15ae0 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  fe interpreter..
15af0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
15b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
15b30 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20  effects:. *..As 
15b40 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
15b50 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
15b60 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65  A standard Tcl e
15b70 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a  rror code.. *. *
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bb0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45  ------*. */.DLLE
15bc0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
15bd0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
15be0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
15bf0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15c00 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
15c10 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  ls_Init(interp);
15c20 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
15c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15c60 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69  . *. *.TlsLibIni
15c70 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d  t --. *. *.-----
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09  -----------*. *.
15cb0 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  Initializes SSL 
15cc0 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72  library once per
15cd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 09   application. *.
15ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d10 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66  *. *. *.Side eff
15d20 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69 61  ects:. *..initia
15d30 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
15d40 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  y. *. *.Result:.
15d50 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d   *..none. *. *--
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  ----*. */.static
15da0 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28   int TlsLibInit(
15db0 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  int uninitialize
15dc0 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69  ) {.    static i
15dd0 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  nt initialized =
15de0 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 74   0;.    int stat
15df0 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66  us = TCL_OK;.#if
15e00 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15e10 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15e20 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15e30 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75 6d  ).    size_t num
15e40 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a  _locks;.#endif..
15e50 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69 61      if (uninitia
15e60 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69 6e  lize) {..if (!in
15e70 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20 20  itialized) {..  
15e80 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64    dprintf("Asked
15e90 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   to uninitialize
15ea0 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f 74  , but we are not
15eb0 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b 0a   initialized");.
15ec0 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
15ed0 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74  _OK;..}...dprint
15ee0 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e  f("Asked to unin
15ef0 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66  itialize");..#if
15f00 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15f10 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15f20 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15f30 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b  )..Tcl_MutexLock
15f40 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66  (&init_mx);...if
15f50 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20   (locks) {..    
15f60 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20  free(locks);..  
15f70 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a    locks = NULL;.
15f80 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20  .    locksCount 
15f90 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09  = 0;..}.#endif..
15fa0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b  initialized = 0;
15fb0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
15fc0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15fd0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15fe0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
15ff0 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  xUnlock(&init_mx
16000 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  );.#endif...retu
16010 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
16020 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74 69 61  ..    if (initia
16030 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74  lized) {..dprint
16040 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75  f("Called, but u
16050 73 69 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75  sing cached valu
16060 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73 74 61  e");..return sta
16070 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tus;.    }..    
16080 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
16090 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
160a0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
160b0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
160c0 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c  THREADS).    Tcl
160d0 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
160e0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  _mx);.#endif.   
160f0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31   initialized = 1
16100 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
16110 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
16120 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
16130 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f  HREADS).    num_
16140 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c  locks = 1;.    l
16150 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74  ocksCount = (int
16160 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20  ) num_locks;.   
16170 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28   locks = malloc(
16180 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a  sizeof(*locks) *
16190 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20   num_locks);.   
161a0 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30   memset(locks, 0
161b0 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  , sizeof(*locks)
161c0 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23   * num_locks);.#
161d0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e  endif..    /* In
161e0 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69  itialize BOTH li
161f0 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73  bcrypto and libs
16200 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53  sl. */.    OPENS
16210 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e  SL_init_ssl(OPEN
16220 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53  SSL_INIT_LOAD_SS
16230 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e  L_STRINGS | OPEN
16240 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52  SSL_INIT_LOAD_CR
16250 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20  YPTO_STRINGS..| 
16260 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44  OPENSSL_INIT_ADD
16270 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f  _ALL_CIPHERS | O
16280 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
16290 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c  ALL_DIGESTS, NUL
162a0 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77  L);..    BIO_new
162b0 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a  _tcl(NULL, 0);..
162c0 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20  #if 0.    /*.   
162d0 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65    * XXX:TODO: Re
162e0 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61  move this code a
162f0 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  nd replace it wi
16300 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20  th a check.     
16310 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74  * for enough ent
16320 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20  ropy and do not 
16330 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75  try to create ou
16340 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72  r own.     * ter
16350 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20  rible entropy.  
16360 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20     */.    /*.   
16370 20 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e    * Seed the ran
16380 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
16390 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20  ator in the SSL 
163a0 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20  library,.     * 
163b0 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69  using the do/whi
163c0 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63  le construct bec
163d0 61 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20  ause of the bug 
163e0 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20  note in the.    
163f0 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61   * OpenSSL FAQ a
16400 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65  t http://www.ope
16410 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74  nssl.org/support
16420 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a  /faq.html#USER1.
16430 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
16440 65 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72  e crux of the pr
16450 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f  oblem is that So
16460 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74  laris 7 does not
16470 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f   have a.     * /
16480 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64  dev/random or /d
16490 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63  ev/urandom devic
164a0 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67  e so it cannot g
164b0 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20  ather enough.   
164c0 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d    * entropy from
164d0 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29   the RAND_seed()
164e0 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61   when TLS initia
164f0 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65  lizes and refuse
16500 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66  s.     * to go f
16510 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20  urther. Earlier 
16520 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e  versions of Open
16530 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72  SSL carried on r
16540 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20  egardless..     
16550 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e  */.    srand((un
16560 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65  signed int) time
16570 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c  ((time_t *) NULL
16580 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f  ));.    do {..fo
16590 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36  r (i = 0; i < 16
165a0 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e  ; i++) {..    rn
165b0 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20  d_seed[i] = 1 + 
165c0 28 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20  (char) (255.0 * 
165d0 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58  rand()/(RAND_MAX
165e0 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44  +1.0));..}..RAND
165f0 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20  _seed(rnd_seed, 
16600 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29  sizeof(rnd_seed)
16610 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28  );.    } while (
16620 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d  RAND_status() !=
16630 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   1);.#endif..#if
16640 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
16650 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
16660 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
16670 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
16680 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
16690 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
166a0 20 73 74 61 74 75 73 3b 0a 7d 0a                  status;.}.