Hex Artifact Content

Artifact 3f80fde03194f1d99cb9516611f291b927a9c1024fc575178612f1e131a3e3c5:


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: 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75  crypto.h>.#inclu
03a0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e  de <openssl/ssl.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03c0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e 63  nssl/evp.h>.#inc
03d0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 62  lude <openssl/ob
03e0: 6a 65 63 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  jects.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66  /*. * External f
04b0: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a  unctions. */../*
04c0: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  . * Forward decl
04d0: 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64  arations. */..#d
04e0: 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64  efine F2N(key, d
04f0: 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d  sp) \..(((key) =
0500: 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20  = NULL) ? (char 
0510: 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63  *) NULL : \...Tc
0520: 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
0530: 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79  ame(interp, (key
0540: 29 2c 20 28 64 73 70 29 29 29 0a 23 64 65 66 69  ), (dsp))).#defi
0550: 6e 65 20 52 45 41 53 4f 4e 28 29 09 45 52 52 5f  ne REASON().ERR_
0560: 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74 72  reason_error_str
0570: 69 6e 67 28 45 52 52 5f 67 65 74 5f 65 72 72 6f  ing(ERR_get_erro
0580: 72 28 29 29 0a 0a 73 74 61 74 69 63 20 53 53 4c  r())..static SSL
0590: 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74 28 53  _CTX *CTX_Init(S
05a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
05b0: 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e  int isServer, in
05c0: 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b  t proto, char *k
05d0: 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65 72 74  ey,...char *cert
05e0: 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  file, unsigned c
05f0: 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c 20 75  har *key_asn1, u
0600: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
0610: 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74 20 6b  rt_asn1,...int k
0620: 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69 6e 74  ey_asn1_len, int
0630: 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e 2c 20   cert_asn1_len, 
0640: 63 68 61 72 20 2a 43 41 64 69 72 2c 20 63 68 61  char *CAdir, cha
0650: 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09 63 68 61  r *CAfile,...cha
0660: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
0670: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
0680: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
0690: 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a 73 74 61  *DHparams);..sta
06a0: 74 69 63 20 69 6e 74 09 54 6c 73 4c 69 62 49 6e  tic int.TlsLibIn
06b0: 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
06c0: 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e 65 20 54  ize);..#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 09 09 30  LS_PROTO_SSL2..0
06e0: 78 30 31 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x01.#define TLS_
06f0: 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30 78 30 32  PROTO_SSL3..0x02
0700: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0710: 54 4f 5f 54 4c 53 31 09 09 30 78 30 34 0a 23 64  TO_TLS1..0x04.#d
0720: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
0730: 54 4c 53 31 5f 31 09 30 78 30 38 0a 23 64 65 66  TLS1_1.0x08.#def
0740: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
0750: 53 31 5f 32 09 30 78 31 30 0a 23 64 65 66 69 6e  S1_2.0x10.#defin
0760: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
0770: 5f 33 09 30 78 32 30 0a 23 64 65 66 69 6e 65 20  _3.0x20.#define 
0780: 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c 20 6d 61  ENABLED(flag, ma
0790: 73 6b 29 09 28 28 28 66 6c 61 67 29 20 26 20 28  sk).(((flag) & (
07a0: 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61 73 6b 29  mask)) == (mask)
07b0: 29 0a 0a 23 64 65 66 69 6e 65 20 53 53 4c 4b 45  )..#define SSLKE
07c0: 59 4c 4f 47 46 49 4c 45 09 09 22 53 53 4c 4b 45  YLOGFILE.."SSLKE
07d0: 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a 0a 20 2a  YLOGFILE"../*. *
07e0: 20 53 74 61 74 69 63 20 64 61 74 61 20 73 74 72   Static data str
07f0: 75 63 74 75 72 65 73 0a 20 2a 2f 0a 0a 23 69 66  uctures. */..#if
0800: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
0810: 44 48 0a 23 69 6e 63 6c 75 64 65 20 22 64 68 5f  DH.#include "dh_
0820: 70 61 72 61 6d 73 2e 68 22 0a 23 65 6e 64 69 66  params.h".#endif
0830: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53  ../*. * Thread-S
0840: 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f  afe TLS Code. */
0850: 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52  ..#ifdef TCL_THR
0860: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45  EADS.#define OPE
0870: 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49  NSSL_THREAD_DEFI
0880: 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  NES.#include <op
0890: 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e  enssl/opensslcon
08a0: 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45  f.h>..#ifdef OPE
08b0: 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e  NSSL_THREADS.#in
08c0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63  clude <openssl/c
08d0: 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  rypto.h>.#includ
08e0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68  e <openssl/ssl.h
08f0: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65  >../*. * Threade
0900: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75  d operation requ
0910: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c  ires locking cal
0920: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20  lbacks. * Based 
0930: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79  from /crypto/cry
0940: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53  ptlib.c of OpenS
0950: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c  SL and NSOpenSSL
0960: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63  .. */..static Tc
0970: 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d  l_Mutex *locks =
0980: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e   NULL;.static in
0990: 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30  t locksCount = 0
09a0: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74  ;.static Tcl_Mut
09b0: 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64  ex init_mx;.#end
09c0: 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48  if /* OPENSSL_TH
09d0: 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20  READS */.#endif 
09e0: 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a  /* TCL_THREADS *
09f0: 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..../**********
0a00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43  **********/./* C
0a10: 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20  allbacks        
0a20: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
0a30: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a80: 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43  ---. *. * Eval C
0a90: 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20  allback Command 
0aa0: 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61  --. *. *.Eval ca
0ab0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61  llback command a
0ac0: 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72  nd catch any err
0ad0: 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ors. *. * Result
0ae0: 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e  s:. *.0 = Comman
0af0: 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20  d returned fail 
0b00: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0b10: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20   TCL_ERROR. *.1 
0b20: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  = Command return
0b30: 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76  ed success or ev
0b40: 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f  al returned TCL_
0b50: 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OK. *. * Side ef
0b60: 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61  fects:. *.Evalua
0b70: 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  tes callback com
0b80: 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  mand. *. *------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0bd0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61  /.static int.Eva
0be0: 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e  lCallback(Tcl_In
0bf0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74  terp *interp, St
0c00: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54  ate *statePtr, T
0c10: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20  cl_Obj *cmdPtr) 
0c20: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  {.    int code, 
0c30: 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 54 63 6c  ok = 0;..    Tcl
0c40: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0c50: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
0c60: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0c70: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74  ((ClientData) st
0c80: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
0c90: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 77   Eval callback w
0ca0: 69 74 68 20 73 75 63 63 65 73 73 20 66 6f 72 20  ith success for 
0cb0: 6f 6b 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c  ok or return val
0cc0: 75 65 20 31 2c 20 66 61 69 6c 20 66 6f 72 20 65  ue 1, fail for e
0cd0: 72 72 6f 72 20 6f 72 20 72 65 74 75 72 6e 20 76  rror or return v
0ce0: 61 6c 75 65 20 30 20 2a 2f 0a 20 20 20 20 54 63  alue 0 */.    Tc
0cf0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
0d00: 74 65 72 70 29 3b 0a 20 20 20 20 63 6f 64 65 20  terp);.    code 
0d10: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
0d20: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
0d30: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
0d40: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ;.    if (code =
0d50: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20  = TCL_OK) {../* 
0d60: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72  Check result for
0d70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
0d80: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0d90: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
0da0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  sult(interp);..i
0db0: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c  f (result == NUL
0dc0: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46  L || Tcl_GetIntF
0dd0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
0de0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54  esult, &ok) != T
0df0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b  CL_OK) {..    ok
0e00: 20 3d 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65   = 1;..}.    } e
0e10: 6c 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20  lse {../* Error 
0e20: 2d 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72  - reject the cer
0e30: 74 69 66 69 63 61 74 65 20 2a 2f 0a 23 69 66 20  tificate */.#if 
0e40: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
0e50: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
0e60: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
0e70: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
0e80: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
0e90: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
0ea0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
0eb0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
0ec0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
0ed0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
0ee0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
0ef0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65  Ptr);.    Tcl_Re
0f00: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
0f10: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
0f20: 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f  return ok;.}.../
0f30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
0f80: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  foCallback --. *
0f90: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.Monitors SSL
0fa0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63   connection proc
0fb0: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ess. *. * Result
0fc0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
0fd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0fe0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
0ff0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
1000: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
1050: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62  c void.InfoCallb
1060: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
1070: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69  sl, int where, i
1080: 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74  nt ret) {.    St
1090: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
10a0: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
10b0: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29  app_data((SSL *)
10c0: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ssl);.    Tcl_In
10d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
10e0: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
10f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
1100: 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  dPtr;.    char *
1110: 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e  major; char *min
1120: 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  or;..    dprintf
1130: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
1140: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
1150: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
1160: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
1170: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65  rn;..    if (whe
1180: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44  re & SSL_CB_HAND
1190: 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09  SHAKE_START) {..
11a0: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61  major = "handsha
11b0: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73  ke";..minor = "s
11c0: 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73  tart";.    } els
11d0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
11e0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44  L_CB_HANDSHAKE_D
11f0: 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20  ONE) {..major = 
1200: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69  "handshake";..mi
1210: 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20  nor = "done";.  
1220: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
1230: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
1240: 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22  LERT)..major = "
1250: 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66  alert";..else if
1260: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54   (where & SSL_ST
1270: 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20  _CONNECT).major 
1280: 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c  = "connect";..el
1290: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
12a0: 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d  SL_ST_ACCEPT)..m
12b0: 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b  ajor = "accept";
12c0: 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72  ..else.....major
12d0: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09   = "unknown";...
12e0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
12f0: 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20  CB_READ)..minor 
1300: 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20  = "read";..else 
1310: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1320: 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72  CB_WRITE)..minor
1330: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73   = "write";..els
1340: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1350: 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f  L_CB_LOOP)..mino
1360: 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73  r = "loop";..els
1370: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1380: 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f  L_CB_EXIT)..mino
1390: 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73  r = "exit";..els
13a0: 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75  e.....minor = "u
13b0: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a  nknown";.    }..
13c0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
13d0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
13e0: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
13f0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
1400: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
1410: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
1420: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1430: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1440: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1450: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a  j("info", -1));.
1460: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1470: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1480: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1490: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14a0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
14b0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
14c0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
14d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
14f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1500: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72  wStringObj(major
1510: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1520: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1530: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1540: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1550: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29  ngObj(minor, -1)
1560: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72  );..    if (wher
1570: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1580: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
1590: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
15a0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
15b0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
15c0: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65  Obj(SSL_alert_de
15d0: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  sc_string_long(r
15e0: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  et), -1));..Tcl_
15f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1600: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1610: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1620: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61  wStringObj(SSL_a
1630: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67  lert_type_string
1640: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29  _long(ret), -1))
1650: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1660: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1670: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1680: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1690: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
16a0: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
16b0: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b  long(ssl), -1));
16c0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
16d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
16e0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
16f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1700: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  o", -1));.    }.
1710: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
1720: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
1730: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1740: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
1750: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
1760: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
1770: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
1780: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1790: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
17a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73  -----. *. * Mess
17f0: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  ageCallback --. 
1800: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
1810: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  L protocol messa
1820: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ges. *. * Result
1830: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
1840: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
1850: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
1860: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
1870: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64  ------. */.#ifnd
18c0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
18d0: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76  L_TRACE.static v
18e0: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62  oid.MessageCallb
18f0: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c  ack(int write_p,
1900: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e   int version, in
1910: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20  t content_type, 
1920: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c  const void *buf,
1930: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c   size_t len, SSL
1940: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67   *ssl, void *arg
1950: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
1960: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
1970: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
1980: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
1990: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
19a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
19b0: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20  mdPtr;.    char 
19c0: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20  *ver, *type;.   
19d0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63   BIO *bio;.    c
19e0: 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30  har buffer[15000
19f0: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d  ];.    buffer[0]
1a00: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
1a10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
1a20: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1a30: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
1a40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65  l_Obj*)NULL)..re
1a50: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63  turn;..    switc
1a60: 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66  h(version) {.#if
1a70: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
1a80: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
1a90: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
1aa0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
1ab0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
1ac0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
1ad0: 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09   SSL2_VERSION:..
1ae0: 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09  ver = "SSLv2";..
1af0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
1b00: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
1b10: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
1b20: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
1b30: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56  .    case SSL3_V
1b40: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1b50: 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a  SSLv3";..break;.
1b60: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1b70: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  TLS1_VERSION:..v
1b80: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62  er = "TLSv1";..b
1b90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1ba0: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_1_VERSION:..
1bb0: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b  ver = "TLSv1.1";
1bc0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1bd0: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e  e TLS1_2_VERSION
1be0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1bf0: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  2";..break;.    
1c00: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53  case TLS1_3_VERS
1c10: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1c20: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.3";..break;. 
1c30: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20     case 0:..ver 
1c40: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b  = "none";..break
1c50: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
1c60: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ver = "unknown";
1c70: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
1c80: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74      switch (cont
1c90: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20  ent_type) {.    
1ca0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41  case SSL3_RT_HEA
1cb0: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65  DER:..type = "He
1cc0: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  ader";..break;. 
1cd0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1ce0: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59  INNER_CONTENT_TY
1cf0: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e  PE:..type = "Inn
1d00: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22  er Content Type"
1d10: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1d20: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47  se SSL3_RT_CHANG
1d30: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09  E_CIPHER_SPEC:..
1d40: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43  type = "Change C
1d50: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a  ipher";..break;.
1d60: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1d70: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20  _ALERT:..type = 
1d80: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b  "Alert";..break;
1d90: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1da0: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1db0: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1dc0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1dd0: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49  se SSL3_RT_APPLI
1de0: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79  CATION_DATA:..ty
1df0: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b  pe = "App Data";
1e00: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1e10: 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54  e DTLS1_RT_HEART
1e20: 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48  BEAT:..type = "H
1e30: 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61  eartbeat";..brea
1e40: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1e50: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  .type = "unknown
1e60: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  ";.    }..    /*
1e70: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74   Needs compile t
1e80: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62  ime option "enab
1e90: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a  le-ssl-trace". *
1ea0: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d  /.    if ((bio =
1eb0: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d   BIO_new(BIO_s_m
1ec0: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20  em())) != NULL) 
1ed0: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74  {..int n;..SSL_t
1ee0: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65  race(write_p, ve
1ef0: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74  rsion, content_t
1f00: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73  ype, buf, len, s
1f10: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29  sl, (void *)bio)
1f20: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28  ;..n = BIO_read(
1f30: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e  bio, buffer, min
1f40: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f  (BIO_pending(bio
1f50: 29 2c 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d  ), 14999));..n =
1f60: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a   (n<0) ? 0 : n;.
1f70: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a  .buffer[n] = 0;.
1f80: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68  .(void)BIO_flush
1f90: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  (bio);..BIO_free
1fa0: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20  (bio);.   }..   
1fb0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1fc0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1fd0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1fe0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1ff0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
2000: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2010: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2020: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2030: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2040: 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a  message", -1));.
2050: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2060: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2070: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
2080: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
2090: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
20a0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
20b0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
20c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
20e0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
20f0: 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65  wStringObj(write
2100: 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52  _p ? "Sent" : "R
2110: 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a  eceived", -1));.
2120: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2130: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2140: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2150: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65  _NewStringObj(ve
2160: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  r, -1));.    Tcl
2170: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2180: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2190: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21a0: 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29  ingObj(type, -1)
21b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
21c0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
21d0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
21e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
21f0: 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a  (buffer, -1));..
2200: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
2210: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
2220: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2230: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
2240: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
2250: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
2260: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
2270: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
2280: 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  mdPtr);.}.#endif
2290: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
22e0: 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  * VerifyCallback
22f0: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
2300: 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61  rs SSL certifica
2310: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72  te validation pr
2320: 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63  ocess. Used to c
2330: 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65  ontrol the. *.be
2340: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20  havior when the 
2350: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20  SSL_VERIFY_PEER 
2360: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
2370: 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77  s is called. *.w
2380: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66  henever a certif
2390: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74  icate is inspect
23a0: 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e  ed or decided in
23b0: 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f  valid. Called fo
23c0: 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66  r. *.each certif
23d0: 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72  icate in the cer
23e0: 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43  t chain.. *. * C
23f0: 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66  hecks:. *.certif
2400: 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63  icate chain is c
2410: 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20  hecked starting 
2420: 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74  with the deepest
2430: 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20   nesting level. 
2440: 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41  *.  (the root CA
2450: 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e   certificate) an
2460: 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20  d worked upward 
2470: 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65  to the peer's ce
2480: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c  rtificate.. *.Al
2490: 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65  l signatures are
24a0: 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20   valid, current 
24b0: 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66  time is within f
24c0: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61  irst and last va
24d0: 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09  lidity time.. *.
24e0: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63  Check that the c
24f0: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73  ertificate is is
2500: 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75  sued by the issu
2510: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69  er certificate i
2520: 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20  ssuer.. *.Check 
2530: 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73  the revocation s
2540: 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63  tatus for each c
2550: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43  ertificate.. *.C
2560: 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74  heck the validit
2570: 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43  y of the given C
2580: 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20  RL and the cert 
2590: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75  revocation statu
25a0: 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20  s.. *.Check the 
25b0: 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20  policies of all 
25c0: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73  the certificates
25d0: 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70  . *. * Args. *.p
25e0: 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69  reverify_ok indi
25f0: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68  cates whether th
2600: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65  e certificate ve
2610: 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65  rification passe
2620: 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29  d (1) or not (0)
2630: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
2640: 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f   *.A callback bo
2650: 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65  und to the socke
2660: 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65  t may return one
2670: 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09   of:. *.    0...
2680: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2690: 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61  e is deemed inva
26a0: 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69  lid, send verifi
26b0: 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66  cation. *....  f
26c0: 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20  ailure alert to 
26d0: 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e  peer, and termin
26e0: 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20  ate handshake.. 
26f0: 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20  *.    1...- the 
2700: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
2710: 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e  eemed valid, con
2720: 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73  tinue with hands
2730: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70  hake.. *.    emp
2740: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63  ty string.- no c
2750: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69  hange to certifi
2760: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a  cate validation.
2770: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2780: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
2790: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
27a0: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
27b0: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
27c0: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
27d0: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
27e0: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
27f0: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20  lure reason. *. 
2800: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2840: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
2850: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61  int.VerifyCallba
2860: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f  ck(int ok, X509_
2870: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20  STORE_CTX *ctx) 
2880: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  {.    Tcl_Obj *c
2890: 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20  mdPtr;.    SSL  
28a0: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58   *ssl..= (SSL*)X
28b0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28c0: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53  t_ex_data(ctx, S
28d0: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58  SL_get_ex_data_X
28e0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64  509_STORE_CTX_id
28f0: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20  x());.    X509  
2900: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54  *cert..= X509_ST
2910: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72  ORE_CTX_get_curr
2920: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20  ent_cert(ctx);. 
2930: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
2940: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr.= (State*)SSL
2950: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73  _get_app_data(ss
2960: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
2970: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
2980: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
2990: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
29a0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
29b0: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
29c0: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
29d0: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
29e0: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
29f0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
2a00: 22 56 65 72 69 66 79 3a 20 25 64 22 2c 20 6f 6b  "Verify: %d", ok
2a10: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
2a20: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
2a30: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
2a40: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76  .if (statePtr->v
2a50: 66 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49  flags & SSL_VERI
2a60: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
2a70: 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20  ER_CERT) {..    
2a80: 72 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c  return ok;..} el
2a90: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
2aa0: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73   1;..}.    } els
2ab0: 65 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55  e if (cert == NU
2ac0: 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c  LL || ssl == NUL
2ad0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a  L) {..return 0;.
2ae0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
2af0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
2b00: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
2b10: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
2b20: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
2b30: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
2b40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2b50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2b60: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2b70: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d  gObj("verify", -
2b80: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2b90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2ba0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2bb0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
2bc0: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
2bd0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
2be0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
2bf0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2c00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2c10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2c20: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29  ewIntObj(depth))
2c30: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2c40: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c50: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2c60: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e  ls_NewX509Obj(in
2c70: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20  terp, cert));.  
2c80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2c90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2ca0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2cb0: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20  ewIntObj(ok));. 
2cc0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2cd0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2ce0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
2cf0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
2d00: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79  har*)X509_verify
2d10: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
2d20: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a  ng(err), -1));..
2d30: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49      /* Prevent I
2d40: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63  /O while callbac
2d50: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73  k is in progress
2d60: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65   */.    /* state
2d70: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
2d80: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20  S_TCL_CALLBACK; 
2d90: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  */..    /* Eval 
2da0: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
2db0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
2dc0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2dd0: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43  ;.    ok = EvalC
2de0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2df0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2e00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2e10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2e20: 0a 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  ..    /* statePt
2e30: 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c  r->flags &= ~(TL
2e40: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b  S_TCL_CALLBACK);
2e50: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f   */.    return(o
2e60: 6b 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c  k);./* By defaul
2e70: 74 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63  t, leave verific
2e80: 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e  ation unchanged.
2e90: 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   */.}.../*. *---
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72  . *. * Tls_Error
2ef0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20   --. *. *.Calls 
2f00: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69  callback with li
2f10: 73 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a  st of errors.. *
2f20: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
2f30: 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65  :. *.The err fie
2f40: 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
2f50: 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74  tly operative St
2f60: 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20  ate is set. *.  
2f70: 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63  to a string desc
2f80: 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e  ribing the SSL n
2f90: 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75  egotiation failu
2fa0: 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d  re reason. *. *-
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: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
3000: 45 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61  Error(State *sta
3010: 74 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67  tePtr, char *msg
3020: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ) {.    Tcl_Inte
3030: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
3040: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
3050: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
3060: 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20  tr, *listPtr;.  
3070: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
3080: 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74  err;.    statePt
3090: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20  r->err = msg;.. 
30a0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
30b0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
30c0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
30d0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
30e0: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
30f0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3100: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
3110: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3120: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3130: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3140: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3150: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3160: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3170: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3180: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a  ("error", -1));.
3190: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
31a0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
31b0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
31c0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
31d0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
31e0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
31f0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
3200: 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c   if (msg != NULL
3210: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3220: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3230: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3240: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3250: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
3260: 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d   else if ((msg =
3270: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3280: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
32a0: 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29 20  NULL)) != NULL) 
32b0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
32c0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32d0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
32e0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
32f0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3300: 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d  lse {..listPtr =
3310: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
3320: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65  0, NULL);..while
3330: 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74   ((err = ERR_get
3340: 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20  _error()) != 0) 
3350: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
3360: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3370: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
3380: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3390: 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72  j(ERR_reason_err
33a0: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20  or_string(err), 
33b0: 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69  -1));..}..Tcl_Li
33c0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
33d0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
33e0: 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  r, listPtr);.   
33f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20   }..    /* Eval 
3400: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
3410: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
3420: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3430: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
3440: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
3450: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
3460: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3470: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a  nt(cmdPtr);.}...
3480: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b  --------. *. * K
34d0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d  eyLogCallback --
34e0: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63  . *. *.Write rec
34f0: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74  eived key data t
3500: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20  o log file.. *. 
3510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3520: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67  . */.void KeyLog
3580: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
3590: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63  SL *ssl, const c
35a0: 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20  har *line) {.   
35b0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74   char *str = get
35c0: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  env(SSLKEYLOGFIL
35d0: 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64  E);.    FILE *fd
35e0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
35f0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
3600: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20  f (str) {..fd = 
3610: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b  fopen(str, "a");
3620: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25  ..fprintf(fd, "%
3630: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c  s\n",line);..fcl
3640: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d  ose(fd);.    }.}
3650: 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
36a0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62  * Password Callb
36b0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ack --. *. *.Cal
36c0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77  led when a passw
36d0: 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61 74  ord for a privat
36e0: 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73 74  e key loading/st
36f0: 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09 63  oring a PEM. *.c
3700: 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68 20  ertificate with 
3710: 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c  encryption. Eval
3720: 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69 70  s callback scrip
3730: 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 2a  t and returns. *
3740: 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20 74  .the result as t
3750: 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72 69  he password stri
3760: 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a  ng in buf.. *. *
3770: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
3780: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
3790: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
37a0: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
37b0: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
37c0: 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20  ns:. *.Password 
37d0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72  size in bytes or
37e0: 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72   -1 for an error
37f0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
3840: 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f  tatic int.Passwo
3850: 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20  rdCallback(char 
3860: 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20  *buf, int size, 
3870: 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64  int rwflag, void
3880: 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53   *udata) {.    S
3890: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d  tate *statePtr.=
38a0: 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74 61   (State *) udata
38b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
38c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
38d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
38e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
38f0: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a  ;.    int code;.
3900: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3910: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
3920: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20  If no callback, 
3930: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c  use default call
3940: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28  back */.    if (
3950: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3960: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
3970: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e  f (Tcl_EvalEx(in
3980: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73  terp, "tls::pass
3990: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  word", -1, TCL_E
39a0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54  VAL_GLOBAL) == T
39b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
39c0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
39d0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
39e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
39f0: 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66  .    strncpy(buf
3a00: 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20  , ret, (size_t) 
3a10: 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74 75  size);..    retu
3a20: 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 72  rn (int)strlen(r
3a30: 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  et);..} else {..
3a40: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09      return -1;..
3a50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
3a60: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
3a70: 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d  o eval */.    cm
3a80: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3a90: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3aa0: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20  ->password);.   
3ab0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3ac0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3ad0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3ae0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73  wStringObj("pass
3af0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20  word", -1));.   
3b00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3b20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3b30: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29  wIntObj(rwflag))
3b40: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3b50: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3b60: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3b70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a  cl_NewIntObj(siz
3b80: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  e));..    Tcl_Pr
3b90: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
3ba0: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
3bb0: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
3bc0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
3bd0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  Ptr);..    /* Ev
3be0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
3bf0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
3c00: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
3c10: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
3c20: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
3c30: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
3c40: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
3c50: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
3c60: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
3c70: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
3c80: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
3c90: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
3ca0: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
3cb0: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
3cc0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
3cd0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
3ce0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
3cf0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
3d00: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3d10: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
3d20: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3d30: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3d40: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63  ;..    /* If suc
3d50: 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61  cessful, pass ba
3d60: 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 69  ck password stri
3d70: 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  ng and truncate 
3d80: 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20  if too long */. 
3d90: 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54     if (code == T
3da0: 43 4c 5f 4f 4b 29 20 7b 0a 09 69 6e 74 20 6c 65  CL_OK) {..int le
3db0: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20  n;..char *ret = 
3dc0: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3dd0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3de0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3df0: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3e00: 69 66 20 28 6c 65 6e 20 3e 20 73 69 7a 65 2d 31  if (len > size-1
3e10: 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 73  ) {..    len = s
3e20: 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63  ize-1;..}..strnc
3e30: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
3e40: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66  ze_t) len);..buf
3e50: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54  [len] = '\0';..T
3e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3e70: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3e80: 0a 09 72 65 74 75 72 6e 28 6c 65 6e 29 3b 0a 20  ..return(len);. 
3e90: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c     }.    Tcl_Rel
3ea0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
3eb0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
3ec0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a  eturn -1;.}.../*
3ed0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f10: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73  ------. *. * Ses
3f20: 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f  sion Callback fo
3f30: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a  r Clients --. *.
3f40: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.Called when a
3f50: 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20   new session is 
3f60: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63  added to the cac
3f70: 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20  he. In TLS 1.3. 
3f80: 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65  *.this may be re
3f90: 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
3fa0: 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20  times after the 
3fb0: 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20  handshake. For. 
3fc0: 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f  *.earlier versio
3fd0: 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ns, this will be
3fe0: 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67   received during
3ff0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a   the handshake..
4000: 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70   *.This is the p
4010: 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20  referred way to 
4020: 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62  obtain a resumab
4030: 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20  le session.. *. 
4040: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
4050: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
4060: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
4070: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
4080: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
4090: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d  rn codes:. *.0 =
40a0: 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73   error where ses
40b0: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d  sion will be imm
40c0: 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64  ediately removed
40d0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
40e0: 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d  al cache.. *.1 =
40f0: 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61   success where a
4100: 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69  pp retains sessi
4110: 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61  on in session ca
4120: 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61  che, and must ca
4130: 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66  ll SSL_SESSION_f
4140: 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e  ree() when done.
4150: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
41a0: 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e  atic int.Session
41b0: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
41c0: 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53  SL *ssl, SSL_SES
41d0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b  SION *session) {
41e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
41f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53  ePtr = (State*)S
4200: 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_get_app_data(
4210: 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20  (SSL *)ssl);.   
4220: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4230: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
4240: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
4250: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
4260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4270: 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20  char *ticket;.  
4280: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
4290: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
42a0: 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  d;.    size_t le
42b0: 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  n2;.    unsigned
42c0: 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20   int ulen;..    
42d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
42e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
42f0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
4300: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4310: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
4320: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4330: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73     } else if (ss
4340: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  l == NULL) {..re
4350: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4360: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4370: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
4380: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
4390: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
43a0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
43b0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
43c0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
43d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
43e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
43f0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4400: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
4410: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4430: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4440: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
4450: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
4460: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
4470: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
4480: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
4490: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
44a0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
44b0: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
44c0: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
44d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
44e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
44f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4500: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4510: 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20  ssion_id, (int) 
4520: 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  ulen));..    /* 
4530: 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a  Session ticket *
4540: 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f  /.    SSL_SESSIO
4550: 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
4560: 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
4570: 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f  &len2);.    Tcl_
4580: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4590: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
45a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  Ptr, Tcl_NewByte
45b0: 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c  ArrayObj(ticket,
45c0: 20 28 69 6e 74 29 20 6c 65 6e 32 29 29 3b 0a 0a   (int) len2));..
45d0: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20      /* Lifetime 
45e0: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  - number of seco
45f0: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  nds */.    Tcl_L
4600: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4610: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4620: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67  tr,..Tcl_NewLong
4630: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53  Obj((long) SSL_S
4640: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65  ESSION_get_ticke
4650: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28  t_lifetime_hint(
4660: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20  session)));..   
4670: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
4680: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
4690: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
46a0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45  t(cmdPtr);.    E
46b0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
46c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
46d0: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  dPtr);.    Tcl_D
46e0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
46f0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
4700: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0;.}.../*. *----
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4750: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62   *. * ALPN Callb
4760: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
4770: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b  and NPN Callback
4780: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4790: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72   *. *.Perform pr
47a0: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31  otocol (http/1.1
47b0: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20  , h2, h3, etc.) 
47c0: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68  selection for th
47d0: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f  e. *.incoming co
47e0: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64  nnection. Called
47f0: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64   after Hello and
4800: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b   server callback
4810: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74  s.. *.Where 'out
4820: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72  ' is selected pr
4830: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20  otocol and 'in' 
4840: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65  is the peer adve
4850: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a  rtised list.. *.
4860: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
4870: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
4880: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
4890: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
48a0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
48b0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
48c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
48d0: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73   ALPN protocol s
48e0: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
48f0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4900: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
4910: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
4920: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f  : There was no o
4930: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74  verlap between t
4940: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20  he client's. *. 
4950: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74     supplied list
4960: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20   and the server 
4970: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
4980: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
4990: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20  ll be aborted.. 
49a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
49b0: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f  _NOACK: ALPN pro
49c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
49d0: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73  ed, e.g., becaus
49e0: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20  e no ALPN. *.   
49f0: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63   protocols are c
4a00: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
4a10: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  is connection. T
4a20: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
4a30: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
4a90: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f  .ALPNCallback(co
4aa0: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  nst SSL *ssl, co
4ab0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4ac0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65  r **out, unsigne
4ad0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a  d char *outlen,.
4ae0: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
4af0: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e  char *in, unsign
4b00: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f  ed int inlen, vo
4b10: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
4b20: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4b30: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
4b40: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4b50: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4b60: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4b70: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4b80: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
4b90: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4ba0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4bb0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
4bc0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
4bd0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4be0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4bf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65    }..    /* Sele
4c00: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20  ct protocol */. 
4c10: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63     if (SSL_selec
4c20: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74  t_next_proto(out
4c30: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4c40: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4c50: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4c60: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4c70: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4c80: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4c90: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4ca0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4cb0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4cc0: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4cd0: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4ce0: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4cf0: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4d00: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4d10: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..re
4d20: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4d30: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4d40: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4d50: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4d60: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4d70: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
4d80: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4d90: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a  ommand to eval *
4da0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
4db0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
4dc0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
4dd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4de0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4df0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4e00: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
4e10: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  alpn", -1));.   
4e20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4e30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4e40: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
4e50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4e60: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
4e70: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
4e80: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
4e90: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ea0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4eb0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
4ec0: 72 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31  ringObj(*out, -1
4ed0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4ee0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4ef0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4f00: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
4f10: 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c  bj(res == SSL_TL
4f20: 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a  SEXT_ERR_OK));..
4f30: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
4f40: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
4f50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
4f60: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
4f70: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
4f80: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
4f90: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
4fa0: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
4fb0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4fc0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20  RR_NOACK;.    } 
4fd0: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
4fe0: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
4ff0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5000: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
5010: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5020: 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a  RR_ALERT_FATAL;.
5030: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
5040: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5050: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
5060: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  es;.}.../*. *---
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50b0: 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65  . *. * Advertise
50c0: 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62   Protocols Callb
50d0: 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f  ack for Next Pro
50e0: 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f  tocol Negotiatio
50f0: 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65  n (NPN) in Serve
5100: 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09  rHello --. *. *.
5110: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c  called when a TL
5120: 53 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61  S server needs a
5130: 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74   list of support
5140: 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72  ed protocols for
5150: 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f   Next. *.Protoco
5160: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20  l Negotiation.. 
5170: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
5180: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
5190: 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20   effects:. *. * 
51a0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
51b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
51c0: 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c  OK: NPN protocol
51d0: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
51e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
51f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5200: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50  XT_ERR_NOACK: NP
5210: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  N protocol not s
5220: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
5230: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
5240: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5290: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73  #ifdef USE_NPN.s
52a0: 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c  tatic int.NPNCal
52b0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
52c0: 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69  *ssl, const unsi
52d0: 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c  gned char **out,
52e0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f   unsigned int *o
52f0: 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67  utlen, void *arg
5300: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
5310: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
5320: 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69  *)arg;..    dpri
5330: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
5340: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
5350: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55  ULL || arg == NU
5360: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5370: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5380: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
5390: 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20  * Set protocols 
53a0: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28  list */.    if (
53b0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
53c0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75   != NULL) {..*ou
53d0: 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72  t = statePtr->pr
53e0: 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d  otos;..*outlen =
53f0: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
5400: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73  s_len;.    } els
5410: 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c  e {..*out = NULL
5420: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a  ;..*outlen = 0;.
5430: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5440: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5450: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53    }.    return S
5460: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5470: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a  ;.}.#endif.../*.
5480: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54c0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20  -----. *. * SNI 
54d0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72  Callback for Ser
54e0: 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65  vers --. *. *.Pe
54f0: 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64  rform server-sid
5500: 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73  e SNI hostname s
5510: 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72  election after r
5520: 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74  eceiving SNI ext
5530: 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69  ension. *.in Cli
5540: 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65  ent Hello. Calle
5550: 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61  d after hello ca
5560: 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72  llback but befor
5570: 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e  e ALPN callback.
5580: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5590: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
55a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
55b0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
55c0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
55d0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
55e0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
55f0: 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  _OK: SNI hostnam
5600: 65 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54  e is accepted. T
5610: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5620: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
5630: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5640: 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74  _FATAL: SNI host
5650: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65  name is not acce
5660: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  pted. The connec
5670: 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61  tion. *.    is a
5680: 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20  borted. Default 
5690: 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c  for alert is SSL
56a0: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
56b0: 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c  _NAME.. *.SSL_TL
56c0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57  SEXT_ERR_ALERT_W
56d0: 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74  ARNING: SNI host
56e0: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65  name is not acce
56f0: 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c  pted, warning al
5700: 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20  ert. *.    sent 
5710: 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69  (not supported i
5720: 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20  n TLSv1.3). The 
5730: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
5740: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
5750: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53  EXT_ERR_NOACK: S
5760: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
5770: 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20  ot accepted and 
5780: 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64  not acknowledged
5790: 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66  ,. *.    e.g. if
57a0: 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65   SNI has not bee
57b0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68  n configured. Th
57c0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
57d0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5820: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
5830: 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  SNICallback(cons
5840: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
5850: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72  *alert, void *ar
5860: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
5870: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
5880: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
5890: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
58a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
58b0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
58c0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
58d0: 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63  code, res;.    c
58e0: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20  har *servername 
58f0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72  = NULL;..    dpr
5900: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5910: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
5920: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
5930: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5940: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5950: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5960: 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  /* Only works fo
5970: 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61  r TLS 1.2 and ea
5980: 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72  rlier */.    ser
5990: 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65  vername = SSL_ge
59a0: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
59b0: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
59c0: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20  E_host_name);.  
59d0: 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d    if (!servernam
59e0: 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b  e || servername[
59f0: 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72  0] == '\0') {..r
5a00: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5a10: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5a20: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
5a30: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
5a40: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
5a50: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5a60: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  T_ERR_OK;.    }.
5a70: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
5a80: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a  ommand to eval *
5a90: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
5aa0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5ab0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
5ac0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5ad0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5ae0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
5af0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5b00: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  sni", -1));.    
5b10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5b20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5b30: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
5b40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
5b50: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
5b60: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
5b70: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
5b80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5b90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5ba0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
5bb0: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d  ingObj(servernam
5bc0: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  e , -1));..    /
5bd0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
5be0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
5bf0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5c00: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
5c10: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
5c20: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
5c30: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
5c40: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
5c50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5c60: 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61  ERT_WARNING;..*a
5c70: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e  lert = SSL_AD_UN
5c80: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b  RECOGNIZED_NAME;
5c90: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65   /* Not supporte
5ca0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a  d by TLS 1.3 */.
5cb0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
5cc0: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
5cd0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5ce0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
5cf0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5d00: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5d10: 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  ATAL;..*alert = 
5d20: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
5d30: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74  ZED_NAME; /* Not
5d40: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c   supported by TL
5d50: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20  S 1.3 */.    }. 
5d60: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5d70: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
5d80: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
5d90: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5de0: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64  ClientHello Hand
5df0: 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66  shake Callback f
5e00: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
5e10: 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76  . *.Used by serv
5e20: 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68  er to examine th
5e30: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e  e server name in
5e40: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65  dication (SNI) e
5e50: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76  xtension. *.prov
5e60: 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65  ided by the clie
5e70: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  nt in order to s
5e80: 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72  elect an appropr
5e90: 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65  iate certificate
5ea0: 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20   to. *.present, 
5eb0: 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63  and make other c
5ec0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a  onfiguration adj
5ed0: 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e  ustments relevan
5ee0: 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72  t to that server
5ef0: 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73  . *.name and its
5f00: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
5f10: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77  This includes sw
5f20: 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61  apping out the a
5f30: 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c  ssociated. *.SSL
5f40: 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f  _CTX pointer, mo
5f50: 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76  difying the serv
5f60: 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72  er's list of per
5f70: 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69  mitted TLS versi
5f80: 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67  ons,. *.changing
5f90: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69   the server's ci
5fa0: 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73  pher list in res
5fb0: 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69  ponse to the cli
5fc0: 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73  ent's cipher lis
5fd0: 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65  t, etc.. *.Calle
5fe0: 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64  d before SNI and
5ff0: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e   ALPN callbacks.
6000: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6010: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
6020: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
6030: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
6040: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
6050: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
6060: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
6070: 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e  LO_RETRY: suspen
6080: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c  d the handshake,
6090: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61   and the handsha
60a0: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ke function will
60b0: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
60c0: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  ely. *.SSL_CLIEN
60d0: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66  T_HELLO_ERROR: f
60e0: 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74  ailure, terminat
60f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65  e connection. Se
6100: 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72  t alert to error
6110: 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c   code.. *.SSL_CL
6120: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
6130: 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20  SS: success. *. 
6140: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6180: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
6190: 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  int.HelloCallbac
61a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
61b0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
61c0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
61d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
61e0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
61f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6200: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
6210: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
6220: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
6230: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
6240: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6250: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20  *servername;.   
6260: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6270: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a  char *p;.    siz
6280: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69  e_t len, remaini
6290: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ng;..    dprintf
62a0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
62b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
62c0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
62d0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
62e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
62f0: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
6300: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
6310: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55   (const SSL *)NU
6320: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f  LL || arg == (vo
6330: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  id *)NULL) {..re
6340: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6350: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6360: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e   }..    /* Get n
6370: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  ames */.    if (
6380: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  !SSL_client_hell
6390: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20  o_get0_ext(ssl, 
63a0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76  TLSEXT_TYPE_serv
63b0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65  er_name, &p, &re
63c0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61  maining) || rema
63d0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
63e0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
63f0: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
6400: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
6410: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6420: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6430: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
6440: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
6450: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
6460: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
6470: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
6480: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
6490: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
64a0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
64b0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
64c0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
64d0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
64e0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
64f0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6500: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6510: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
6520: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   len;..    /* Th
6530: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69  e list in practi
6540: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69  ce only has a si
6550: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f  ngle element, so
6560: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65   we only conside
6570: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  r the first one.
6580: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6590: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70  ining == 0 || *p
65a0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d  ++ != TLSEXT_NAM
65b0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
65c0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
65d0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
65e0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6610: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6620: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ng--;..    /* No
6630: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79  w we can finally
6640: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79   pull out the by
6650: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
6660: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d  e actual hostnam
6670: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
6680: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
6690: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
66a0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
66b0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
66c0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
66d0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
66e0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  }.    len = (*(p
66f0: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
6700: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
6710: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20    if (len + 2 > 
6720: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6730: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6740: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6750: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6760: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6770: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6780: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
6790: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61  en;.    serverna
67a0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
67b0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   *)p;..    /* Cr
67c0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
67d0: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
67e0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
67f0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
6800: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
6810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6820: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
6830: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
6840: 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31  gObj("hello", -1
6850: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
6860: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6870: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
6880: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
6890: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
68a0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
68b0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
68c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
68d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
68e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
68f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
6900: 65 72 76 65 72 6e 61 6d 65 2c 20 28 69 6e 74 29  ervername, (int)
6910: 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20   len));..    /* 
6920: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
6930: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
6940: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
6950: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
6960: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
6970: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
6980: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
6990: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
69a0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45  _CLIENT_HELLO_RE
69b0: 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TRY;..*alert = S
69c0: 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54  SL_R_TLSV1_ALERT
69d0: 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b  _USER_CANCELLED;
69e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
69f0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
6a00: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6a10: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
6a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
6a30: 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  = SSL_CLIENT_HEL
6a40: 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72  LO_ERROR;..*aler
6a50: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6a60: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6a70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6a80: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
6a90: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
6aa0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
6ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6ac0: 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73  ***/./* Commands
6ad0: 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a           */./***
6ae0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6af0: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  */../*. *-------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
6b40: 20 2a 20 48 61 73 68 20 43 61 6c 63 20 2d 2d 0a   * Hash Calc --.
6b50: 20 2a 0a 20 2a 09 43 61 6c 63 75 6c 61 74 65 20   *. *.Calculate 
6b60: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f  message digest o
6b70: 66 20 64 61 74 61 20 75 73 69 6e 67 20 74 79 70  f data using typ
6b80: 65 20 68 61 73 68 20 61 6c 67 6f 72 69 74 68 6d  e hash algorithm
6b90: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
6ba0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
6bb0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
6bc0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6bd0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c20: 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 43 61 6c  . */.int.HashCal
6c30: 63 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  c(Tcl_Interp *in
6c40: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
6c50: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
6c60: 62 6a 76 5b 5d 2c 20 63 6f 6e 73 74 20 45 56 50  bjv[], const EVP
6c70: 5f 4d 44 20 2a 74 79 70 65 29 20 7b 0a 20 20 20  _MD *type) {.   
6c80: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 20   char *data;.   
6c90: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 75 6e   int len;.    un
6ca0: 73 69 67 6e 65 64 20 69 6e 74 20 6d 64 6c 65 6e  signed int mdlen
6cb0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
6cc0: 68 61 72 20 6d 64 62 75 66 5b 45 56 50 5f 4d 41  har mdbuf[EVP_MA
6cd0: 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 20 20 20 20  X_MD_SIZE];.    
6ce0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 68 61  unsigned char ha
6cf0: 73 68 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44  shbuf[EVP_MAX_MD
6d00: 5f 53 49 5a 45 2a 32 2b 31 5d 3b 0a 20 20 20 20  _SIZE*2+1];.    
6d10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20  const char *hex 
6d20: 3d 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43  = "0123456789ABC
6d30: 44 45 46 22 3b 0a 0a 20 20 20 20 69 66 20 28 6f  DEF";..    if (o
6d40: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
6d50: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
6d60: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
6d70: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20  data");..return 
6d80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
6d90: 0a 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c  ..    data = Tcl
6da0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
6db0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c  mObj(objv[1], &l
6dc0: 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 61 74  en);.    if (dat
6dd0: 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  a == NULL) {..re
6de0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6df0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61      }..    /* Ca
6e00: 6c 63 20 68 61 73 68 2c 20 63 6f 6e 76 65 72 74  lc hash, convert
6e10: 20 74 6f 20 68 65 78 20 73 74 72 69 6e 67 2c 20   to hex string, 
6e20: 61 6e 64 20 77 72 69 74 65 20 74 6f 20 72 65 73  and write to res
6e30: 75 6c 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 45  ult */.    if (E
6e40: 56 50 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20  VP_Digest(data, 
6e50: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64  (size_t) len, md
6e60: 62 75 66 2c 20 26 6d 64 6c 65 6e 2c 20 74 79 70  buf, &mdlen, typ
6e70: 65 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 75 6e 73  e, NULL)) {..uns
6e80: 69 67 6e 65 64 20 63 68 61 72 20 2a 6d 70 74 72  igned char *mptr
6e90: 20 3d 20 6d 64 62 75 66 3b 0a 09 75 6e 73 69 67   = mdbuf;..unsig
6ea0: 6e 65 64 20 63 68 61 72 20 2a 68 70 74 72 20 3d  ned char *hptr =
6eb0: 20 26 68 61 73 68 62 75 66 5b 30 5d 3b 0a 0a 09   &hashbuf[0];...
6ec0: 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  for (unsigned in
6ed0: 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 6c  t i = 0; i < mdl
6ee0: 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  en; i++) {..    
6ef0: 2a 68 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 2a  *hptr++ = hex[(*
6f00: 6d 70 74 72 3e 3e 34 29 26 30 78 46 5d 3b 0a 09  mptr>>4)&0xF];..
6f10: 20 20 20 20 2a 68 70 74 72 2b 2b 20 3d 20 68 65      *hptr++ = he
6f20: 78 5b 28 2a 6d 70 74 72 2b 2b 29 26 30 78 46 5d  x[(*mptr++)&0xF]
6f30: 3b 0a 09 7d 0a 09 2a 68 70 74 72 20 3d 20 30 3b  ;..}..*hptr = 0;
6f40: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
6f50: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
6f60: 65 77 53 74 72 69 6e 67 4f 62 6a 28 68 61 73 68  ewStringObj(hash
6f70: 62 75 66 2c 20 6d 64 6c 65 6e 2a 32 29 29 3b 0a  buf, mdlen*2));.
6f80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
6f90: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
6fa0: 72 70 2c 20 22 48 61 73 68 20 63 61 6c 63 75 6c  rp, "Hash calcul
6fb0: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 4e 55  ation error", NU
6fc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
6fd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6fe0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
6ff0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7040: 20 2a 20 48 61 73 68 20 43 6f 6d 6d 61 6e 64 73   * Hash Commands
7050: 20 2d 2d 20 52 65 74 75 72 6e 20 68 61 73 68 20   -- Return hash 
7060: 76 61 6c 75 65 20 66 6f 72 20 64 69 67 65 73 74  value for digest
7070: 20 61 73 20 68 65 78 20 73 74 72 69 6e 67 0a 20   as hex string. 
7080: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7090: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
70a0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
70b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
70c0: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7110: 2f 0a 48 61 73 68 43 6d 64 28 43 6c 69 65 6e 74  /.HashCmd(Client
7120: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
7130: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
7140: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
7150: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
7160: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20  jv[]) {.    int 
7170: 6c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  len;.    const c
7180: 68 61 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63  har *name;.    c
7190: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 74 79 70  onst EVP_MD *typ
71a0: 65 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  e;..    if (objc
71b0: 20 21 3d 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72   != 3) {..Tcl_Wr
71c0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
71d0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 74 79 70  p, 1, objv, "typ
71e0: 65 20 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72  e data");..retur
71f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7200: 20 7d 0a 0a 20 20 20 20 6e 61 6d 65 20 3d 20 54   }..    name = T
7210: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7220: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 26 6c 65 6e  Obj(objv[1],&len
7230: 29 3b 0a 20 20 20 20 69 66 20 28 6e 61 6d 65 20  );.    if (name 
7240: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 74 79 70 65  == NULL || (type
7250: 20 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73   = EVP_get_diges
7260: 74 62 79 6e 61 6d 65 28 6e 61 6d 65 29 29 20 3d  tbyname(name)) =
7270: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7280: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7290: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 64 69 67  rp, "Invalid dig
72a0: 65 73 74 20 74 79 70 65 20 5c 22 22 2c 20 6e 61  est type \"", na
72b0: 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b  me, "\"", NULL);
72c0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
72d0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62  OR;.    }.    ob
72e0: 6a 63 2d 2d 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b  jc--;.    objv++
72f0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 48 61 73  ;.    return Has
7300: 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20 6f 62  hCalc(interp, ob
7310: 6a 63 2c 20 6f 62 6a 76 2c 20 74 79 70 65 29 3b  jc, objv, type);
7320: 0a 7d 0a 0a 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e  .}../*. * Comman
7330: 64 20 74 6f 20 43 61 6c 63 75 6c 61 74 65 20 4d  d to Calculate M
7340: 44 34 20 48 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a  D4 Hash. */.int.
7350: 48 61 73 68 4d 44 34 43 6d 64 28 43 6c 69 65 6e  HashMD4Cmd(Clien
7360: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
7370: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
7380: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
7390: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
73a0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74  bjv[]) {.    ret
73b0: 75 72 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74  urn HashCalc(int
73c0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c  erp, objc, objv,
73d0: 20 45 56 50 5f 6d 64 34 28 29 29 3b 0a 7d 0a 0a   EVP_md4());.}..
73e0: 2f 2a 0a 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f  /*. * Command to
73f0: 20 43 61 6c 63 75 6c 61 74 65 20 4d 44 35 20 48   Calculate MD5 H
7400: 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68  ash. */.int.Hash
7410: 4d 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  MD5Cmd(ClientDat
7420: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
7430: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
7440: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
7450: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
7460: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ]) {.    return 
7470: 48 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c  HashCalc(interp,
7480: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50   objc, objv, EVP
7490: 5f 6d 64 35 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20  _md5());.}../*. 
74a0: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c  * Command to Cal
74b0: 63 75 6c 61 74 65 20 53 48 41 2d 31 20 48 61 73  culate SHA-1 Has
74c0: 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68 53 48  h. */.int.HashSH
74d0: 41 31 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  A1Cmd(ClientData
74e0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
74f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7500: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7510: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7520: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 48  ) {.    return H
7530: 61 73 68 43 61 6c 63 28 69 6e 74 65 72 70 2c 20  ashCalc(interp, 
7540: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f  objc, objv, EVP_
7550: 73 68 61 31 28 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20  sha1());.}../*. 
7560: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 43 61 6c  * Command to Cal
7570: 63 75 6c 61 74 65 20 53 48 41 2d 32 35 36 20 48  culate SHA-256 H
7580: 61 73 68 0a 20 2a 2f 0a 69 6e 74 0a 48 61 73 68  ash. */.int.Hash
7590: 53 48 41 32 35 36 43 6d 64 28 43 6c 69 65 6e 74  SHA256Cmd(Client
75a0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
75b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
75c0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
75d0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
75e0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75  jv[]) {.    retu
75f0: 72 6e 20 48 61 73 68 43 61 6c 63 28 69 6e 74 65  rn HashCalc(inte
7600: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  rp, objc, objv, 
7610: 45 56 50 5f 73 68 61 32 35 36 28 29 29 3b 0a 7d  EVP_sha256());.}
7620: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7670: 20 48 61 73 68 20 4c 69 73 74 20 43 6f 6d 6d 61   Hash List Comma
7680: 6e 64 20 2d 2d 20 52 65 74 75 72 6e 20 6c 69 73  nd -- Return lis
7690: 74 20 6f 66 20 68 61 73 68 20 6d 65 73 73 61 67  t of hash messag
76a0: 65 20 64 69 67 65 73 74 73 0a 20 2a 0a 20 2a 20  e digests. *. * 
76b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
76c0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
76d0: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
76e0: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
76f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7730: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f  --------. */..vo
7740: 69 64 20 48 61 73 68 4c 69 73 74 43 61 6c 6c 62  id HashListCallb
7750: 61 63 6b 28 63 6f 6e 73 74 20 4f 42 4a 5f 4e 41  ack(const OBJ_NA
7760: 4d 45 20 2a 6f 62 6a 2c 20 76 6f 69 64 20 2a 61  ME *obj, void *a
7770: 72 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  rg) {.    Tcl_Ob
7780: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 28 54 63 6c  j *objPtr = (Tcl
7790: 5f 4f 62 6a 20 2a 29 20 61 72 67 3b 0a 09 54 63  _Obj *) arg;..Tc
77a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
77b0: 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a  lement(NULL, obj
77c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
77d0: 6e 67 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c  ngObj(obj->name,
77e0: 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 2f 2a 0a  -1));.    }../*.
77f0: 20 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 6c 69   * Command to li
7800: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 48 61 73  st available Has
7810: 68 20 76 61 6c 75 65 73 0a 20 2a 2f 0a 69 6e 74  h values. */.int
7820: 0a 48 61 73 68 4c 69 73 74 43 6d 64 28 43 6c 69  .HashListCmd(Cli
7830: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
7840: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
7850: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
7860: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
7870: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
7880: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d  cl_Obj *objPtr =
7890: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
78a0: 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f  0, NULL);..#if O
78b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
78c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
78d0: 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f  00L.    OpenSSL_
78e0: 61 64 64 5f 61 6c 6c 5f 64 69 67 65 73 74 73 28  add_all_digests(
78f0: 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  ); /* Make sure 
7900: 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 20 2a  they're loaded *
7910: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 4f 42  /.#endif..    OB
7920: 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42  J_NAME_do_all(OB
7930: 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 4d 44 5f 4d  J_NAME_TYPE_MD_M
7940: 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 61 63  ETH, ListCallbac
7950: 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a 50  k, (void *) objP
7960: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73  tr);.    Tcl_Res
7970: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
7980: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
7990: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
79a0: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74  bjPtr);..    ret
79b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
79c0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
79d0: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62  Data;..objc = ob
79e0: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76  jc;..objv = objv
79f0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 56 61 6c 69  ;.}.../*. * Vali
7a00: 64 20 53 53 4c 20 61 6e 64 20 54 4c 53 20 50 72  d SSL and TLS Pr
7a10: 6f 74 6f 63 6f 6c 20 56 65 72 73 69 6f 6e 73 0a  otocol Versions.
7a20: 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
7a30: 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73   char *protocols
7a40: 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20  [] = {.."ssl2", 
7a50: 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20  "ssl3", "tls1", 
7a60: 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e  "tls1.1", "tls1.
7a70: 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55  2", "tls1.3", NU
7a80: 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f  LL.};.enum proto
7a90: 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53  col {.    TLS_SS
7aa0: 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c  L2, TLS_SSL3, TL
7ab0: 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31  S_TLS1, TLS_TLS1
7ac0: 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20  _1, TLS_TLS1_2, 
7ad0: 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f  TLS_TLS1_3, TLS_
7ae0: 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d  NONE.};../*. *--
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b30: 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f  -. *. * CiphersO
7b40: 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76  bjCmd -- list av
7b50: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a  ailable ciphers.
7b60: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
7b70: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
7b80: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22  to process the "
7b90: 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f  tls::ciphers" co
7ba0: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
7bb0: 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65   available ciphe
7bc0: 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70  rs, based upon p
7bd0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
7be0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
7bf0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
7c00: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
7c10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
7c20: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
7c30: 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53  s and destroys S
7c40: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
7c50: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
7ca0: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72  tatic int.Cipher
7cb0: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
7cc0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
7cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7ce0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7cf0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7d00: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
7d10: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
7d20: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
7d30: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
7d40: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
7d50: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
7d60: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
7d70: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b    char *cp, buf[
7d80: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74  BUFSIZ];.    int
7d90: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20   index, verbose 
7da0: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74  = 0, use_support
7db0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ed = 0;.    cons
7dc0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
7dd0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
7de0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
7df0: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 31     if ((objc < 1
7e00: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
7e10: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
7e20: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
7e30: 6f 62 6a 76 2c 20 22 3f 70 72 6f 74 6f 63 6f 6c  objv, "?protocol
7e40: 3f 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70  ? ?verbose? ?sup
7e50: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75  ported?");..retu
7e60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7e70: 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 62 6a 63    }.    if (objc
7e80: 20 3d 3d 20 31 29 20 7b 0a 09 2f 2a 20 4c 69 73   == 1) {../* Lis
7e90: 74 20 61 6c 6c 20 63 69 70 68 65 72 73 20 2a 2f  t all ciphers */
7ea0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74  ..Tcl_Obj *objPt
7eb0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
7ec0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69  bj(0, NULL);..#i
7ed0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7ee0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
7ef0: 30 30 30 30 30 4c 0a 09 4f 70 65 6e 53 53 4c 5f  00000L..OpenSSL_
7f00: 61 64 64 5f 61 6c 6c 5f 63 69 70 68 65 72 73 28  add_all_ciphers(
7f10: 29 3b 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  ); /* Make sure 
7f20: 74 68 65 79 27 72 65 20 6c 6f 61 64 65 64 20 2a  they're loaded *
7f30: 2f 0a 23 65 6e 64 69 66 0a 0a 09 4f 42 4a 5f 4e  /.#endif...OBJ_N
7f40: 41 4d 45 5f 64 6f 5f 61 6c 6c 28 4f 42 4a 5f 4e  AME_do_all(OBJ_N
7f50: 41 4d 45 5f 54 59 50 45 5f 43 49 50 48 45 52 5f  AME_TYPE_CIPHER_
7f60: 4d 45 54 48 2c 20 4c 69 73 74 43 61 6c 6c 62 61  METH, ListCallba
7f70: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 20 6f 62 6a  ck, (void *) obj
7f80: 50 74 72 29 3b 0a 09 54 63 6c 5f 52 65 73 65 74  Ptr);..Tcl_Reset
7f90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
7fa0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
7fb0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
7fc0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  );..return TCL_O
7fd0: 4b 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  K;..    } else i
7fe0: 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
7ff0: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
8000: 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c  bjv[1], protocol
8010: 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30  s, "protocol", 0
8020: 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c  , &index) != TCL
8030: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
8040: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8050: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20      if ((objc > 
8060: 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f  2) && Tcl_GetBoo
8070: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
8080: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65  rp, objv[2], &ve
8090: 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  rbose) != TCL_OK
80a0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
80b0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
80c0: 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20   if ((objc > 3) 
80d0: 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  && Tcl_GetBoolea
80e0: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
80f0: 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73   objv[3], &use_s
8100: 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c  upported) != TCL
8110: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
8120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8130: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
8140: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69  rror();..    swi
8150: 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f  tch ((enum proto
8160: 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61  col)index) {..ca
8170: 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66  se TLS_SSL2:.#if
8180: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
8190: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
81a0: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
81b0: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
81c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
81d0: 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f  _SSL2)..    Tcl_
81e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
81f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
8200: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
8210: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
8220: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8240: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
8250: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
8260: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
8270: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
8280: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
8290: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
82a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
82b0: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
82c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
82d0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
82e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
82f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
8300: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
8310: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
8320: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
8330: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8340: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
8350: 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f  od = SSLv3_metho
8360: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
8370: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
8380: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
8390: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
83a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
83b0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
83c0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
83d0: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
83e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
83f0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
8400: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
8410: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
8420: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
8430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8440: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
8450: 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f  od = TLSv1_metho
8460: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
8470: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53  if..case TLS_TLS
8480: 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_1:.#if defined
8490: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
84a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
84b0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
84c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
84d0: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_1_METHOD)..
84e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
84f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
8500: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
8510: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
8520: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
8530: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
8540: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
8550: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53      method = TLS
8560: 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62  v1_1_method(); b
8570: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
8580: 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23  se TLS_TLS1_2:.#
8590: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
85a0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
85b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
85c0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
85d0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
85e0: 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63  _METHOD)..    Tc
85f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8600: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
8610: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
8620: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
8630: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ed", NULL);..   
8640: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8650: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
8660: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d  thod = TLSv1_2_m
8670: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
8680: 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53  #endif..case TLS
8690: 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66  _TLS1_3:.#if def
86a0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
86b0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
86c0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20  SL_NO_TLS1_3).. 
86d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
86e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
86f0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
8700: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
8710: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
8720: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
8730: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
8740: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f     method = TLS_
8750: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53  method();..    S
8760: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
8770: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
8780: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
8790: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
87a0: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
87b0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
87c0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20  3_VERSION);..   
87d0: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
87e0: 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65  default:..    me
87f0: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f  thod = TLS_metho
8800: 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  d();..    break;
8810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20  .    }..    ctx 
8820: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
8830: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63  thod);.    if (c
8840: 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  tx == NULL) {..T
8850: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8860: 69 6e 74 65 72 70 2c 20 52 45 41 53 4f 4e 28 29  interp, REASON()
8870: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
8880: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8890: 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c  }..    ssl = SSL
88a0: 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69  _new(ctx);.    i
88b0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
88c0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
88d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41 53  ult(interp, REAS
88e0: 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53  ON(), NULL);..SS
88f0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8900: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
8920: 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f  * Use list and o
8930: 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65  rder as would be
8940: 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e   sent in a Clien
8950: 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76  tHello or all av
8960: 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20  ailable ciphers 
8970: 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73  */.    if (use_s
8980: 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20  upported) {..sk 
8990: 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f  = SSL_get1_suppo
89a0: 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c  rted_ciphers(ssl
89b0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
89c0: 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69  .sk = SSL_get_ci
89d0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
89e0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d  }..    if (sk !=
89f0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76   NULL) {..if (!v
8a00: 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f  erbose) {..    o
8a10: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
8a20: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
8a30: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
8a40: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
8a50: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
8a60: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
8a70: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
8a80: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
8a90: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
8aa0: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
8ab0: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70  tinue;..../* cip
8ac0: 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e  her name or (NON
8ad0: 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c  E) */...cp = SSL
8ae0: 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
8af0: 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d  (c);...if (cp ==
8b00: 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09   NULL) break;...
8b10: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
8b20: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8b30: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8b40: 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31  StringObj(cp, -1
8b50: 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65  ));..    }...} e
8b60: 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74  lse {..    objPt
8b70: 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
8b80: 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20  gObj("",0);..   
8b90: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
8ba0: 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48   i < sk_SSL_CIPH
8bb0: 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29  ER_num(sk); i++)
8bc0: 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43   {...const SSL_C
8bd0: 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53  IPHER *c = sk_SS
8be0: 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73  L_CIPHER_value(s
8bf0: 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d  k, i);...if (c =
8c00: 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65  = NULL) continue
8c10: 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20  ;..../* textual 
8c20: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
8c30: 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69  he cipher */...i
8c40: 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
8c50: 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66  scription(c, buf
8c60: 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21  , sizeof(buf)) !
8c70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  = NULL) {...    
8c80: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
8c90: 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63  objPtr, buf, (Tc
8ca0: 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62  l_Size) strlen(b
8cb0: 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  uf));...} else {
8cc0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
8cd0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22  dToObj(objPtr, "
8ce0: 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a  UNKNOWN\n", 8);.
8cf0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69  ..}..    }..}..i
8d00: 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64  f (use_supported
8d10: 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f  ) {..    sk_SSL_
8d20: 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b  CIPHER_free(sk);
8d30: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  ..}.    }.    SS
8d40: 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20  L_free(ssl);.   
8d50: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
8d60: 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 73  x);..    Tcl_Res
8d70: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
8d80: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
8d90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
8da0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
8db0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65  rn TCL_OK;..clie
8dc0: 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44  ntData = clientD
8dd0: 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ata;.}.../*. *--
8de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
8e30: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8e40: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8e50: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8e60: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8e70: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8e80: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8e90: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
8ea0: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
8eb0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
8ec0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
8ed0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
8ee0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
8ef0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8f00: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8f50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8f60: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8f70: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8f80: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8f90: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8fa0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8fb0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8fc0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
8fd0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
8fe0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
8ff0: 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09   (objc != 1) {..
9000: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9010: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
9020: 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  , "");..return T
9030: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9040: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
9050: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a  rror();..    obj
9060: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
9070: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
9080: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
9090: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
90a0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
90b0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
90c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
90d0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54  L_NO_SSL2).    T
90e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
90f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
9100: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
9110: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
9120: 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31  ls[TLS_SSL2], -1
9130: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
9140: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
9150: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
9160: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
9170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
9180: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
9190: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
91a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
91b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
91c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
91d0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
91e0: 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L3], -1));.#endi
91f0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
9200: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
9210: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9220: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
9230: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9240: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
9250: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
9260: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
9270: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
9280: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
9290: 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29  [TLS_TLS1], -1))
92a0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
92b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
92c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
92d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
92e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
92f0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
9300: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
9310: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
9320: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
9330: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
9340: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
9350: 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b  S_TLS1_1], -1));
9360: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
9370: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
9380: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
9390: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  SSL_NO_TLS1_2) &
93a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
93b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54  SL_NO_TLS1_2_MET
93c0: 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  HOD).    Tcl_Lis
93d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
93e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
93f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
9400: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
9410: 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_2], -1));.
9420: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
9430: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
9440: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
9450: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
9460: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
9470: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
9480: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
9490: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
94a0: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33  ocols[TLS_TLS1_3
94b0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
94c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
94d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
94e0: 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
94f0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
9500: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
9510: 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
9520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9560: 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f 6e 4f 62  . *. * VersionOb
9570: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 76  jCmd -- return v
9580: 65 72 73 69 6f 6e 20 73 74 72 69 6e 67 20 66 72  ersion string fr
9590: 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20  om OpenSSL.. *. 
95a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
95b0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
95c0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
95d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
95e0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
9630: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 73 69 6f  tatic int.Versio
9640: 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  nObjCmd(ClientDa
9650: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
9660: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9670: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
9680: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
9690: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
96a0: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
96b0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
96c0: 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
96d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
96e0: 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  j(OPENSSL_VERSIO
96f0: 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20  N_TEXT, -1);.   
9700: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
9710: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
9720: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
9730: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
9740: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
9750: 0a 09 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 09  ..objc = objc;..
9760: 6f 62 6a 76 20 3d 20 6f 62 6a 76 3b 0a 7d 0a 0c  objv = objv;.}..
9770: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
97b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
97c0: 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20  HandshakeObjCmd 
97d0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f  --. *. *.This co
97e0: 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f  mmand is used to
97f0: 20 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20   verify whether 
9800: 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73  the handshake is
9810: 20 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20   complete. *.or 
9820: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  not.. *. * Resul
9830: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
9840: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20  d Tcl result. 1 
9850: 6d 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20  means handshake 
9860: 63 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e  complete, 0 mean
9870: 73 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a  s pending.. *. *
9880: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
9890: 2a 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20  *.May force SSL 
98a0: 6e 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74  negotiation to t
98b0: 61 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a  ake place.. *. *
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
98f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9900: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
9910: 6e 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43  nt HandshakeObjC
9920: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
9930: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
9940: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
9950: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
9960: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
9970: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
9980: 20 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a   chan;        /*
9990: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
99a0: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
99b0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
99c0: 74 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a  tePtr;        /*
99d0: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
99e0: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
99f0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9a00: 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  errStr = NULL;. 
9a10: 20 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a     int ret = 1;.
9a20: 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b      int err = 0;
9a30: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
9a40: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
9a50: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
9a60: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9a70: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
9a80: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
9a90: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
9aa0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
9ab0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
9ac0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9ad0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
9ae0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
9af0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
9b00: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
9b10: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
9b20: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
9b30: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c  L) {..return(TCL
9b40: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
9b50: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
9b60: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
9b70: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
9b80: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
9b90: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
9ba0: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
9bb0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
9bc0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
9bd0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
9be0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
9bf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
9c00: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
9c10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
9c20: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c  e(chan),..    "\
9c30: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
9c40: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
9c50: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
9c60: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
9c70: 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41  HANDSHAKE", "CHA
9c80: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
9c90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9ca0: 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  ;..return(TCL_ER
9cb0: 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ROR);.    }.    
9cc0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
9cd0: 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
9ce0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
9cf0: 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  han);..    dprin
9d00: 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f  tf("Calling Tls_
9d10: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29  WaitForConnect")
9d20: 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f  ;.    ret = Tls_
9d30: 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73  WaitForConnect(s
9d40: 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31  tatePtr, &err, 1
9d50: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
9d60: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
9d70: 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22  ct returned: %i"
9d80: 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20  , ret);..    if 
9d90: 28 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74  (ret < 0 && ((st
9da0: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20  atePtr->flags & 
9db0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26  TLS_TCL_ASYNC) &
9dc0: 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e  & (err == EAGAIN
9dd0: 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22  ))) {..dprintf("
9de0: 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72  Async set and er
9df0: 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72  r = EAGAIN");..r
9e00: 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c  et = 0;.    } el
9e10: 73 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20  se if (ret < 0) 
9e20: 7b 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a  {..long result;.
9e30: 09 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50  .errStr = stateP
9e40: 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65  tr->err;..Tcl_Re
9e50: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
9e60: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f  );..Tcl_SetErrno
9e70: 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72  (err);...if (!er
9e80: 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72  rStr || (*errStr
9e90: 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65   == 0)) {..    e
9ea0: 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69  rrStr = Tcl_Posi
9eb0: 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  xError(interp);.
9ec0: 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  .}...Tcl_AppendR
9ed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68  esult(interp, "h
9ee0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a  andshake failed:
9ef0: 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61   ", errStr, (cha
9f00: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  r *) NULL);..if 
9f10: 28 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67  ((result = SSL_g
9f20: 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
9f30: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
9f40: 20 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b   != X509_V_OK) {
9f50: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
9f60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9f70: 20 64 75 65 20 74 6f 3a 20 22 2c 20 58 35 30 39   due to: ", X509
9f80: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
9f90: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74  or_string(result
9fa0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
9fb0: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72  );..}..Tcl_SetEr
9fc0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
9fd0: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b  "TLS", "HANDSHAK
9fe0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  E", "FAILED", (c
9ff0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64  har *) NULL);..d
a000: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
a010: 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68  g TCL_ERROR with
a020: 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65   handshake faile
a030: 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b  d: %s", errStr);
a040: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
a050: 4f 52 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  OR);.    } else 
a060: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  {..if (err != 0)
a070: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
a080: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69  "Got an error wi
a090: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68  th a completed h
a0a0: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20  andshake: err = 
a0b0: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72  %i", err);..}..r
a0c0: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  et = 1;.    }.. 
a0d0: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
a0e0: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74  rning TCL_OK wit
a0f0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20  h data \"%i\"", 
a100: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ret);.    Tcl_Se
a110: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
a120: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
a130: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75  (ret));.    retu
a140: 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 63 6c 69  rn(TCL_OK);..cli
a150: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
a160: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  Data;.}../*. *--
a170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a1b0: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
a1c0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
a1d0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
a1e0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
a1f0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
a200: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
a210: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
a220: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
a230: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
a240: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
a250: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
a260: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
a270: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
a280: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
a290: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
a2a0: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
a2b0: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
a2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
a300: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f  .static int.Impo
a310: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
a320: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
a330: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
a340: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
a350: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
a360: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
a370: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
a380: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
a390: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
a3a0: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
a3b0: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
a3c0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
a3d0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53  socket */.    SS
a3e0: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20  L_CTX *ctx.     
a3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
a400: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20  cl_Obj *script. 
a410: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a420: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73     Tcl_Obj *pass
a430: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e  word.        = N
a440: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
a450: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d   *vcmd.        =
a460: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
a470: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e  String upperChan
a480: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  nelTranslation, 
a490: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
a4a0: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  king, upperChann
a4b0: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65  elEncoding, uppe
a4c0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b  rChannelEOFChar;
a4d0: 0a 20 20 20 20 69 6e 74 20 69 64 78 2c 20 6c 65  .    int idx, le
a4e0: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
a4f0: 09 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f  ..        = TLS_
a500: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e  TCL_INIT;.    in
a510: 74 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20  t server..      
a520: 20 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e    = 0;./* is con
a530: 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67  nection incoming
a540: 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f   or outgoing? */
a550: 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69  .    char *keyfi
a560: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
a570: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72  L;.    char *cer
a580: 74 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  tfile.        = 
a590: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e  NULL;.    unsign
a5a0: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d  ed char *key  .=
a5b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b   NULL;.    int k
a5c0: 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20  ey_len          
a5d0: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20         = 0;.    
a5e0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
a5f0: 65 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55  ert         = NU
a600: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74  LL;.    int cert
a610: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  _len            
a620: 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61      = 0;.    cha
a630: 72 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20  r *ciphers.     
a640: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
a650: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
a660: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
a670: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69  ;.    char *CAfi
a680: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
a690: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64  L;.    char *CAd
a6a0: 69 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ir..        = NU
a6b0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48  LL;.    char *DH
a6c0: 70 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d  params.        =
a6d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
a6e0: 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20  *model..        
a6f0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
a700: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20   *servername.   
a710: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20       = NULL;./* 
a720: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72  hostname for Ser
a730: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74  ver Name Indicat
a740: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
a750: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
a760: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c  session_id = NUL
a770: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
a780: 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  alpn..= NULL;.  
a790: 20 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20    int ssl2 = 0, 
a7a0: 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e  ssl3 = 0;.    in
a7b0: 74 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31  t tls1 = 1, tls1
a7c0: 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d  _1 = 1, tls1_2 =
a7d0: 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a   1, tls1_3 = 1;.
a7e0: 20 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20      int proto = 
a7f0: 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20  0, level = -1;. 
a800: 20 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20     int verify = 
a810: 30 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20  0, require = 0, 
a820: 72 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73  request = 1, pos
a830: 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b  t_handshake = 0;
a840: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
a850: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
a860: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
a870: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
a880: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74  L_NO_TLS1).    t
a890: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ls1 = 0;.#endif.
a8a0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
a8b0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
a8c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
a8d0: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20  1_1).    tls1_1 
a8e0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
a8f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
a900: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
a910: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
a920: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b  .    tls1_2 = 0;
a930: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
a940: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
a950: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
a960: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
a970: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e   tls1_3 = 0;.#en
a980: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  dif..    if (obj
a990: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
a9a0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
a9b0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
a9c0: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29  nnel ?options?")
a9d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
a9e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
a9f0: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
aa00: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  );..    chan = T
aa10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
aa20: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
aa30: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
aa40: 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29  1], NULL), NULL)
aa50: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
aa60: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
aa70: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
aa80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
aa90: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
aaa0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
aab0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
aac0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
aad0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
aae0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
aaf0: 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69   for (idx = 2; i
ab00: 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b  dx < objc; idx++
ab10: 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d  ) {..char *opt =
ab20: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
ab30: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c  omObj(objv[idx],
ab40: 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70   NULL);...if (op
ab50: 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09 20 20  t[0] != '-')..  
ab60: 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42    break;...OPTOB
ab70: 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70 6e 29  J("-alpn", alpn)
ab80: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 64 69  ;..OPTSTR("-cadi
ab90: 72 22 2c 20 43 41 64 69 72 29 3b 0a 09 4f 50 54  r", CAdir);..OPT
aba0: 53 54 52 28 22 2d 63 61 66 69 6c 65 22 2c 20 43  STR("-cafile", C
abb0: 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45  Afile);..OPTBYTE
abc0: 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c 20  ("-cert", cert, 
abd0: 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53  cert_len);..OPTS
abe0: 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c 20  TR("-certfile", 
abf0: 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53  certfile);..OPTS
ac00: 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69  TR("-cipher", ci
ac10: 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28  phers);..OPTSTR(
ac20: 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70 68  "-ciphers", ciph
ac30: 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ers);..OPTSTR("-
ac40: 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20 63  ciphersuites", c
ac50: 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09 4f  iphersuites);..O
ac60: 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22  PTOBJ("-command"
ac70: 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54 53  , script);..OPTS
ac80: 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c 20  TR("-dhparams", 
ac90: 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42  DHparams);..OPTB
aca0: 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c  YTE("-key", key,
acb0: 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53   key_len);..OPTS
acc0: 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b  TR("-keyfile", k
acd0: 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52  eyfile);..OPTSTR
ace0: 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c  ("-model", model
acf0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73  );..OPTOBJ("-pas
ad00: 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72 64  sword", password
ad10: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f  );..OPTBOOL("-po
ad20: 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20 70  st_handshake", p
ad30: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a  ost_handshake);.
ad40: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65  .OPTBOOL("-reque
ad50: 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a 09  st", request);..
ad60: 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72  OPTBOOL("-requir
ad70: 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09 4f  e", require);..O
ad80: 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74 79  PTINT("-security
ad90: 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a  level", level);.
ada0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65  .OPTBOOL("-serve
adb0: 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50  r", server);..OP
adc0: 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d  TSTR("-servernam
add0: 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b  e", servername);
ade0: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69  ..OPTSTR("-sessi
adf0: 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
ae00: 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  id);..OPTBOOL("-
ae10: 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f  ssl2", ssl2);..O
ae20: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20  PTBOOL("-ssl3", 
ae30: 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl3);..OPTBOOL(
ae40: 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a  "-tls1", tls1);.
ae50: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
ae60: 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50  1", tls1_1);..OP
ae70: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c  TBOOL("-tls1.2",
ae80: 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f   tls1_2);..OPTBO
ae90: 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c  OL("-tls1.3", tl
aea0: 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  s1_3);..OPTOBJ("
aeb0: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
aec0: 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42  ", vcmd);..OPTOB
aed0: 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29  J("-vcmd", vcmd)
aee0: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69  ;...OPTBAD("opti
aef0: 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61  on", "-alpn, -ca
af00: 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63  dir, -cafile, -c
af10: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20  ert, -certfile, 
af20: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72  -cipher, -cipher
af30: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64  suites, -command
af40: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65  , -dhparams, -ke
af50: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f  y, -keyfile, -mo
af60: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20  del, -password, 
af70: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c  -post_handshake,
af80: 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75   -request, -requ
af90: 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 6c 65  ire, -securityle
afa0: 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73  vel, -server, -s
afb0: 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73  ervername, -sess
afc0: 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d  ion_id, -ssl2, -
afd0: 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c  ssl3, -tls1, -tl
afe0: 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d  s1.1, -tls1.2, -
aff0: 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69  tls1.3, or -vali
b000: 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a  datecommand");..
b010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
b020: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
b030: 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66  (request)..verif
b040: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
b050: 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53  CLIENT_ONCE | SS
b060: 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20  L_VERIFY_PEER;. 
b070: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
b080: 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66  & require).verif
b090: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
b0a0: 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
b0b0: 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65  CERT;.    if (re
b0c0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
b0d0: 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20  ndshake).verify 
b0e0: 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f  |= SSL_VERIFY_PO
b0f0: 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20  ST_HANDSHAKE;.  
b100: 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20    if (verify == 
b110: 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c  0)..verify = SSL
b120: 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20  _VERIFY_NONE;.. 
b130: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
b140: 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  2 ? TLS_PROTO_SS
b150: 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L2 : 0);.    pro
b160: 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c  to |= (ssl3 ? TL
b170: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30  S_PROTO_SSL3 : 0
b180: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
b190: 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54  (tls1 ? TLS_PROT
b1a0: 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20  O_TLS1 : 0);.   
b1b0: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
b1c0: 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  1 ? TLS_PROTO_TL
b1d0: 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70  S1_1 : 0);.    p
b1e0: 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20  roto |= (tls1_2 
b1f0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
b200: 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  _2 : 0);.    pro
b210: 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20  to |= (tls1_3 ? 
b220: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
b230: 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72   : 0);..    /* r
b240: 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20  eset to NULL if 
b250: 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f  blank string pro
b260: 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20  vided */.    if 
b270: 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29  (cert && !*cert)
b280: 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20  ..        cert. 
b290: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
b2a0: 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a     if (key && !*
b2b0: 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65  key)..        ke
b2c0: 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  y.        = NULL
b2d0: 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69  ;.    if (certfi
b2e0: 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65  le && !*certfile
b2f0: 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69  )         certfi
b300: 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69  le.= NULL;.    i
b310: 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a  f (keyfile && !*
b320: 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c  keyfile)..keyfil
b330: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
b340: 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ;.    if (cipher
b350: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09  s && !*ciphers).
b360: 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09          ciphers.
b370: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
b380: 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75      if (ciphersu
b390: 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72  ites && !*cipher
b3a0: 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75  suites) ciphersu
b3b0: 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a  ites    = NULL;.
b3c0: 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26      if (CAfile &
b3d0: 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20  & !*CAfile).    
b3e0: 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20      CAfile.     
b3f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
b400: 66 20 28 43 41 64 69 72 20 26 26 20 21 2a 43 41  f (CAdir && !*CA
b410: 64 69 72 29 09 20 20 20 20 20 20 20 20 43 41 64  dir).        CAd
b420: 69 72 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ir.        = NUL
b430: 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  L;.    if (DHpar
b440: 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d  ams && !*DHparam
b450: 73 29 09 20 20 20 20 20 20 20 20 44 48 70 61 72  s).        DHpar
b460: 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ams        = NUL
b470: 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53  L;..    /* new S
b480: 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20  SL state */.    
b490: 73 74 61 74 65 50 74 72 09 09 3d 20 28 53 74 61  statePtr..= (Sta
b4a0: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75  te *) ckalloc((u
b4b0: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28  nsigned) sizeof(
b4c0: 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d  State));.    mem
b4d0: 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c  set(statePtr, 0,
b4e0: 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b   sizeof(State));
b4f0: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
b500: 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20  flags.= flags;. 
b510: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74     statePtr->int
b520: 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp.= interp;.  
b530: 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61    statePtr->vfla
b540: 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20  gs.= verify;.   
b550: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d   statePtr->err.=
b560: 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c   "";..    /* all
b570: 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a  ocate script */.
b580: 20 20 20 20 69 66 20 28 73 63 72 69 70 74 29 20      if (script) 
b590: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
b5a0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73  tStringFromObj(s
b5b0: 63 72 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69  cript, &len);..i
b5c0: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
b5d0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
b5e0: 6b 20 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20  k = script;..   
b5f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
b600: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  t(statePtr->call
b610: 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  back);..}.    }.
b620: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
b630: 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20   password */.   
b640: 20 69 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b   if (password) {
b650: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
b660: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61  StringFromObj(pa
b670: 73 73 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09  ssword, &len);..
b680: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
b690: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
b6a0: 72 64 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09  rd = password;..
b6b0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
b6c0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70  ount(statePtr->p
b6d0: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20  assword);..}.   
b6e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
b6f0: 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d  ate validate com
b700: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  mand */.    if (
b710: 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20  vcmd) {..(void) 
b720: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
b730: 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29  mObj(vcmd, &len)
b740: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
b750: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d     statePtr->vcm
b760: 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54  d = vcmd;..    T
b770: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
b780: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
b790: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ..}.    }..    i
b7a0: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c  f (model != NULL
b7b0: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09  ) {..int mode;..
b7c0: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65  /* Get the "mode
b7d0: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63  l" context */..c
b7e0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
b7f0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64  nnel(interp, mod
b800: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20  el, &mode);..if 
b810: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
b820: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
b830: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b840: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b850: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b860: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a  _ERROR;..}.../*.
b870: 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f  . * Make sure to
b880: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
b890: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a  topmost channel.
b8a0: 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c  . */..chan = Tcl
b8b0: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
b8c0: 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47  han);..if (Tcl_G
b8d0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
b8e0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
b8f0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20 20  elType()) {..   
b900: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b910: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
b920: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
b930: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
b940: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
b950: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
b960: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b970: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b980: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b990: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
b9a0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
b9b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b9c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b9d0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b9e0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b9f0: 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20  RROR;..}..ctx = 
ba00: 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65  ((State *)Tcl_Ge
ba10: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
ba20: 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78  Data(chan))->ctx
ba30: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
ba40: 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49  if ((ctx = CTX_I
ba50: 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65  nit(statePtr, se
ba60: 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79  rver, proto, key
ba70: 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20  file, certfile, 
ba80: 6b 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c  key, cert, key_l
ba90: 65 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65  en,..    cert_le
baa0: 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c 65  n, CAdir, CAfile
bab0: 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65  , ciphers, ciphe
bac0: 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20  rsuites, level, 
bad0: 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55  DHparams)) == NU
bae0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  LL) {..    Tls_F
baf0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
bb00: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
bb10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bb20: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61  }.    }..    sta
bb30: 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78  tePtr->ctx = ctx
bb40: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
bb50: 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65   We need to make
bb60: 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63   sure that the c
bb70: 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20  hannel works in 
bb80: 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a  binary (for the.
bb90: 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f       * encryptio
bba0: 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f  n not to get goo
bbb0: 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20  fed up)..     * 
bbc0: 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20  We only want to 
bbd0: 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66 65  adjust the buffe
bbe0: 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63  ring in pre-v2 c
bbf0: 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20  hannels, where. 
bc00: 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e      * each chann
bc10: 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20  el in the stack 
bc20: 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f  maintained its o
bc30: 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20  wn buffers..    
bc40: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72   */.    Tcl_DStr
bc50: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
bc60: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
bc70: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
bc80: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
bc90: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
bca0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
bcb0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
bcc0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
bcd0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
bce0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
bcf0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
bd00: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
bd10: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
bd20: 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72 43  ofchar", &upperC
bd30: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
bd40: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
bd50: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
bd60: 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e   chan, "-encodin
bd70: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
bd80: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
bd90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
bda0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
bdb0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
bdc0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
bdd0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
bde0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
bdf0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
be00: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
be10: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  , &upperChannelB
be20: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
be30: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
be40: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
be50: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
be60: 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20   "binary");.    
be70: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
be80: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
be90: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
bea0: 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72  "true");.    dpr
beb0: 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20  intf("Consuming 
bec0: 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c  Tcl channel %s",
bed0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
bee0: 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20  ame(chan));.    
bef0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d  statePtr->self =
bf00: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65   Tcl_StackChanne
bf10: 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68  l(interp, Tls_Ch
bf20: 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c  annelType(), (Cl
bf30: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
bf40: 74 72 2c 20 28 54 43 4c 5f 52 45 41 44 41 42 4c  tr, (TCL_READABL
bf50: 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45  E | TCL_WRITABLE
bf60: 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70  ), chan);.    dp
bf70: 72 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63  rintf("Created c
bf80: 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22  hannel named %s"
bf90: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
bfa0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
bfb0: 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73  elf));.    if (s
bfc0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d  tatePtr->self ==
bfd0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
bfe0: 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e  ULL) {../*.. * N
bff0: 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65  o use of Tcl_Eve
c000: 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61  ntuallyFree beca
c010: 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20  use no possible 
c020: 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20  Tcl_Preserve... 
c030: 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68  */..Tls_Free((ch
c040: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
c050: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
c060: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
c070: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
c080: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
c090: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72  ePtr->self, "-tr
c0a0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f  anslation", Tcl_
c0b0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
c0c0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
c0d0: 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c  ation));.    Tcl
c0e0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
c0f0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
c100: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f  tr->self, "-enco
c110: 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  ding", Tcl_DStri
c120: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
c130: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b  annelEncoding));
c140: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
c150: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
c160: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
c170: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63  , "-eofchar", Tc
c180: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
c190: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
c1a0: 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  har));.    Tcl_S
c1b0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
c1c0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
c1d0: 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69  ->self, "-blocki
c1e0: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
c1f0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
c200: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 0a  nelBlocking));..
c210: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53      /*.     * SS
c220: 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  L Initialization
c230: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  .     */.    sta
c240: 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c  tePtr->ssl = SSL
c250: 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63  _new(statePtr->c
c260: 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74  tx);.    if (!st
c270: 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
c280: 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65  /* SSL library e
c290: 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  rror */..Tcl_App
c2a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c2b0: 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73  , "couldn't cons
c2c0: 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f  truct ssl sessio
c2d0: 6e 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  n: ", REASON(), 
c2e0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c2f0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
c300: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
c310: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
c320: 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c  INIT", "FAILED",
c330: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
c340: 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72  ..Tls_Free((char
c350: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
c360: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c370: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c380: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
c390: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
c3a0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
c3b0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
c3c0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
c3d0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e  n (SNI) in Clien
c3e0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e  tHello extension
c3f0: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20   */../* Per RFC 
c400: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69  6066, hostname i
c410: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65  s a ASCII encode
c420: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68  d string, though
c430: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55   RFC 4366 says U
c440: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53  TF-8. */..if (!S
c450: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
c460: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72  st_name(statePtr
c470: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
c480: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b  e) && require) {
c490: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
c4a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c4b0: 73 65 74 74 69 6e 67 20 54 4c 53 20 68 6f 73 74  setting TLS host
c4c0: 20 6e 61 6d 65 20 65 78 74 65 6e 73 69 6f 6e 20   name extension 
c4d0: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a  failed", (char *
c4e0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
c4f0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
c500: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
c510: 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22  MPORT", "SNI", "
c520: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
c530: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
c540: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
c550: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
c560: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c570: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f  ;..}.../* Set ho
c580: 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20  stname for peer 
c590: 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74  certificate host
c5a0: 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f  name verificatio
c5b0: 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20  n in clients... 
c5c0: 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f    Don't use SSL_
c5d0: 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20  set1_host since 
c5e0: 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f  it has limitatio
c5f0: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  ns. */..if (!SSL
c600: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65  _add1_host(state
c610: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72  Ptr->ssl, server
c620: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63  name)) {..    Tc
c630: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
c640: 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20  nterp, "setting 
c650: 44 4e 53 20 68 6f 73 74 20 6e 61 6d 65 20 66 61  DNS host name fa
c660: 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  iled", (char *) 
c670: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
c680: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
c690: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
c6a0: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22  ORT", "HOSTNAME"
c6b0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
c6c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
c6d0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
c6e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
c6f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
c700: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
c710: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73     /* Resume ses
c720: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69  sion id */.    i
c730: 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26  f (session_id &&
c740: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f   strlen(session_
c750: 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53  id) <= SSL_MAX_S
c760: 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b  ID_CTX_LENGTH) {
c770: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73  ../* SSL_set_ses
c780: 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21  sion() */..if (!
c790: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31  SSL_SESSION_set1
c7a0: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f  _id_context(SSL_
c7b0: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74  get_session(stat
c7c0: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73  ePtr->ssl), sess
c7d0: 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65  ion_id, (unsigne
c7e0: 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65  d int) strlen(se
c7f0: 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20  ssion_id))) {.. 
c800: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c810: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73  ult(interp, "Res
c820: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 22  ume session id "
c830: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 22 20  , session_id, " 
c840: 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72 20 2a  failed", (char *
c850: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
c860: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
c870: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
c880: 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e  MPORT", "SESSION
c890: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
c8a0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
c8b0: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
c8c0: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
c8d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c8e0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
c8f0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70      /* Enable Ap
c900: 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20  plication-Layer 
c910: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
c920: 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61  tion. Examples a
c930: 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68  re: http/1.0,..h
c940: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c  ttp/1.1, h2, h3,
c950: 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33   ftp, imap, pop3
c960: 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78  , xmpp-client, x
c970: 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74  mpp-server, mqtt
c980: 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20  , irc, etc. */. 
c990: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09     if (alpn) {..
c9a0: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c  /* Convert a TCL
c9b0: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f   list into a pro
c9c0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69  tocol-list in wi
c9d0: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e  re-format */..un
c9e0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
c9f0: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e  tos, *p;..unsign
ca00: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65  ed int protos_le
ca10: 6e 20 3d 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c  n = 0;..int i, l
ca20: 65 6e 2c 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62  en, cnt;..Tcl_Ob
ca30: 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28  j **list;...if (
ca40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
ca50: 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61  ements(interp, a
ca60: 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  lpn, &cnt, &list
ca70: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
ca80: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
ca90: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
caa0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
cab0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
cac0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
cad0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
cae0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
caf0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
cb00: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
cb10: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
cb20: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
cb30: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
cb40: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
cb50: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
cb60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
cb70: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
cb80: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
cb90: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
cba0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
cbb0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
cbc0: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
cbd0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
cbe0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
cbf0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
cc00: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
cc10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
cc20: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
cc30: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e  s_len += 1 + len
cc40: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
cc50: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
cc60: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
cc70: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
cc80: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
cc90: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
cca0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
ccb0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
ccc0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
ccd0: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70  /..for (i = 0, p
cce0: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63   = protos; i < c
ccf0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
cd00: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
cd10: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
cd20: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
cd30: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e  ..    *p++ = len
cd40: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
cd50: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20   str, len);..   
cd60: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
cd70: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
cd80: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
cd90: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
cda0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
cdb0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
cdc0: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
cdd0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
cde0: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
cdf0: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
ce00: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
ce10: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
ce20: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
ce30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ce40: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
ce50: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72  d to set ALPN pr
ce60: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20  otocols", (char 
ce70: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
ce80: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
ce90: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
cea0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
ceb0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
cec0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
ced0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
cee0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
cef0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
cf00: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
cf10: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
cf20: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
cf30: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
cf40: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
cf50: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
cf60: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
cf70: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
cf80: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
cf90: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
cfa0: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
cfb0: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
cfc0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
cfd0: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
cfe0: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
cff0: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
d000: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
d010: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
d020: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
d030: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
d040: 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d  verify(statePtr-
d050: 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65  >ssl, verify, Ve
d060: 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  rifyCallback);. 
d070: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
d080: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
d090: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
d0a0: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
d0b0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
d0c0: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
d0d0: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
d0e0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
d0f0: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
d100: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
d110: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
d120: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
d130: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
d140: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
d150: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
d160: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
d170: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
d180: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
d190: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
d1a0: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
d1b0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
d1c0: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
d1d0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
d1e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
d1f0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
d200: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
d210: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
d220: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
d230: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
d240: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
d250: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
d260: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
d270: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
d280: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
d290: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
d2a0: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
d2b0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
d2c0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
d2d0: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
d2e0: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
d2f0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
d300: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
d310: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
d320: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
d330: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
d340: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
d350: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
d360: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
d370: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
d380: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
d390: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
d3a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
d3b0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
d3c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
d3d0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
d3e0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
d3f0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
d400: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
d410: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
d420: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
d430: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
d440: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
d450: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
d460: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
d470: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
d480: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
d490: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
d4a0: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
d4b0: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
d4c0: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
d4d0: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
d4e0: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
d4f0: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
d500: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
d510: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
d520: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
d530: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
d540: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
d550: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
d560: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
d570: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
d580: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
d590: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
d5a0: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
d5b0: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
d5c0: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
d5d0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
d5e0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
d5f0: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
d600: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
d610: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
d620: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
d630: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
d640: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
d650: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
d660: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
d670: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
d680: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
d690: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
d6a0: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
d6b0: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
d6c0: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
d6d0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
d6e0: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
d6f0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
d700: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
d710: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
d720: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
d730: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
d740: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
d750: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
d760: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
d770: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
d780: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
d790: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
d7a0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
d7b0: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
d7c0: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
d7d0: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
d7e0: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
d7f0: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
d800: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
d810: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
d820: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
d830: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
d840: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
d850: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
d860: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
d870: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
d880: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
d890: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
d8a0: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
d8b0: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
d8c0: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
d8d0: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
d8e0: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
d8f0: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
d900: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
d910: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
d920: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
d930: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
d940: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
d950: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
d960: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
d970: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
d980: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
d990: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
d9a0: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
d9b0: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
d9c0: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
d9d0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
d9e0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
d9f0: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
da00: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
da10: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
da20: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
da30: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
da40: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
da50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
da60: 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20  ;..clientData = 
da70: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a  clientData;.}...
da80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
da90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
daa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dac0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55  --------. *. * U
dad0: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d  nimportObjCmd --
dae0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
daf0: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
db00: 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74   to remove the t
db10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66  opmost channel f
db20: 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  ilter.. *. * Res
db30: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
db40: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
db50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
db60: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
db70: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
db80: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
db90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
dba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
dbe0: 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72  atic int.Unimpor
dbf0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
dc00: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
dc10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
dc20: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
dc30: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
dc40: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
dc50: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
dc60: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
dc70: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
dc80: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
dc90: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
dca0: 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
dcb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
dcc0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
dcd0: 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
dce0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
dcf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
dd00: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
dd10: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
dd20: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
dd30: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
dd40: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
dd50: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
dd60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
dd70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
dd80: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
dd90: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
dda0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
ddb0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
ddc0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
ddd0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  );..    if (Tcl_
dde0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
ddf0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
de00: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
de10: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
de20: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
de30: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
de40: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
de50: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
de60: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
de70: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
de80: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
de90: 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50  p, "TLS", "UNIMP
dea0: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
deb0: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
dec0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
ded0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
dee0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63     }..    if (Tc
def0: 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c  l_UnstackChannel
df00: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d  (interp, chan) =
df10: 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09  = TCL_ERROR) {..
df20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
df30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
df40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
df50: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
df60: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
df70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
df90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dfb0: 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69  --. *. * CTX_Ini
dfc0: 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61  t -- construct a
dfd0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
dfe0: 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  e. *. * Results:
dff0: 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f  . *.A valid SSL_
e000: 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20  CTX instance or 
e010: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  NULL.. *. * Side
e020: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e   effects:. *.con
e030: 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74  structs SSL cont
e040: 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d  ext (CTX). *. *-
e050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e090: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53  --. */.static SS
e0a0: 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74  L_CTX *.CTX_Init
e0b0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
e0c0: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
e0d0: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
e0e0: 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a  *keyfile, char *
e0f0: 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e  certfile,.    un
e100: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
e110: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
e120: 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c  *cert, int key_l
e130: 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e  en, int cert_len
e140: 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20  , char *CAdir,. 
e150: 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c     char *CAfile,
e160: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20   char *ciphers, 
e170: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
e180: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
e190: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b  har *DHparams) {
e1a0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
e1b0: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
e1c0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
e1d0: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
e1e0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
e1f0: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c  ring ds;.    Tcl
e200: 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20  _DString ds1;.  
e210: 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20    int off = 0;. 
e220: 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76     int load_priv
e230: 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e  ate_key;.    con
e240: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
e250: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
e260: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
e270: 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20      if (!proto) 
e280: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e290: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20  ult(interp, "no 
e2a0: 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73  valid protocol s
e2b0: 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  elected", NULL);
e2c0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
e2d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65     }..    /* cre
e2e0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  ate SSL context 
e2f0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
e300: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
e310: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20   0x10100000L || 
e320: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
e330: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
e340: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
e350: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
e360: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
e370: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L2)) {..Tcl_Appe
e380: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e390: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20   "SSL2 protocol 
e3a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
e3b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
e3c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
e3d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
e3e0: 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65  _SSL3) || define
e3f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
e400: 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  3).    if (ENABL
e410: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e420: 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63  OTO_SSL3)) {..Tc
e430: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e440: 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f  nterp, "SSL3 pro
e450: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
e460: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
e470: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e480: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
e490: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
e4a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e4b0: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20  NO_TLS1).    if 
e4c0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e4d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29  TLS_PROTO_TLS1))
e4e0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e4f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
e500: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.0 protocol n
e510: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
e520: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
e530: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
e540: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
e550: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
e560: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e570: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_1).    if (EN
e580: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
e590: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20  _PROTO_TLS1_1)) 
e5a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e5b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
e5c0: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.1 protocol no
e5d0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
e5e0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
e5f0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
e600: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
e610: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
e620: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e630: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_2).    if (ENA
e640: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e650: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b  PROTO_TLS1_2)) {
e660: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e670: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
e680: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.2 protocol not
e690: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
e6a0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
e6b0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
e6c0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
e6d0: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
e6e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e6f0: 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _3).    if (ENAB
e700: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e710: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a  ROTO_TLS1_3)) {.
e720: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e730: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
e740: 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .3 protocol not 
e750: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
e760: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e770: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
e780: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30    if (proto == 0
e790: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c  ) {../* Use full
e7a0: 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43   range */..SSL_C
e7b0: 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f  TX_set_min_proto
e7c0: 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29  _version(ctx, 0)
e7d0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
e7e0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
e7f0: 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  (ctx, 0);.    }.
e800: 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72 6f  .    switch (pro
e810: 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53  to) {.#if OPENSS
e820: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
e830: 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26   < 0x10100000L &
e840: 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  & !defined(NO_SS
e850: 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L2) && !defined(
e860: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
e870: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e880: 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f  OTO_SSL2:..metho
e890: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53  d = isServer ? S
e8a0: 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68  SLv2_server_meth
e8b0: 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69  od() : SSLv2_cli
e8c0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
e8d0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
e8e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
e8f0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
e900: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20  PENSSL_NO_SSL3) 
e910: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e920: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
e930: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
e940: 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65  _PROTO_SSL3:..me
e950: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e960: 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d  ? SSLv3_server_m
e970: 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f  ethod() : SSLv3_
e980: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e990: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
e9a0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e9b0: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
e9c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e9d0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
e9e0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
e9f0: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
ea00: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a  TLS_PROTO_TLS1:.
ea10: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
ea20: 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65  er ? TLSv1_serve
ea30: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
ea40: 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  v1_client_method
ea50: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
ea60: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
ea70: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
ea80: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
ea90: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
eaa0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
eab0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
eac0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
ead0: 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68  TO_TLS1_1:..meth
eae0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
eaf0: 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d  TLSv1_1_server_m
eb00: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
eb10: 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  1_client_method(
eb20: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
eb30: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
eb40: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
eb50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
eb60: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
eb70: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
eb80: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
eb90: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
eba0: 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f  O_TLS1_2:..metho
ebb0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
ebc0: 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65  LSv1_2_server_me
ebd0: 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32  thod() : TLSv1_2
ebe0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
ebf0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
ec00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
ec10: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
ec20: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
ec30: 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65  TLS1_3).    case
ec40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
ec50: 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67  3:../* Use the g
ec60: 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e  eneric method an
ec70: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e  d constraint ran
ec80: 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74  ge after context
ec90: 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09   is created */..
eca0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
ecb0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
ecc0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
ecd0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
ece0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
ecf0: 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e    default:../* N
ed00: 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73 74  egotiate highest
ed10: 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54   available SSL/T
ed20: 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d  LS version */..m
ed30: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
ed40: 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65   ? TLS_server_me
ed50: 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69  thod() : TLS_cli
ed60: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69  ent_method();.#i
ed70: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
ed80: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
ed90: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
eda0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
edb0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
edc0: 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d  NO_SSL2)..off |=
edd0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
ede0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
edf0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
ee00: 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69  NO_SSLv2);.#endi
ee10: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
ee20: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
ee30: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
ee40: 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  SL3)..off |= (EN
ee50: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
ee60: 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f  _PROTO_SSL3)   ?
ee70: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53   0 : SSL_OP_NO_S
ee80: 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69  SLv3);.#endif.#i
ee90: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
eea0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
eeb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
eec0: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
eed0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
eee0: 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a  TO_TLS1)   ? 0 :
eef0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
ef00: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
ef10: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
ef20: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
ef30: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
ef40: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
ef50: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
ef60: 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a  TO_TLS1_1) ? 0 :
ef70: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
ef80: 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _1);.#endif.#if 
ef90: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
efa0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
efb0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
efc0: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
efd0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
efe0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30  ROTO_TLS1_2) ? 0
eff0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
f000: 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_2);.#endif.#i
f010: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
f020: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
f030: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
f040: 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_3)..off |= (EN
f050: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
f060: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f  _PROTO_TLS1_3) ?
f070: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
f080: 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_3);.#endif.
f090: 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20  .break;.    }.. 
f0a0: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
f0b0: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d  or();..    ctx =
f0c0: 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74   SSL_CTX_new(met
f0d0: 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63  hod);.    if (!c
f0e0: 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55  tx) {..return(NU
f0f0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
f100: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
f110: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
f120: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
f130: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
f140: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
f150: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
f160: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
f170: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
f180: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
f190: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
f1a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
f1b0: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
f1c0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
f1d0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
f1e0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
f1f0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
f200: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
f210: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
f220: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
f230: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73  * Force cipher s
f240: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62  election order b
f250: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20  y server */.    
f260: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b  if (!isServer) {
f270: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70  ..SSL_CTX_set_op
f280: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
f290: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f  P_CIPHER_SERVER_
f2a0: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20  PREFERENCE);.   
f2b0: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
f2c0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
f2d0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
f2e0: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c   OpenSSL_add_all
f2f0: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f  _algorithms(); /
f300: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61  * Load ciphers a
f310: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65  nd digests */.#e
f320: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54  ndif..    SSL_CT
f330: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
f340: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
f350: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
f360: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
f370: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
f380: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
f390: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
f3a0: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
f3b0: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
f3c0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
f3d0: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e  ns(ctx, SSL_OP_N
f3e0: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09  O_COMPRESSION);.
f3f0: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72  /* disable compr
f400: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73  ession even if s
f410: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
f420: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
f430: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09  ons(ctx, off);..
f440: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f  /* disable proto
f450: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a  col versions */.
f460: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
f470: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
f480: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c  0101000L.    SSL
f490: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74  _CTX_set_mode(ct
f4a0: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
f4b0: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64  _RETRY);./* hand
f4c0: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65  le new handshake
f4d0: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e  s in background.
f4e0: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69   On by default i
f4f0: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e  n OpenSSL 1.1.1.
f500: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53   */.#endif.    S
f510: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
f520: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20  cache_size(ctx, 
f530: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  128);..    /* Se
f540: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  t user defined c
f550: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73  iphers, cipher s
f560: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72  uites, and secur
f570: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
f580: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
f590: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
f5a0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
f5b0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
f5c0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f5d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
f5e0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65  et ciphers faile
f5f0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
f600: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
f610: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
f620: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
f630: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
f640: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69    if ((ciphersui
f650: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  tes != NULL) && 
f660: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
f670: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63  hersuites(ctx, c
f680: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a  iphersuites)) {.
f690: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f6a0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
f6b0: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69  ipher suites fai
f6c0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
f6d0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
f6e0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
f6f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
f700: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
f710: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
f720: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f730: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
f740: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
f750: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
f760: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
f770: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
f780: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
f790: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
f7a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
f7b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
f7c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f7d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
f7e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
f7f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
f800: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
f810: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
f820: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
f830: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
f840: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
f850: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
f860: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
f870: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
f880: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  */.#ifdef OPENSS
f890: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
f8a0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f8b0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f8c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
f8d0: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
f8e0: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
f8f0: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
f900: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
f910: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
f920: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
f930: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
f940: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
f950: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
f960: 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63  IO *bio;..    Tc
f970: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
f980: 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  s);..    bio = B
f990: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
f9a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
f9b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
f9c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
f9d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f9e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f9f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
fa00: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
fa10: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
fa20: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
fa30: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
fa40: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
fa50: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
fa60: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
fa70: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
fa80: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
fa90: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
faa0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
fab0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
fac0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
fad0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
fae0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
faf0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
fb00: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
fb10: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
fb20: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
fb30: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
fb40: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
fb50: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  }..} else {..   
fb60: 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72 61   dh = get_dhPara
fb70: 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43 54  ms();..}..SSL_CT
fb80: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78  X_set_tmp_dh(ctx
fb90: 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65 28  , dh);..DH_free(
fba0: 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  dh);.    }.#endi
fbb0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
fbc0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
fbd0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
fbe0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
fbf0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
fc00: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
fc10: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
fc20: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
fc30: 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  &ds);...if (SSL_
fc40: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
fc50: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  ate_file(ctx, F2
fc60: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29  N(certfile, &ds)
fc70: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
fc80: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  EM) <= 0) {..   
fc90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
fca0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
fcb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fcc0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
fcd0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  set certificate 
fce0: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
fcf0: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
fd00: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
fd10: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
fd20: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
fd30: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
fd40: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
fd50: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
fd60: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
fd70: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
fd80: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
fd90: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
fda0: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
fdb0: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
fdc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
fdd0: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
fde0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fdf0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
fe00: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
fe10: 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53   ",....     REAS
fe20: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
fe30: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
fe40: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
fe50: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
fe60: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
fe70: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61  .certfile = (cha
fe80: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
fe90: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
fea0: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
feb0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
fec0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c  ile(ctx, certfil
fed0: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  e, SSL_FILETYPE_
fee0: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66  PEM) <= 0) {.#if
fef0: 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   0..    Tcl_DStr
ff00: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
ff10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ff20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
ff30: 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75  ble to use defau
ff40: 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  lt certificate f
ff50: 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c  ile ", certfile,
ff60: 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52   ": ",....     R
ff70: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
ff80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
ff90: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ffa0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
ffb0: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  L;.#endif..}.   
ffc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
ffd0: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
ffe0: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
fff0: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
10000 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
10010 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
10020 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
10030 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
10040 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
10050 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
10060 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
10070 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
10080 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
10090 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
100a0 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
100b0 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
100c0 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
100d0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
100e0 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
100f0 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
10100 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
10110 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
10120 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
10130 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10140 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
10150 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
10160 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
10170 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
10180 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
10190 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
101a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
101b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
101c0 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
101d0 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
101e0 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
101f0 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20 20  e, " ",....     
10200 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
10210 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
10220 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
10230 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
10240 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
10250 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
10260 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20  s);...} else if 
10270 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (key != NULL) {.
10280 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58  .    if (SSL_CTX
10290 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f  _use_PrivateKey_
102a0 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52 53  ASN1(EVP_PKEY_RS
102b0 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79 5f  A, ctx, key,key_
102c0 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54  len) <= 0) {...T
102d0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
102e0 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20  ds);.../* flush 
102f0 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77  the passphrase w
10300 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65  hich might be le
10310 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ft in the result
10320 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73   */...Tcl_SetRes
10330 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c  ult(interp, NULL
10340 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09  , TCL_STATIC);..
10350 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
10360 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
10370 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20  e to set public 
10380 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  key: ", REASON()
10390 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
103a0 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
103b0 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
103c0 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
103d0 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20  ./* Now we know 
103e0 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63  that a key and c
103f0 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65  ert have been se
10400 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68  t against.. * th
10410 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
10420 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63  ..if (!SSL_CTX_c
10430 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79  heck_private_key
10440 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63  (ctx)) {..    Tc
10450 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10460 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20  nterp, "private 
10470 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  key does not mat
10480 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61  ch the certifica
10490 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a  te public key",.
104a0 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29  ...     (char *)
104b0 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
104c0 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
104d0 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
104e0 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
104f0 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61 74  /* Set verificat
10500 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54  ion CAs */.    T
10510 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
10520 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ds);.    Tcl_DSt
10530 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a  ringInit(&ds1);.
10540 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20      /* There is 
10550 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72 65  one default dire
10560 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75  ctory, one defau
10570 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65  lt file, and one
10580 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a   default store..
10590 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 41 20  .The default CA 
105a0 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69 72  certificates dir
105b0 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61  ectory (and defa
105c0 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e  ult store) is in
105d0 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65   the OpenSSL..ce
105e0 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49  rts directory. I
105f0 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  t can be overrid
10600 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43  den by the SSL_C
10610 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e  ERT_DIR env var.
10620 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41   The..default CA
10630 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66 69   certificates fi
10640 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72  le is called cer
10650 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66  t.pem in the def
10660 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69  ault OpenSSL..di
10670 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20  rectory. It can 
10680 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
10690 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49   the SSL_CERT_FI
106a0 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09  LE env var. */..
106b0 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73  /* int SSL_CTX_s
106c0 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
106d0 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63  y_dir(SSL_CTX *c
106e0 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f  tx) and int SSL_
106f0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
10700 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f  verify_file(SSL_
10710 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20  CTX *ctx) */.   
10720 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f   if (!SSL_CTX_lo
10730 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69  ad_verify_locati
10740 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ons(ctx, F2N(CAf
10750 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43  ile, &ds), F2N(C
10760 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a  Adir, &ds1)) ||.
10770 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  .!SSL_CTX_set_de
10780 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74  fault_verify_pat
10790 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30  hs(ctx)) {.#if 0
107a0 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
107b0 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74  e(&ds);..Tcl_DSt
107c0 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
107d0 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e  ./* Don't curren
107e0 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69 73  tly care if this
107f0 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41   fails */..Tcl_A
10800 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10810 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74  rp, "SSL default
10820 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20 22   verify paths: "
10830 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  , REASON(), (cha
10840 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
10850 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
10860 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65  .return NULL;.#e
10870 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
10880 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63  /* https://sourc
10890 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73  eforge.net/p/tls
108a0 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20 20  /bugs/57/ */.   
108b0 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65   /* XXX:TODO: Le
108c0 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c  t the user suppl
108d0 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e  y values here in
108e0 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69  stead of somethi
108f0 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f  ng that exists o
10900 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
10910 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66 69   */.    if (CAfi
10920 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 53  le != NULL) {..S
10930 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
10940 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20  E) *certNames = 
10950 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f  SSL_load_client_
10960 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69  CA_file(F2N(CAfi
10970 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20 28  le, &ds));..if (
10980 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c  certNames != NUL
10990 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
109a0 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
109b0 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
109c0 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  mes);..}.    }..
109d0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
109e0 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54 63  ree(&ds);.    Tc
109f0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
10a00 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  s1);.    return 
10a10 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ctx;.}.../*. *--
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a60 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62  -. *. * StatusOb
10a70 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
10a80 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63  ertificate for c
10a90 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20  onnected peer.. 
10aa0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
10ab0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
10ac0 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
10ad0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
10ae0 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10b30 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61  /.static int.Sta
10b40 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  tusObjCmd(Client
10b50 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
10b60 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10b70 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
10b80 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
10b90 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74  jv[]) {.    Stat
10ba0 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20  e *statePtr;.   
10bb0 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20   X509 *peer;.   
10bc0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
10bd0 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
10be0 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72  l chan;.    char
10bf0 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a   *channelName, *
10c00 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74  ciphers;.    int
10c10 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   mode;.    const
10c20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
10c30 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67  proto;.    unsig
10c40 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20  ned int len;.   
10c50 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a   int nid, res;..
10c60 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
10c70 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
10c80 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63  objc < 2 || objc
10c90 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d   > 3 || (objc ==
10ca0 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63   3 && !strcmp(Tc
10cb0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10cc0 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29  [1]), "-local"))
10cd0 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
10ce0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
10cf0 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f   objv, "?-local?
10d00 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74   channel");..ret
10d10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10d20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
10d30 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20   channel Id */. 
10d40 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d     channelName =
10d50 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10d60 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63  omObj(objv[(objc
10d70 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c   == 2 ? 1 : 2)],
10d80 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61 6e   NULL);.    chan
10d90 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
10da0 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65  l(interp, channe
10db0 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20  lName, &mode);. 
10dc0 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
10dd0 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
10de0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
10df0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
10e00 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
10e10 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
10e20 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
10e30 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
10e40 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
10e50 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
10e60 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
10e70 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
10e80 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
10e90 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
10ea0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
10eb0 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
10ec0 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
10ed0 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
10ee0 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
10ef0 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53  ", NULL);..Tcl_S
10f00 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
10f10 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54  rp, "TLS", "STAT
10f20 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  US", "CHANNEL", 
10f30 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
10f40 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
10f50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10f60 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72    }.    statePtr
10f70 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c   = (State *) Tcl
10f80 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
10f90 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
10fa0 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69      /* Get certi
10fb0 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20  ficate for peer 
10fc0 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69  or self */.    i
10fd0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
10fe0 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  .peer = SSL_get_
10ff0 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65  peer_certificate
11000 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
11010 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70  .    } else {..p
11020 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65  eer = SSL_get_ce
11030 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50  rtificate(stateP
11040 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  tr->ssl);.    }.
11050 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20      /* Get X509 
11060 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f  certificate info
11070 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72   */.    if (peer
11080 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c  ) {..objPtr = Tl
11090 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
110a0 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20  erp, peer);..if 
110b0 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20  (objc == 2) {.. 
110c0 20 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65     X509_free(pee
110d0 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20  r);..    peer = 
110e0 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65  NULL;..}.    } e
110f0 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  lse {..objPtr = 
11100 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
11110 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a  , NULL);.    }..
11120 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65      /* Peer name
11130 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
11140 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11150 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20  tr, "peername", 
11160 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d  SSL_get0_peernam
11170 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
11180 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45  , -1);.    LAPPE
11190 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
111a0 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20  bjPtr, "sbits", 
111b0 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62  SSL_get_cipher_b
111c0 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  its(statePtr->ss
111d0 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20  l, NULL));..    
111e0 63 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a  ciphers = (char*
111f0 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28  )SSL_get_cipher(
11200 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
11210 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
11220 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11230 22 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72  "cipher", cipher
11240 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  s, -1);..    /* 
11250 56 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20  Verify the X509 
11260 63 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73  certificate pres
11270 65 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65  ented by the pee
11280 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  r */.    LAPPEND
11290 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
112a0 50 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75  Ptr, "verifyResu
112b0 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66  lt",..X509_verif
112c0 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
112d0 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69  ing(SSL_get_veri
112e0 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
112f0 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a  tr->ssl)), -1);.
11300 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d  .    /* Verify m
11310 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20  ode */.    mode 
11320 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  = SSL_get_verify
11330 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
11340 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f  ssl);.    if (mo
11350 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
11360 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e  _NONE) {..LAPPEN
11370 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11380 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64  jPtr, "verifyMod
11390 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  e", "none", -1);
113a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
113b0 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50  cl_Obj *listObjP
113c0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
113d0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69  Obj(0, NULL);..i
113e0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
113f0 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20  ERIFY_PEER) {.. 
11400 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11410 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11420 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
11430 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11440 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09  ("peer", -1));..
11450 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
11460 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
11470 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20  F_NO_PEER_CERT) 
11480 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
11490 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
114a0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
114b0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
114c0 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f  gObj("fail if no
114d0 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29   peer cert", -1)
114e0 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  );..}..if (mode 
114f0 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c  && SSL_VERIFY_CL
11500 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20  IENT_ONCE) {..  
11510 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
11520 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
11530 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
11540 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
11550 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d  "client once", -
11560 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
11570 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
11580 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20  POST_HANDSHAKE) 
11590 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
115a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
115b0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
115c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
115d0 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73  gObj("post hands
115e0 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  hake", -1));..}.
115f0 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74  .LAPPEND_OBJ(int
11600 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
11610 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f  rifyMode", listO
11620 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20  bjPtr).    }..  
11630 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65    /* Verify mode
11640 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41   depth */.    LA
11650 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11660 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
11670 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74  yDepth", SSL_get
11680 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74  _verify_depth(st
11690 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a  atePtr->ssl));..
116a0 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68      /* Report th
116b0 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
116c0 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
116d0 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69  of the negotiati
116e0 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65  on */.    SSL_ge
116f0 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64  t0_alpn_selected
11700 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11710 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20  &proto, &len);. 
11720 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
11730 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11740 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70  alpn", (char *)p
11750 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e 29  roto, (int) len)
11760 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
11770 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11780 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53  , "protocol", SS
11790 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74  L_get_version(st
117a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
117b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  );..    /* Valid
117c0 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67   for non-RSA sig
117d0 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31  nature and TLS 1
117e0 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62  .3 */.    if (ob
117f0 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20  jc == 2) {..res 
11800 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73  = SSL_get_peer_s
11810 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61  ignature_nid(sta
11820 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
11830 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
11840 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73  .res = SSL_get_s
11850 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61  ignature_nid(sta
11860 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
11870 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
11880 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b  (!res) {nid = 0;
11890 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  }.    LAPPEND_ST
118a0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
118b0 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68  , "signatureHash
118c0 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f  Algorithm", OBJ_
118d0 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
118e0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
118f0 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 2) {..res = S
11900 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e  SL_get_peer_sign
11910 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73  ature_type_nid(s
11920 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
11930 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  id);.    } else 
11940 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
11950 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f  _signature_type_
11960 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
11970 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
11980 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
11990 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
119a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
119b0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
119c0 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69  ureType", OBJ_ni
119d0 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a  d2ln(nid), -1);.
119e0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
119f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
11a00 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
11a10 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e  n TCL_OK;..clien
11a20 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61  tData = clientDa
11a30 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ta;.}.../*. *---
11a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f  . *. * Connectio
11a90 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72  nInfoObjCmd -- r
11aa0 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  eturn connection
11ab0 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53   info from OpenS
11ac0 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
11ad0 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20  s:. *.A list of 
11ae0 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a  connection info.
11af0 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    *. *----------
11b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
11b40 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63  tatic int Connec
11b50 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43  tionInfoObjCmd(C
11b60 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
11b70 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
11b80 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
11b90 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
11ba0 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
11bb0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
11bc0 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
11bd0 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
11be0 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65   on */.    State
11bf0 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
11c00 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
11c10 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
11c20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
11c30 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20  tr, *listPtr;.  
11c40 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c    const SSL *ssl
11c50 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
11c60 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a  CIPHER *cipher;.
11c70 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45      const SSL_SE
11c80 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a  SSION *session;.
11c90 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44      const EVP_MD
11ca0 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f   *md;..    if (o
11cb0 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
11cc0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11cd0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
11ce0 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
11cf0 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
11d00 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
11d10 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
11d20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
11d30 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
11d40 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
11d50 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
11d60 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
11d70 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
11d80 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
11d90 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
11da0 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
11db0 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
11dc0 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
11dd0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
11de0 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
11df0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
11e00 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
11e10 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
11e20 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
11e30 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11e40 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
11e50 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
11e60 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
11e70 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
11e80 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
11e90 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
11ea0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
11eb0 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22  S", "CONNECTION"
11ec0 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
11ed0 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
11ee0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28   NULL);..return(
11ef0 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
11f00 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  }..    objPtr = 
11f10 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
11f20 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a  , NULL);..    /*
11f30 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   Connection info
11f40 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
11f50 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f   = (State *)Tcl_
11f60 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
11f70 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20  ceData(chan);.  
11f80 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72    ssl = statePtr
11f90 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73  ->ssl;.    if (s
11fa0 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f  sl != NULL) {../
11fb0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61  * connection sta
11fc0 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  te */..LAPPEND_S
11fd0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11fe0 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f  r, "state", SSL_
11ff0 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
12000 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f  g(ssl), -1);.../
12010 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73  * Get SNI reques
12020 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ted server name 
12030 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
12040 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12050 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53  "servername", SS
12060 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65  L_get_servername
12070 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d  (ssl, TLSEXT_NAM
12080 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
12090 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
120a0 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50  protocol */..LAP
120b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
120c0 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
120d0 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
120e0 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a  sion(ssl), -1);.
120f0 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69  ../* Renegotiati
12100 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c  on allowed */..L
12110 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12120 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e  rp, objPtr, "ren
12130 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77  egotiation_allow
12140 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  ed", SSL_get_sec
12150 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f  ure_renegotiatio
12160 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29 29 3b  n_support(ssl));
12170 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69  .../* Get securi
12180 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50  ty level */..LAP
12190 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
121a0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69   objPtr, "securi
121b0 74 79 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65  tylevel", SSL_ge
121c0 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
121d0 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  (ssl));.../* Ses
121e0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  sion info */..LA
121f0 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12200 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
12210 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c  ion_reused", SSL
12220 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28  _session_reused(
12230 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73  ssl));.../* Is s
12240 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c  erver info */..L
12250 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12260 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
12270 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f  server", SSL_is_
12280 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09  server(ssl));...
12290 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c  /* Is DTLS */..L
122a0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
122b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
122c0 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74  dtls", SSL_is_dt
122d0 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a  ls(ssl));.    }.
122e0 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69  .    /* Cipher i
122f0 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65  nfo */.    ciphe
12300 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  r = SSL_get_curr
12310 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b  ent_cipher(ssl);
12320 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20  .    if (cipher 
12330 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  != NULL) {..char
12340 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b   buf[BUFSIZ] = {
12350 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61  0};..int bits, a
12360 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69  lg_bits;.../* Ci
12370 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  pher name */..LA
12380 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12390 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
123a0 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  r", SSL_CIPHER_g
123b0 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  et_name(cipher),
123c0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e   -1);.../* RFC n
123d0 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f  ame of cipher */
123e0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
123f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
12400 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53  tandard_name", S
12410 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
12420 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c  rd_name(cipher),
12430 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53   -1);.../* OpenS
12440 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  SL name of ciphe
12450 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
12460 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12470 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22  , "openssl_name"
12480 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72  , OPENSSL_cipher
12490 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52  _name(SSL_CIPHER
124a0 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63  _standard_name(c
124b0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09  ipher)), -1);...
124c0 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63  /* number of sec
124d0 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f  ret bits used fo
124e0 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74  r cipher */..bit
124f0 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  s = SSL_CIPHER_g
12500 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20  et_bits(cipher, 
12510 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50  &alg_bits);..LAP
12520 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
12530 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74   objPtr, "secret
12540 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09  _bits", bits);..
12550 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
12560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67  rp, objPtr, "alg
12570 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c  orithm_bits", al
12580 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67  g_bits);../* alg
12590 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20  _bits is actual 
125a0 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e  key secret bits.
125b0 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64   If use bits and
125c0 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74   secret (algorit
125d0 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c  hm) bits differ,
125e0 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66  ..   the rest of
125f0 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69   the bits are fi
12600 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69  xed, i.e. for li
12610 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70  mited export cip
12620 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29  hers (bits < 56)
12630 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74   */.../* Indicat
12640 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53  es which SSL/TLS
12650 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
12660 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  n first defined 
12670 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  the cipher */..L
12680 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12690 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f  p, objPtr, "min_
126a0 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49  version", SSL_CI
126b0 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e  PHER_get_version
126c0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
126d0 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a  ./* Cipher NID *
126e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
126f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12700 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61  cipherNID", (cha
12710 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
12720 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69  SL_CIPHER_get_ci
12730 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29  pher_nid(cipher)
12740 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
12750 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12760 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22  Ptr, "digestNID"
12770 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12780 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12790 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63  get_digest_nid(c
127a0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
127b0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
127c0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45  p, objPtr, "keyE
127d0 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68  xchangeNID", (ch
127e0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
127f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b  SSL_CIPHER_get_k
12800 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  x_nid(cipher)), 
12810 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
12820 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12830 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f  , "authenticatio
12840 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  nNID", (char *)O
12850 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
12860 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69  PHER_get_auth_ni
12870 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
12880 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75  .../* message au
12890 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64  thentication cod
128a0 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45  e - Cipher is AE
128b0 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20  AD (e.g. GCM or 
128c0 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30  ChaCha20/Poly130
128d0 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a  5) or not */../*
128e0 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45   Authenticated E
128f0 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61  ncryption with a
12900 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28  ssociated data (
12910 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09  AEAD) check */..
12920 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
12930 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
12940 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53  pher_is_aead", S
12950 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61  SL_CIPHER_is_aea
12960 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
12970 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72   Digest used dur
12980 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20  ing the SSL/TLS 
12990 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75  handshake when u
129a0 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e  sing the cipher.
129b0 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49   */..md = SSL_CI
129c0 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61  PHER_get_handsha
129d0 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72  ke_digest(cipher
129e0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
129f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12a00 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73  "handshake_diges
12a10 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f  t", (char *)EVP_
12a20 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29  MD_name(md), -1)
12a30 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53  ;.../* Get OpenS
12a40 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20  SL-specific ID, 
12a50 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09  not IANA ID */..
12a60 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
12a70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
12a80 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  her_id", (int) S
12a90 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64  SL_CIPHER_get_id
12aa0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
12ab0 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64  Two-byte ID used
12ac0 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74   in the TLS prot
12ad0 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65  ocol of the give
12ae0 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  n cipher */..LAP
12af0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
12b00 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
12b10 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  ol_id", (int) SS
12b20 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f  L_CIPHER_get_pro
12b30 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29  tocol_id(cipher)
12b40 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20  );.../* Textual 
12b50 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74  description of t
12b60 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66  he cipher */..if
12b70 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73   (SSL_CIPHER_des
12b80 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c  cription(cipher,
12b90 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66   buf, sizeof(buf
12ba0 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  )) != NULL) {.. 
12bb0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
12bc0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12bd0 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75  description", bu
12be0 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d  f, -1);..}.    }
12bf0 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
12c00 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73   info */.    ses
12c10 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73  sion = SSL_get_s
12c20 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20  ession(ssl);.   
12c30 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20   if (session != 
12c40 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75  NULL) {..const u
12c50 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69  nsigned char *ti
12c60 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65  cket;..size_t le
12c70 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  n2;..unsigned in
12c80 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75  t ulen;..const u
12c90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
12ca0 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f  ssion_id, *proto
12cb0 3b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 53  ;..char buffer[S
12cc0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
12cd0 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20  Y_LENGTH];.../* 
12ce0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
12cf0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
12d00 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
12d10 41 4c 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e  ALPN negotiation
12d20 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
12d30 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63  _get0_alpn_selec
12d40 74 65 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72  ted(session, &pr
12d50 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  oto, &len2);..LA
12d60 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12d70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22  , objPtr, "alpn"
12d80 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
12d90 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a  , (int) len2);..
12da0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
12db0 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12dc0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12dd0 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74  the NPN negotiat
12de0 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  ion */.#ifdef US
12df0 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f  E_NPN..SSL_get0_
12e00 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74  next_proto_negot
12e10 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74  iated(ssl, &prot
12e20 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  o, &ulen);..LAPP
12e30 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12e40 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28  objPtr, "npn", (
12e50 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
12e60 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64  int) ulen);.#end
12e70 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  if.../* Resumabl
12e80 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41  e session */..LA
12e90 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12ea0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75  p, objPtr, "resu
12eb0 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53  mable", SSL_SESS
12ec0 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
12ed0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
12ee0 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74   Session start t
12ef0 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e  ime (seconds sin
12f00 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41  ce epoch) */..LA
12f10 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
12f20 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72  p, objPtr, "star
12f30 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53  t_time", SSL_SES
12f40 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65  SION_get_time(se
12f50 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69  ssion));.../* Ti
12f60 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53  meout value - SS
12f70 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75  L_CTX_get_timeou
12f80 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
12f90 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
12fa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12fb0 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53  "timeout", SSL_S
12fc0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
12fd0 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  ut(session));...
12fe0 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20  /* Session id - 
12ff0 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f  TLSv1.2 and belo
13000 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69  w only */..sessi
13010 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
13020 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
13030 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
13040 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
13050 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
13060 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
13070 6e 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e  n_id, (int) ulen
13080 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
13090 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 65 73 73  context */..sess
130a0 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
130b0 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e  SION_get0_id_con
130c0 74 65 78 74 28 73 65 73 73 69 6f 6e 2c 20 26 75  text(session, &u
130d0 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  len);..LAPPEND_B
130e0 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
130f0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63  jPtr, "session_c
13100 6f 6e 74 65 78 74 22 2c 20 73 65 73 73 69 6f 6e  ontext", session
13110 5f 69 64 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29  _id, (int) ulen)
13120 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
13130 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f  icket - client o
13140 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  nly */..SSL_SESS
13150 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28  ION_get0_ticket(
13160 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
13170 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
13180 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
13190 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
131a0 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b  on_ticket", tick
131b0 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b  et, (int) len2);
131c0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
131d0 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69  cket lifetime hi
131e0 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  nt (in seconds) 
131f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
13200 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13210 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c   "lifetime", SSL
13220 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
13230 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
13240 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
13250 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
13260 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f  a */..SSL_SESSIO
13270 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
13280 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c 20 26  pdata(session, &
13290 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
132a0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
132b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
132c0 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61  "ticket_app_data
132d0 22 2c 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29  ", ticket, (int)
132e0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 47 65 74   len2);.../* Get
132f0 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f 0a 09   master key */..
13300 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53 53 49  len2 = SSL_SESSI
13310 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f 6b 65  ON_get_master_ke
13320 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66 66 65  y(session, buffe
13330 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  r, SSL_MAX_MASTE
13340 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b 0a 09  R_KEY_LENGTH);..
13350 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
13360 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13370 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62 75 66  master_key", buf
13380 66 65 72 2c 20 28 69 6e 74 29 20 6c 65 6e 32 29  fer, (int) len2)
13390 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69  ;.../* Compressi
133a0 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e  on id */..unsign
133b0 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f  ed int id = SSL_
133c0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70  SESSION_get_comp
133d0 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29  ress_id(session)
133e0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
133f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13400 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c  compression_id",
13410 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62   id == 1 ? "zlib
13420 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  " : "none", -1);
13430 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13440 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20  ompression info 
13450 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  */.    if (ssl !
13460 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66  = NULL) {.#ifdef
13470 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45   HAVE_SSL_COMPRE
13480 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d  SSION..const COM
13490 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20  P_METHOD *comp, 
134a0 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53  *expn;..comp = S
134b0 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
134c0 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b  ompression(ssl);
134d0 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74  ..expn = SSL_get
134e0 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69  _current_expansi
134f0 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45  on(ssl);...LAPPE
13500 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
13510 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73  bjPtr, "compress
13520 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c  ion", comp ? SSL
13530 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63  _COMP_get_name(c
13540 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d  omp) : "none", -
13550 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
13560 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13570 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78   "expansion", ex
13580 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65  pn ? SSL_COMP_ge
13590 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22  t_name(expn) : "
135a0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73  none", -1);.#els
135b0 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  e..LAPPEND_STR(i
135c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
135d0 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e  compression", "n
135e0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
135f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13600 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
13610 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
13620 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  ;.#endif.    }..
13630 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e      /* Server in
13640 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e  fo */.    {..lon
13650 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58  g mode = SSL_CTX
13660 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _get_session_cac
13670 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
13680 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d  ->ctx);..char *m
13690 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26  sg;...if (mode &
136a0 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
136b0 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  OFF) {..    msg 
136c0 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65  = "off";..} else
136d0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
136e0 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
136f0 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  T) {..    msg = 
13700 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73  "client";..} els
13710 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
13720 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56  _SESS_CACHE_SERV
13730 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  ER) {..    msg =
13740 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c   "server";..} el
13750 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
13760 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54  L_SESS_CACHE_BOT
13770 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  H) {..    msg = 
13780 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20  "both";..} else 
13790 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e  {..    msg = "un
137a0 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50  known";..}..LAPP
137b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
137c0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
137d0 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73  _cache_mode", ms
137e0 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  g, -1);.    }.. 
137f0 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f     /* CA List */
13800 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61  .    /* IF not a
13810 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73   server, same as
13820 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43   SSL_get0_peer_C
13830 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65  A_list. If serve
13840 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54  r same as SSL_CT
13850 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_get_client_CA_
13860 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74  list */.    list
13870 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
13880 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
13890 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39     STACK_OF(X509
138a0 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b  _NAME) *ca_list;
138b0 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73  .    if ((ca_lis
138c0 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65  t = SSL_get_clie
138d0 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29  nt_CA_list(ssl))
138e0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61   != NULL) {..cha
138f0 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d  r buffer[BUFSIZ]
13900 3b 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20  ;..for (int i = 
13910 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e  0; i < sk_X509_N
13920 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29  AME_num(ca_list)
13930 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35  ; i++) {..    X5
13940 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20  09_NAME *name = 
13950 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c  sk_X509_NAME_val
13960 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a  ue(ca_list, i);.
13970 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b  .    if (name) {
13980 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65  ...X509_NAME_one
13990 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65  line(name, buffe
139a0 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63  r, BUFSIZ);...Tc
139b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
139c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
139d0 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
139e0 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c  tringObj(buffer,
139f0 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d   -1));..    }..}
13a00 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
13a10 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
13a20 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c  bjPtr, "caList",
13a30 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c   listPtr);.    L
13a40 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
13a50 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69  p, objPtr, "caLi
13a60 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30  stCount", sk_X50
13a70 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69  9_NAME_num(ca_li
13a80 73 74 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53  st));..    Tcl_S
13a90 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
13aa0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
13ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13ac0 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
13ad0 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
13ae0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13b20 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
13b30 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
13b40 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
13b50 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
13b60 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
13b70 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
13b80 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
13b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13bd0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
13be0 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
13bf0 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
13c00 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
13c10 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
13c20 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
13c30 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
13c40 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
13c50 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
13c60 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
13c70 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
13c80 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
13c90 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
13ca0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
13cb0 20 20 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74     int cmd, isSt
13cc0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
13cd0 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20  er[16384];..    
13ce0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
13cf0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
13d00 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
13d10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13d20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
13d30 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
13d40 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13d50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
13d60 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
13d70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13d80 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
13d90 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26   "command", 0, &
13da0 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
13db0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
13dc0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
13dd0 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
13de0 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
13df0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
13e00 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
13e10 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
13e20 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
13e30 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
13e40 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
13e50 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
13e60 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
13e70 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
13e80 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
13e90 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
13ea0 73 74 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69  stv;..    int li
13eb0 73 74 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f  stc,i;...    BIO
13ec0 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
13ed0 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a    char *k_C="",*
13ee0 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c  k_ST="",*k_L="",
13ef0 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22  *k_O="",*k_OU=""
13f00 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61  ,*k_CN="",*k_Ema
13f10 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72  il="";..    char
13f20 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74   *keyout,*pemout
13f30 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20  ,*str;..    int 
13f40 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30  keysize,serial=0
13f50 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20  ,days=365;..#if 
13f60 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13f70 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13f80 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d  000L..    BIGNUM
13f90 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20   *bne = NULL;.. 
13fa0 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55     RSA *rsa = NU
13fb0 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45  LL;.#else..    E
13fc0 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78  VP_PKEY_CTX *ctx
13fd0 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
13fe0 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c  ..    if ((objc<
13ff0 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20  5) || (objc>6)) 
14000 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {...Tcl_WrongNum
14010 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
14020 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b  objv, "keysize k
14030 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20  eyfile certfile 
14040 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75  ?info?");...retu
14050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
14060 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54     }...    if (T
14070 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14080 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14090 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54  , &keysize) != T
140a0 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
140b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
140c0 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d    }..    keyout=
140d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
140e0 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d  jv[3]);..    pem
140f0 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
14100 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20  g(objv[4]);..   
14110 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09   if (isStr) {...
14120 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
14130 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,keyout,"",0);.
14140 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
14150 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29  erp,pemout,"",0)
14160 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
14170 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09  f (objc>=6) {...
14180 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
14190 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
141a0 70 2c 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26  p, objv[5],....&
141b0 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
141c0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
141d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
141e0 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
141f0 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
14200 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
14210 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
14220 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
14230 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
14240 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
14250 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
14260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14270 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
14280 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
14290 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
142a0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
142b0 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
142c0 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
142d0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
142e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
142f0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
14300 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
14310 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
14320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
14330 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
14340 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
14350 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
14360 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14370 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
14380 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
14390 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
143a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
143b0 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
143c0 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
143d0 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
143e0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
143f0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14400 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14410 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
14420 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
14430 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14440 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14450 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
14460 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
14470 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14480 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14490 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
144a0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
144b0 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
144c0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
144d0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
144e0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
144f0 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
14500 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
14510 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
14520 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14530 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
14540 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
14550 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14560 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
14570 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14580 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
14590 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
145a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
145b0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
145c0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
145d0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
145e0 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
145f0 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
14600 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14610 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
14620 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
14630 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
14640 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14650 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
14660 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
14670 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
14680 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
14690 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
146a0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
146b0 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
146c0 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
146d0 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
146e0 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
146f0 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
14700 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
14710 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
14720 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
14730 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
14740 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
14750 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
14760 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
14770 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
14780 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
14790 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
147a0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
147b0 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
147c0 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
147d0 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
147e0 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
147f0 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
14800 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
14810 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
14820 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
14830 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
14840 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
14850 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
14860 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
14870 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
14880 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
14890 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
148a0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
148b0 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
148c0 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
148d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
148e0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
148f0 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
14900 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
14910 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
14920 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
14930 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
14940 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
14950 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
14960 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
14970 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
14980 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
14990 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
149a0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
149b0 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
149c0 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
149d0 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
149e0 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
149f0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
14a00 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
14a10 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
14a20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
14a30 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
14a40 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
14a50 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
14a60 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
14a70 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
14a80 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
14a90 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
14aa0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
14ab0 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
14ac0 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
14ad0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
14ae0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
14af0 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
14b00 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
14b10 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
14b20 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
14b30 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
14b40 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
14b50 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
14b60 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
14b70 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
14b80 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
14b90 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
14ba0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
14bb0 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
14bc0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
14bd0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
14be0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
14bf0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
14c00 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
14c10 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52     return(TCL_ER
14c20 52 4f 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  ROR);...}....X50
14c30 39 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65  9_set_version(ce
14c40 72 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e  rt,2);...ASN1_IN
14c50 54 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67  TEGER_set(X509_g
14c60 65 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28  et_serialNumber(
14c70 63 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09  cert),serial);..
14c80 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
14c90 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65  (X509_getm_notBe
14ca0 66 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09  fore(cert),0);..
14cb0 09 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a  .X509_gmtime_adj
14cc0 28 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66  (X509_getm_notAf
14cd0 74 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29  ter(cert),(long)
14ce0 36 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a  60*60*24*days);.
14cf0 09 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65  ..X509_set_pubke
14d00 79 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09  y(cert,pkey);...
14d10 09 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73  .name=X509_get_s
14d20 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
14d30 29 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  );....X509_NAME_
14d40 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
14d50 28 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52  (name,"C", MBSTR
14d60 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14d70 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14d80 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_C, -1, -1, 0)
14d90 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14da0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14db0 61 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49  ame,"ST", MBSTRI
14dc0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
14dd0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
14de0 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_ST, -1, -1, 0)
14df0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
14e00 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
14e10 61 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e  ame,"L", MBSTRIN
14e20 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14e30 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14e40 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _L, -1, -1, 0);.
14e50 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
14e60 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
14e70 65 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"O", MBSTRING_
14e80 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14e90 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f  gned char *) k_O
14ea0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14eb0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14ec0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14ed0 22 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "OU", MBSTRING_A
14ee0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14ef0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55  ned char *) k_OU
14f00 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14f10 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14f20 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14f30 22 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "CN", MBSTRING_A
14f40 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14f50 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e  ned char *) k_CN
14f60 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14f70 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14f80 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14f90 22 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e  "Email", MBSTRIN
14fa0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
14fb0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
14fc0 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20  _Email, -1, -1, 
14fd0 30 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f  0);....X509_set_
14fe0 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72  subject_name(cer
14ff0 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28  t,name);....if (
15000 21 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c  !X509_sign(cert,
15010 70 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28  pkey,EVP_sha256(
15020 29 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39  ))) {...    X509
15030 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20  _free(cert);... 
15040 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65     EVP_PKEY_free
15050 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
15060 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
15070 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
15080 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62  ...    BN_free(b
15090 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20  ne);.#endif...  
150a0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
150b0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69  interp,"Error si
150c0 67 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74  gning certificat
150d0 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  e",NULL);...    
150e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
150f0 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53  ;...}....if (isS
15100 74 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  tr) {...    out=
15110 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65  BIO_new(BIO_s_me
15120 6d 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f  m());...    PEM_
15130 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f  write_bio_X509(o
15140 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ut,cert);...    
15150 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62  i=BIO_read(out,b
15160 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66  uffer,sizeof(buf
15170 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69  fer)-1);...    i
15180 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a  =(i<0) ? 0 : i;.
15190 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d  ..    buffer[i]=
151a0 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f  '\0';...    Tcl_
151b0 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65  SetVar(interp,pe
151c0 6d 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a  mout,buffer,0);.
151d0 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28  ..    BIO_flush(
151e0 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  out);...    BIO_
151f0 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65  free(out);...} e
15200 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d  lse {...    out=
15210 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69  BIO_new(BIO_s_fi
15220 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f  le());...    BIO
15230 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28  _write_filename(
15240 6f 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20  out,pemout);... 
15250 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
15260 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
15270 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
15280 61 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09  all(out);...}...
15290 09 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29  .X509_free(cert)
152a0 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65  ;...EVP_PKEY_fre
152b0 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
152c0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
152d0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
152e0 4c 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  L...BN_free(bne)
152f0 3b 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a  ;.#endif..    }.
15300 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64  .}..break;.    d
15310 65 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a  efault:..break;.
15320 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
15330 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74   TCL_OK;..client
15340 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74  Data = clientDat
15350 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  a;.}.../********
15360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
15370 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20 20   Init           
15380 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
15390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
153a0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
153b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153e0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
153f0 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Free --. *. *.Th
15400 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
15410 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
15420 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
15430 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
15440 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
15450 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
15460 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20  s below 1. *. * 
15470 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65  Results:. *.none
15480 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
15490 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c  cts:. *.Frees al
154a0 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20  l the state. *. 
154b0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154f0 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c  ----. */.void.Tl
15500 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f  s_Free(char *blo
15510 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61  ckPtr) {.    Sta
15520 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
15530 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72  State *)blockPtr
15540 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
15550 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54  Called");..    T
15560 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74  ls_Clean(statePt
15570 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62  r);.    ckfree(b
15580 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  lockPtr);.}.../*
15590 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
155a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155d0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
155e0 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09  _Clean --. *. *.
155f0 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
15600 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
15610 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
15620 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
15630 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
15640 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
15650 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68  lls below 1.  Th
15660 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20  is should. *.be 
15670 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f  called synchrono
15680 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73  usly by the Clos
15690 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68  eProc, not in th
156a0 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46  e. *.EventuallyF
156b0 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a  ree callback.. *
156c0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
156d0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
156e0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
156f0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
15700 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
15750 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74  d Tls_Clean(Stat
15760 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20  e *statePtr) {. 
15770 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
15780 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  ed");..    /*.  
15790 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d     * we're assum
157a0 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65  ing here that we
157b0 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61  're single-threa
157c0 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ded.     */.    
157d0 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
157e0 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
157f0 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
15800 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
15810 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
15820 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
15830 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
15840 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
15850 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
15860 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74  os) {..ckfree(st
15870 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b  atePtr->protos);
15880 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
15890 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  os = NULL;.    }
158a0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
158b0 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68  r->bio) {../* Th
158c0 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c  is will call SSL
158d0 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31  _shutdown. Bug 1
158e0 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e  414045 */..dprin
158f0 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c  tf("BIO_free_all
15900 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
15910 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  >bio);..BIO_free
15920 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _all(statePtr->b
15930 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  io);..statePtr->
15940 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bio = NULL;.    
15950 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15960 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69  tr->ssl) {..dpri
15970 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70  ntf("SSL_free(%p
15980 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  )", statePtr->ss
15990 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74  l);..SSL_free(st
159a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73  atePtr->ssl);..s
159b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e  tatePtr->ssl = N
159c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
159d0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  f (statePtr->ctx
159e0 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  ) {..SSL_CTX_fre
159f0 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
15a00 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ;..statePtr->ctx
15a10 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
15a20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15a30 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63  >callback) {..Tc
15a40 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15a50 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
15a60 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  k);..statePtr->c
15a70 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a  allback = NULL;.
15a80 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15a90 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
15aa0 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
15ab0 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
15ac0 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74  password);..stat
15ad0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
15ae0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
15af0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
15b00 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  cmd) {..Tcl_Decr
15b10 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
15b20 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65  r->vcmd);..state
15b30 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c  Ptr->vcmd = NULL
15b40 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15b50 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22  intf("Returning"
15b60 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a  ---------------.
15bb0 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
15bc0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
15bd0 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
15be0 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
15bf0 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
15c00 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
15c10 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
15c20 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
15c30 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
15c40 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
15c50 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
15c60 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
15c70 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
15c80 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
15c90 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
15ca0 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
15cb0 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a  -----------. */.
15d00 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
15d10 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
15d20 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
15d30 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
15d40 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
15d50 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
15d60 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
15d70 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
15d80 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
15d90 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
15da0 49 4f 4e 20 3e 20 38 0a 23 69 66 64 65 66 20 55  ION > 8.#ifdef U
15db0 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
15dc0 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
15dd0 62 73 28 69 6e 74 65 72 70 2c 20 22 39 2e 30 22  bs(interp, "9.0"
15de0 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  , 0) == NULL) {.
15df0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
15e00 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
15e10 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52      if (Tcl_PkgR
15e20 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22  equire(interp, "
15e30 54 63 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29  Tcl", "9.0-", 0)
15e40 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
15e50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15e60 20 20 20 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65     }.#else.#ifde
15e70 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
15e80 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74      if (Tcl_Init
15e90 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
15ea0 2e 35 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29  .5", 0) == NULL)
15eb0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
15ec0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
15ed0 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50  if.    if (Tcl_P
15ee0 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70  kgRequire(interp
15ef0 2c 20 22 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c  , "Tcl", "8.5-",
15f00 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09   0) == NULL) {..
15f10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15f20 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
15f30 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e      if (TlsLibIn
15f40 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
15f50 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
15f60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
15f70 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
15f80 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
15f90 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
15fa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15fb0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
15fc0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15fd0 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74  p, "tls::connect
15fe0 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e  ion", Connection
15ff0 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  InfoObjCmd, (Cli
16000 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
16010 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
16020 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
16030 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
16040 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
16050 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
16060 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c  shakeObjCmd, (Cl
16070 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
16080 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
16090 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
160a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
160b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
160c0 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74  :import", Import
160d0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
160e0 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
160f0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
16100 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
16110 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
16120 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63  terp, "tls::misc
16130 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28  ", MiscObjCmd, (
16140 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28  ClientData) 0, (
16150 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
16160 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
16170 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
16180 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
16190 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e  s::unimport", Un
161a0 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  importObjCmd, (C
161b0 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
161c0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
161d0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
161e0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
161f0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
16200 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75  ::status", Statu
16210 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
16220 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
16230 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
16240 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 43  ULL);..    Tcl_C
16250 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
16260 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69  interp, "tls::ci
16270 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f  phers", CiphersO
16280 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
16290 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
162a0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
162b0 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
162c0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
162d0 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74 6f  erp, "tls::proto
162e0 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73  cols", Protocols
162f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
16300 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
16310 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
16320 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
16330 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
16340 74 65 72 70 2c 20 22 74 6c 73 3a 3a 76 65 72 73  terp, "tls::vers
16350 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a  ion", VersionObj
16360 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
16370 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
16380 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
16390 3b 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  ;..    Tcl_Creat
163a0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
163b0 72 70 2c 20 22 74 6c 73 3a 3a 68 61 73 68 22 2c  rp, "tls::hash",
163c0 20 48 61 73 68 43 6d 64 2c 20 28 43 6c 69 65 6e   HashCmd, (Clien
163d0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
163e0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
163f0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
16400 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
16410 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61  interp, "tls::ha
16420 73 68 65 73 22 2c 20 48 61 73 68 4c 69 73 74 43  shes", HashListC
16430 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
16440 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
16450 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
16460 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
16470 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
16480 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 48 61  , "tls::md4", Ha
16490 73 68 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 6e  shMD4Cmd, (Clien
164a0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
164b0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
164c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
164d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
164e0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64  interp, "tls::md
164f0 35 22 2c 20 48 61 73 68 4d 44 35 43 6d 64 2c 20  5", HashMD5Cmd, 
16500 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
16510 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
16520 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
16530 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
16540 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
16550 6c 73 3a 3a 73 68 61 31 22 2c 20 48 61 73 68 53  ls::sha1", HashS
16560 48 41 31 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  HA1Cmd, (ClientD
16570 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
16580 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
16590 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
165a0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
165b0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32  terp, "tls::sha2
165c0 35 36 22 2c 20 48 61 73 68 53 48 41 32 35 36 43  56", HashSHA256C
165d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
165e0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
165f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
16600 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
16610 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e  ) {..Tcl_Eval(in
16620 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
16630 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a  Script);.    }..
16640 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
16650 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
16660 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20  , PACKAGE_NAME, 
16670 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
16680 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
16690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166c0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65  *. *. *.Tls_Safe
166d0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
166e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
166f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
16710 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63   *.Standard proc
16720 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62  edure required b
16730 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69  y 'load'.. *.Ini
16740 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78  tializes this ex
16750 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61  tension for a sa
16760 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  fe interpreter..
16770 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
16780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
167a0 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
167b0 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20  effects:. *..As 
167c0 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
167d0 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
167e0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65  A standard Tcl e
167f0 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a  rror code.. *. *
16800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16830 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45  ------*. */.DLLE
16840 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
16850 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
16860 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
16870 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
16880 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54  ");.    return(T
16890 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29  ls_Init(interp))
168a0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
168b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
168e0 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e  *. *. *.TlsLibIn
168f0 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
16930 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .Initializes SSL
16940 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65   library once pe
16950 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a  r application. *
16960 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
16970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16990 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
169a0 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69  fects:. *..initi
169b0 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
169c0 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  ry. *. *.Result:
169d0 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  . *..none. *. *-
169e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a10 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69  -----*. */.stati
16a20 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74  c int TlsLibInit
16a30 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a  (int uninitializ
16a40 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  e) {.    static 
16a50 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
16a60 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  = 0;.    int sta
16a70 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69  tus = TCL_OK;.#i
16a80 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
16a90 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
16aa0 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
16ab0 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75  S).    size_t nu
16ac0 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  m_locks;.#endif.
16ad0 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69  .    if (uniniti
16ae0 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69  alize) {..if (!i
16af0 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20  nitialized) {.. 
16b00 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65     dprintf("Aske
16b10 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a  d to uninitializ
16b20 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f  e, but we are no
16b30 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b  t initialized");
16b40 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
16b50 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69  L_OK);..}...dpri
16b60 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
16b70 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23  initialize");..#
16b80 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
16b90 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
16ba0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
16bb0 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  DS)..Tcl_MutexLo
16bc0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09  ck(&init_mx);...
16bd0 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20  if (locks) {..  
16be0 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09    free(locks);..
16bf0 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c      locks = NULL
16c00 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  ;..    locksCoun
16c10 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66  t = 0;..}.#endif
16c20 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ..initialized = 
16c30 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
16c40 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
16c50 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
16c60 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
16c70 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
16c80 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
16c90 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20  turn(TCL_OK);.  
16ca0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69    }..    if (ini
16cb0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72  tialized) {..dpr
16cc0 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75  intf("Called, bu
16cd0 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76  t using cached v
16ce0 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28  alue");..return(
16cf0 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a  status);.    }..
16d00 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
16d10 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
16d20 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
16d30 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
16d40 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
16d50 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
16d60 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
16d70 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
16d80 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
16d90 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
16da0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
16db0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
16dc0 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
16dd0 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
16de0 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
16df0 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
16e00 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
16e10 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
16e20 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
16e30 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
16e40 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
16e50 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
16e60 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
16e70 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
16e80 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
16e90 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
16ea0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
16eb0 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
16ec0 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
16ed0 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
16ee0 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
16ef0 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
16f00 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
16f10 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
16f20 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
16f30 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
16f40 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a  );..#if 0.    /*
16f50 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f  .     * XXX:TODO
16f60 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f  : Remove this co
16f70 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  de and replace i
16f80 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20  t with a check. 
16f90 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68      * for enough
16fa0 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20   entropy and do 
16fb0 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74  not try to creat
16fc0 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a  e our own.     *
16fd0 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70   terrible entrop
16fe0 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a  y.     */.    /*
16ff0 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65  .     * Seed the
17000 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
17010 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  enerator in the 
17020 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20  SSL library,.   
17030 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f    * using the do
17040 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74  /while construct
17050 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
17060 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a  bug note in the.
17070 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46       * OpenSSL F
17080 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77  AQ at http://www
17090 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70  .openssl.org/sup
170a0 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53  port/faq.html#US
170b0 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ER1.     *.     
170c0 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68  * The crux of th
170d0 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61  e problem is tha
170e0 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73  t Solaris 7 does
170f0 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20   not have a.    
17100 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f   * /dev/random o
17110 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64  r /dev/urandom d
17120 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e  evice so it cann
17130 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68  ot gather enough
17140 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20  .     * entropy 
17150 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65  from the RAND_se
17160 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e  ed() when TLS in
17170 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65  itializes and re
17180 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20  fuses.     * to 
17190 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c  go further. Earl
171a0 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
171b0 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20  OpenSSL carried 
171c0 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  on regardless.. 
171d0 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64      */.    srand
171e0 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
171f0 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20  time((time_t *) 
17200 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b  NULL));.    do {
17210 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
17220 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  < 16; i++) {..  
17230 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20    rnd_seed[i] = 
17240 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e  1 + (char) (255.
17250 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44  0 * rand()/(RAND
17260 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09  _MAX+1.0));..}..
17270 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65  RAND_seed(rnd_se
17280 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73  ed, sizeof(rnd_s
17290 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69  eed));.    } whi
172a0 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28  le (RAND_status(
172b0 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ) != 1);.#endif.
172c0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
172d0 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
172e0 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
172f0 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
17300 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
17310 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
17320 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a           n(status);.}.