Hex Artifact Content

Artifact 860bf39ae0f81643dbe75ff4d1af7fc7f6680d64f2afa988b502bf00d1ce3b5e:


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 4c 69 73 74 20 43 6f 6d   * Hash List Com
6b50: 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65  mand --. *. *.Re
6b60: 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 61  turn a list of a
6b70: 6c 6c 20 76 61 6c 69 64 20 68 61 73 68 20 61 6c  ll valid hash al
6b80: 67 6f 72 69 74 68 6d 73 20 6f 72 20 6d 65 73 73  gorithms or mess
6b90: 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a  age digests.. *.
6ba0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
6bb0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
6bc0: 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a  sult list.. *. *
6bd0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6be0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 0a 20 2a 2f 0a 76 6f 69 64 20 4c 69 73 74 43 61  . */.void ListCa
6c40: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 4f 42 4a  llback(const OBJ
6c50: 5f 4e 41 4d 45 20 2a 6f 62 6a 2c 20 76 6f 69 64  _NAME *obj, void
6c60: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 54 63 6c   *arg) {.    Tcl
6c70: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 28  _Obj *objPtr = (
6c80: 54 63 6c 5f 4f 62 6a 20 2a 29 20 61 72 67 3b 0a  Tcl_Obj *) arg;.
6c90: 20 20 20 20 69 66 20 28 31 20 7c 7c 20 21 6f 62      if (1 || !ob
6ca0: 6a 2d 3e 61 6c 69 61 73 29 20 7b 0a 09 2f 2a 20  j->alias) {../* 
6cb0: 46 69 6c 74 65 72 20 6f 75 74 20 73 69 67 6e 65  Filter out signe
6cc0: 64 20 64 69 67 65 73 74 73 20 28 61 2e 6b 2e 61  d digests (a.k.a
6cd0: 20 73 69 67 6e 61 74 75 72 65 20 61 6c 67 6f 72   signature algor
6ce0: 69 74 68 6d 73 29 20 2a 2f 0a 09 69 66 20 28 73  ithms) */..if (s
6cf0: 74 72 73 74 72 28 6f 62 6a 2d 3e 6e 61 6d 65 2c  trstr(obj->name,
6d00: 20 22 72 73 61 22 29 20 3d 3d 20 4e 55 4c 4c 20   "rsa") == NULL 
6d10: 26 26 20 73 74 72 73 74 72 28 6f 62 6a 2d 3e 6e  && strstr(obj->n
6d20: 61 6d 65 2c 20 22 52 53 41 22 29 20 3d 3d 20 4e  ame, "RSA") == N
6d30: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
6d40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6d50: 6d 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74  ment(NULL, objPt
6d60: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
6d70: 4f 62 6a 28 6f 62 6a 2d 3e 6e 61 6d 65 2c 2d 31  Obj(obj->name,-1
6d80: 29 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a  ));..}.    }.}..
6d90: 69 6e 74 0a 44 69 67 65 73 74 4c 69 73 74 43 6d  int.DigestListCm
6da0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
6db0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
6dc0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
6dd0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
6de0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
6df0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
6e00: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
6e10: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a  tObj(0, NULL);..
6e20: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
6e30: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
6e40: 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65  0100000L.    Ope
6e50: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 64 69 67  nSSL_add_all_dig
6e60: 65 73 74 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20  ests(); /* Make 
6e70: 73 75 72 65 20 74 68 65 79 27 72 65 20 6c 6f 61  sure they're loa
6e80: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20  ded */.#endif.. 
6e90: 20 20 20 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61     OBJ_NAME_do_a
6ea0: 6c 6c 28 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45  ll(OBJ_NAME_TYPE
6eb0: 5f 4d 44 5f 4d 45 54 48 2c 20 4c 69 73 74 43 61  _MD_METH, ListCa
6ec0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
6ed0: 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 54 63   objPtr);.    Tc
6ee0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
6ef0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
6f00: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
6f10: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a 20 20  rp, objPtr);..  
6f20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
6f30: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
6f40: 6c 69 65 6e 74 44 61 74 61 3b 0a 09 6f 62 6a 63  lientData;..objc
6f50: 20 3d 20 6f 62 6a 63 3b 0a 09 6f 62 6a 76 20 3d   = objc;..objv =
6f60: 20 6f 62 6a 76 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a   objv;.}.../*. *
6f70: 20 56 61 6c 69 64 20 53 53 4c 20 61 6e 64 20 54   Valid SSL and T
6f80: 4c 53 20 50 72 6f 74 6f 63 6f 6c 20 56 65 72 73  LS Protocol Vers
6f90: 69 6f 6e 73 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ions. */.static 
6fa0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74  const char *prot
6fb0: 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73  ocols[] = {.."ss
6fc0: 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c  l2", "ssl3", "tl
6fd0: 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22  s1", "tls1.1", "
6fe0: 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33  tls1.2", "tls1.3
6ff0: 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20  ", NULL.};.enum 
7000: 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54  protocol {.    T
7010: 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c  LS_SSL2, TLS_SSL
7020: 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53  3, TLS_TLS1, TLS
7030: 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53  _TLS1_1, TLS_TLS
7040: 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c  1_2, TLS_TLS1_3,
7050: 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 2f 2a   TLS_NONE.};../*
7060: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
70a0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70  ------. *. * Cip
70b0: 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  hersObjCmd -- li
70c0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  st available cip
70d0: 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20  hers. *. *.This 
70e0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
70f0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
7100: 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72  the "tls::cipher
7110: 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f  s" command. *.to
7120: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
7130: 63 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75  ciphers, based u
7140: 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  pon protocol sel
7150: 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73  ected.. *. * Res
7160: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
7170: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c  ard Tcl result l
7180: 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ist.. *. * Side 
7190: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
71a0: 74 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72  tructs and destr
71b0: 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  oys SSL context 
71c0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7210: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43  */..static int.C
7220: 69 70 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69  iphersObjCmd(Cli
7230: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
7240: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
7250: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
7260: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
7270: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
7280: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d  cl_Obj *objPtr =
7290: 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43   NULL;.    SSL_C
72a0: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
72b0: 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e      SSL *ssl = N
72c0: 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f  ULL;.    STACK_O
72d0: 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73  F(SSL_CIPHER) *s
72e0: 6b 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c  k;.    char *cp,
72f0: 20 62 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20   buf[BUFSIZ];.  
7300: 20 20 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72    int index, ver
7310: 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75  bose = 0, use_su
7320: 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  pported = 0;.   
7330: 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f   const SSL_METHO
7340: 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20  D *method;..    
7350: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
7360: 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f 62 6a  );..    if ((obj
7370: 63 20 3c 20 31 29 20 7c 7c 20 28 6f 62 6a 63 20  c < 1) || (objc 
7380: 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  > 4)) {..Tcl_Wro
7390: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
73a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 70 72 6f  , 1, objv, "?pro
73b0: 74 6f 63 6f 6c 3f 20 3f 76 65 72 62 6f 73 65 3f  tocol? ?verbose?
73c0: 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a   ?supported?");.
73d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
73e0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
73f0: 28 6f 62 6a 63 20 3d 3d 20 31 29 20 7b 0a 09 2f  (objc == 1) {../
7400: 2a 20 4c 69 73 74 20 61 6c 6c 20 63 69 70 68 65  * List all ciphe
7410: 72 73 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a  rs */..Tcl_Obj *
7420: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7430: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7440: 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  ;..#if OPENSSL_V
7450: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
7460: 30 78 31 30 31 30 30 30 30 30 4c 0a 09 4f 70 65  0x10100000L..Ope
7470: 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 63 69 70  nSSL_add_all_cip
7480: 68 65 72 73 28 29 3b 20 2f 2a 20 4d 61 6b 65 20  hers(); /* Make 
7490: 73 75 72 65 20 74 68 65 79 27 72 65 20 6c 6f 61  sure they're loa
74a0: 64 65 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 09  ded */.#endif...
74b0: 4f 42 4a 5f 4e 41 4d 45 5f 64 6f 5f 61 6c 6c 28  OBJ_NAME_do_all(
74c0: 4f 42 4a 5f 4e 41 4d 45 5f 54 59 50 45 5f 43 49  OBJ_NAME_TYPE_CI
74d0: 50 48 45 52 5f 4d 45 54 48 2c 20 4c 69 73 74 43  PHER_METH, ListC
74e0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
74f0: 29 20 6f 62 6a 50 74 72 29 3b 0a 09 54 63 6c 5f  ) objPtr);..Tcl_
7500: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
7510: 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a  rp);..Tcl_SetObj
7520: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
7530: 62 6a 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  bjPtr);..return 
7540: 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 7d 20 65  TCL_OK;..    } e
7550: 6c 73 65 20 69 66 20 28 54 63 6c 5f 47 65 74 49  lse if (Tcl_GetI
7560: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
7570: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f  rp, objv[1], pro
7580: 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f  tocols, "protoco
7590: 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21  l", 0, &index) !
75a0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
75b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
75c0: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62     }.    if ((ob
75d0: 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47  jc > 2) && Tcl_G
75e0: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
75f0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
7600: 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54  , &verbose) != T
7610: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e  CL_OK) {..return
7620: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7630: 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20  }.    if ((objc 
7640: 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42  > 3) && Tcl_GetB
7650: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
7660: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
7670: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21  use_supported) !
7680: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
7690: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
76a0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
76b0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
76c0: 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
76d0: 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20  protocol)index) 
76e0: 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32  {..case TLS_SSL2
76f0: 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  :.#if OPENSSL_VE
7700: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
7710: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
7720: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
7730: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7740: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20  SL_NO_SSL2)..   
7750: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7760: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7770: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7780: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7790: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
77a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
77b0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
77c0: 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 32 5f   method = SSLv2_
77d0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
77e0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
77f0: 53 5f 53 53 4c 33 3a 0a 23 69 66 20 64 65 66 69  S_SSL3:.#if defi
7800: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20  ned(NO_SSL3) || 
7810: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7820: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
7830: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
7840: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  SL3_METHOD)..   
7850: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7860: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7870: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7880: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7890: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
78a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
78b0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
78c0: 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f   method = SSLv3_
78d0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
78e0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
78f0: 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69  S_TLS1:.#if defi
7900: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
7910: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7920: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
7930: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7940: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20  LS1_METHOD)..   
7950: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7960: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7970: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7980: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7990: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
79a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
79b0: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
79c0: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f   method = TLSv1_
79d0: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
79e0: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
79f0: 53 5f 54 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65  S_TLS1_1:.#if de
7a00: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
7a10: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7a20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  SSL_NO_TLS1_1) |
7a30: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7a40: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
7a50: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
7a60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7a70: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
7a80: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
7a90: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7aa0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
7ab0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7ac0: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7ad0: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  = TLSv1_1_method
7ae0: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7af0: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7b00: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
7b10: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7b20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7b30: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
7b40: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7b50: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
7b60: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
7b70: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
7b80: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
7b90: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7ba0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
7bb0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
7bc0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20  _ERROR;.#else.. 
7bd0: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76     method = TLSv
7be0: 31 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  1_2_method(); br
7bf0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
7c00: 65 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69  e TLS_TLS1_3:.#i
7c10: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
7c20: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
7c30: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7c40: 33 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  3)..    Tcl_Appe
7c50: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7c60: 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78   protocols[index
7c70: 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e  ], ": protocol n
7c80: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
7c90: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7ca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7cb0: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7cc0: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7cd0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
7ce0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
7cf0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
7d00: 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53 53 4c  RSION);..    SSL
7d10: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
7d20: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
7d30: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
7d40: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23 65 6e  ..    break;.#en
7d50: 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a 09 20  dif..default:.. 
7d60: 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f     method = TLS_
7d70: 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 62  method();..    b
7d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
7d90: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
7da0: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20  ew(method);.    
7db0: 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c 4c 29  if (ctx == NULL)
7dc0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7dd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 52 45 41  sult(interp, REA
7de0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72  SON(), NULL);..r
7df0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7e00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c 20  .    }..    ssl 
7e10: 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b 0a  = SSL_new(ctx);.
7e20: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
7e30: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
7e40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
7e50: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29   REASON(), NULL)
7e60: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
7e70: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ctx);..return TC
7e80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
7e90: 20 20 20 20 2f 2a 20 55 73 65 20 6c 69 73 74 20      /* Use list 
7ea0: 61 6e 64 20 6f 72 64 65 72 20 61 73 20 77 6f 75  and order as wou
7eb0: 6c 64 20 62 65 20 73 65 6e 74 20 69 6e 20 61 20  ld be sent in a 
7ec0: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 6f 72 20 61  ClientHello or a
7ed0: 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70  ll available cip
7ee0: 68 65 72 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  hers */.    if (
7ef0: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
7f00: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 31 5f  ..sk = SSL_get1_
7f10: 73 75 70 70 6f 72 74 65 64 5f 63 69 70 68 65 72  supported_cipher
7f20: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  s(ssl);.    } el
7f30: 73 65 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  se {..sk = SSL_g
7f40: 65 74 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b  et_ciphers(ssl);
7f50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
7f60: 73 6b 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  sk != NULL) {..i
7f70: 66 20 28 21 76 65 72 62 6f 73 65 29 20 7b 0a 09  f (!verbose) {..
7f80: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
7f90: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
7fa0: 55 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28  ULL);..    for (
7fb0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
7fc0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
7fd0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63  (sk); i++) {...c
7fe0: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20  onst SSL_CIPHER 
7ff0: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48  *c = sk_SSL_CIPH
8000: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b  ER_value(sk, i);
8010: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c  ...if (c == NULL
8020: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f  ) continue;..../
8030: 2a 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72  * cipher name or
8040: 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20   (NONE) */...cp 
8050: 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  = SSL_CIPHER_get
8060: 5f 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28  _name(c);...if (
8070: 63 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61  cp == NULL) brea
8080: 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  k;...Tcl_ListObj
8090: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
80a0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63  terp, objPtr, Tc
80b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 63  l_NewStringObj(c
80c0: 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  p, -1));..    }.
80d0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
80e0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
80f0: 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30 29 3b  StringObj("",0);
8100: 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69  ..    for (int i
8110: 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c   = 0; i < sk_SSL
8120: 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b  _CIPHER_num(sk);
8130: 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20   i++) {...const 
8140: 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20  SSL_CIPHER *c = 
8150: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61  sk_SSL_CIPHER_va
8160: 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66  lue(sk, i);...if
8170: 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e   (c == NULL) con
8180: 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74 65 78  tinue;..../* tex
8190: 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
81a0: 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
81b0: 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49 50 48  /...if (SSL_CIPH
81c0: 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
81d0: 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
81e0: 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
81f0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54  .    Tcl_AppendT
8200: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62 75 66  oObj(objPtr, buf
8210: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 74 72  , (Tcl_Size) str
8220: 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d 20 65  len(buf));...} e
8230: 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f  lse {...    Tcl_
8240: 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50  AppendToObj(objP
8250: 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c  tr, "UNKNOWN\n",
8260: 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a   8);...}..    }.
8270: 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75 70 70  .}..if (use_supp
8280: 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20 73 6b  orted) {..    sk
8290: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72 65 65  _SSL_CIPHER_free
82a0: 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20  (sk);..}.    }. 
82b0: 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73 6c 29     SSL_free(ssl)
82c0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ;.    SSL_CTX_fr
82d0: 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20 54 63  ee(ctx);..    Tc
82e0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
82f0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
8300: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
8310: 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
8320: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
8330: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c  .clientData = cl
8340: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a  ientData;.}.../*
8350: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8390: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f  ------. *. * Pro
83a0: 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20  tocolsObjCmd -- 
83b0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70  list available p
83c0: 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54  rotocols. *. *.T
83d0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
83e0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63   invoked to proc
83f0: 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72  ess the "tls::pr
8400: 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64  otocols" command
8410: 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69  . *.to list avai
8420: 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e  lable protocols.
8430: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
8440: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
8450: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
8460: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8470: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
84c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
84d0: 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43  nt.ProtocolsObjC
84e0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
84f0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
8500: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
8510: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
8520: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
8530: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
8540: 6a 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  jPtr;..    dprin
8550: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
8560: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 31     if (objc != 1
8570: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
8580: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
8590: 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72 65 74   objv, "");..ret
85a0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
85b0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
85c0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
85d0: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
85e0: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
85f0: 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c  L);..#if OPENSSL
8600: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
8610: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
8620: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
8630: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
8640: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
8650: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8660: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8670: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8680: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8690: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32  otocols[TLS_SSL2
86a0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
86b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
86c0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
86d0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
86e0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
86f0: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
8700: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
8710: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8720: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8730: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8740: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8750: 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a  LS_SSL3], -1));.
8760: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
8770: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
8780: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8790: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
87a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
87b0: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
87c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
87d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
87e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
87f0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
8800: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c  ocols[TLS_TLS1],
8810: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8820: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8830: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
8840: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8850: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
8860: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8870: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  _1_METHOD).    T
8880: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8890: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
88a0: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
88b0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
88c0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20  ls[TLS_TLS1_1], 
88d0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  -1));.#endif.#if
88e0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
88f0: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
8900: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8910: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
8920: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8930: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  2_METHOD).    Tc
8940: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8950: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8960: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8970: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8980: 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d  s[TLS_TLS1_2], -
8990: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
89a0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
89b0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
89c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
89d0: 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  3).    Tcl_ListO
89e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
89f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8a00: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8a10: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8a20: 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_3], -1));.#e
8a30: 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ndif..    Tcl_Se
8a40: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
8a50: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
8a60: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
8a70: 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
8a80: 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
8a90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ad0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73  -----. *. * Vers
8ae0: 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  ionObjCmd -- ret
8af0: 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69  urn version stri
8b00: 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  ng from OpenSSL.
8b10: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
8b20: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
8b30: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
8b40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
8b50: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
8b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8ba0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56   */.static int.V
8bb0: 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69  ersionObjCmd(Cli
8bc0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
8bd0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
8be0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
8bf0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8c00: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
8c10: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
8c20: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
8c30: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a  lled");..    obj
8c40: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  Ptr = Tcl_NewStr
8c50: 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56  ingObj(OPENSSL_V
8c60: 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29  ERSION_TEXT, -1)
8c70: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
8c80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
8c90: 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74  bjPtr);..    ret
8ca0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
8cb0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
8cc0: 44 61 74 61 3b 0a 09 6f 62 6a 63 20 3d 20 6f 62  Data;..objc = ob
8cd0: 6a 63 3b 0a 09 6f 62 6a 76 20 3d 20 6f 62 6a 76  jc;..objv = objv
8ce0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
8cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8d30: 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62  *. * HandshakeOb
8d40: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
8d50: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
8d60: 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65  ed to verify whe
8d70: 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  ther the handsha
8d80: 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20  ke is complete. 
8d90: 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20  *.or not.. *. * 
8da0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8db0: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8dc0: 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73  t. 1 means hands
8dd0: 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30  hake complete, 0
8de0: 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a   means pending..
8df0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8e00: 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65  ts:. *.May force
8e10: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
8e20: 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a   to take place..
8e30: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
8e80: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b  tic int Handshak
8e90: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  eObjCmd(ClientDa
8ea0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
8eb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8ec0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
8ed0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
8ee0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
8ef0: 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20  annel chan;     
8f00: 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65     /* The channe
8f10: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
8f20: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
8f30: 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20   *statePtr;     
8f40: 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61     /* client sta
8f50: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
8f60: 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63  t */.    const c
8f70: 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55  har *errStr = NU
8f80: 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20  LL;.    int ret 
8f90: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  = 1;.    int err
8fa0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
8fb0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
8fc0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
8fd0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
8fe0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
8ff0: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
9000: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
9010: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
9020: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
9030: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
9040: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
9050: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
9060: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9070: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e 55 4c  v[1], NULL), NUL
9080: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
9090: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
90a0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
90b0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
90c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
90d0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
90e0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
90f0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
9100: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
9110: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
9120: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
9130: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
9140: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
9150: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
9160: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9170: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
9180: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
9190: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
91a0: 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
91b0: 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c  S channel", NULL
91c0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
91d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
91e0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
91f0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
9200: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
9210: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54  NULL);..return(T
9220: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
9230: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
9240: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
9250: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
9260: 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
9270: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67  dprintf("Calling
9280: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
9290: 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d  ect");.    ret =
92a0: 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e   Tls_WaitForConn
92b0: 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65  ect(statePtr, &e
92c0: 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69  rr, 1);.    dpri
92d0: 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72  ntf("Tls_WaitFor
92e0: 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64  Connect returned
92f0: 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20  : %i", ret);..  
9300: 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26    if (ret < 0 &&
9310: 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61   ((statePtr->fla
9320: 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59  gs & TLS_TCL_ASY
9330: 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45  NC) && (err == E
9340: 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69  AGAIN))) {..dpri
9350: 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61  ntf("Async set a
9360: 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22  nd err = EAGAIN"
9370: 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20  );..ret = 0;.   
9380: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20   } else if (ret 
9390: 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73  < 0) {..long res
93a0: 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73  ult;..errStr = s
93b0: 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54  tatePtr->err;..T
93c0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
93d0: 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74  nterp);..Tcl_Set
93e0: 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66  Errno(err);...if
93f0: 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65   (!errStr || (*e
9400: 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09  rrStr == 0)) {..
9410: 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c      errStr = Tcl
9420: 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65  _PosixError(inte
9430: 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70  rp);..}...Tcl_Ap
9440: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9450: 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61  p, "handshake fa
9460: 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c  iled: ", errStr,
9470: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9480: 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20  ..if ((result = 
9490: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
94a0: 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
94b0: 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f  ssl)) != X509_V_
94c0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  OK) {..    Tcl_A
94d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
94e0: 72 70 2c 20 22 20 64 75 65 20 74 6f 3a 20 22 2c  rp, " due to: ",
94f0: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
9500: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
9510: 65 73 75 6c 74 29 2c 20 28 63 68 61 72 20 2a 29  esult), (char *)
9520: 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f   NULL);..}..Tcl_
9530: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
9540: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e  erp, "TLS", "HAN
9550: 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45 44  DSHAKE", "FAILED
9560: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9570: 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65 74  );..dprintf("Ret
9580: 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f 52  urning TCL_ERROR
9590: 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 20   with handshake 
95a0: 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72 72  failed: %s", err
95b0: 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  Str);..return(TC
95c0: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 20  L_ERROR);.    } 
95d0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20  else {..if (err 
95e0: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72  != 0) {..    dpr
95f0: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72  intf("Got an err
9600: 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65  or with a comple
9610: 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65  ted handshake: e
9620: 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a  rr = %i", err);.
9630: 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20  .}..ret = 1;.   
9640: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
9650: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f  "Returning TCL_O
9660: 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69  K with data \"%i
9670: 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54  \"", ret);.    T
9680: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
9690: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
96a0: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20  ntObj(ret));.   
96b0: 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b   return(TCL_OK);
96c0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
96d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a  lientData;.}../*
96e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
96f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9720: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70  ------. *. * Imp
9730: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
9740: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
9750: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
9760: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c  process the "ssl
9770: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09  " command. *. *.
9780: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20  The ssl command 
9790: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20  pushes SSL over 
97a0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74  a (newly connect
97b0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20  ed) tcp socket. 
97c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
97d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
97e0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
97f0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
9800: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
9810: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
9820: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
9830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9870: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
9880: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  .ImportObjCmd(Cl
9890: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
98a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
98b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
98c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
98d0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
98e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
98f0: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
9900: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
9910: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
9920: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
9930: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
9940: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
9950: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09     SSL_CTX *ctx.
9960: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9970: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 63 72      Tcl_Obj *scr
9980: 69 70 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ipt.        = NU
9990: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
99a0: 2a 70 61 73 73 77 6f 72 64 09 20 20 20 20 20 20  *password.      
99b0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63    = NULL;.    Tc
99c0: 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 20 20 20 20  l_Obj *vcmd.    
99d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
99e0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65  Tcl_DString uppe
99f0: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
9a00: 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ion, upperChanne
9a10: 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72  lBlocking, upper
9a20: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c  ChannelEncoding,
9a30: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46   upperChannelEOF
9a40: 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64  Char;.    int id
9a50: 78 2c 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20  x, len;.    int 
9a60: 66 6c 61 67 73 09 09 20 20 20 20 20 20 20 20 3d  flags..        =
9a70: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20   TLS_TCL_INIT;. 
9a80: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 20     int server.. 
9a90: 20 20 20 20 20 20 20 3d 20 30 3b 09 2f 2a 20 69         = 0;./* i
9aa0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63  s connection inc
9ab0: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e  oming or outgoin
9ac0: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  g? */.    char *
9ad0: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
9ae0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9af0: 20 2a 63 65 72 74 66 69 6c 65 09 20 20 20 20 20   *certfile.     
9b00: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75     = NULL;.    u
9b10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
9b20: 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  y  .= NULL;.    
9b30: 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20  int key_len     
9b40: 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b              = 0;
9b50: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
9b60: 61 72 20 2a 63 65 72 74 20 20 20 20 20 20 20 20  ar *cert        
9b70: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
9b80: 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20   cert_len       
9b90: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20           = 0;.  
9ba0: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09    char *ciphers.
9bb0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9bc0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
9bd0: 73 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d  suites.        =
9be0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
9bf0: 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20  *CAfile.        
9c00: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9c10: 20 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20   *CAdir..       
9c20: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
9c30: 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20  r *DHparams.    
9c40: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9c50: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20  char *model..   
9c60: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9c70: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
9c80: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
9c90: 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f  ;./* hostname fo
9ca0: 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e  r Server Name In
9cb0: 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  dication */.    
9cc0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
9cd0: 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20  har *session_id 
9ce0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9cf0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c  Obj *alpn..= NUL
9d00: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20  L;.    int ssl2 
9d10: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20  = 0, ssl3 = 0;. 
9d20: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c     int tls1 = 1,
9d30: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73   tls1_1 = 1, tls
9d40: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20  1_2 = 1, tls1_3 
9d50: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f  = 1;.    int pro
9d60: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20  to = 0, level = 
9d70: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69  -1;.    int veri
9d80: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20  fy = 0, require 
9d90: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31  = 0, request = 1
9da0: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
9db0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
9dc0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23  tf("Called");..#
9dd0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9de0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
9df0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
9e00: 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65      tls1 = 0;.#e
9e10: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
9e20: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  (NO_TLS1_1) || d
9e30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
9e40: 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c  O_TLS1_1).    tl
9e50: 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_1 = 0;.#endif
9e60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
9e70: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
9e80: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
9e90: 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32  S1_2).    tls1_2
9ea0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
9eb0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9ec0: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
9ed0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
9ee0: 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30  ).    tls1_3 = 0
9ef0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
9f00: 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54   (objc < 2) {..T
9f10: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
9f20: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
9f30: 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f   "channel ?optio
9f40: 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  ns?");..return T
9f50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9f60: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
9f70: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61  rror();..    cha
9f80: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
9f90: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
9fa0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
9fb0: 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20  objv[1], NULL), 
9fc0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
9fd0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
9fe0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
9ff0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
a010: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
a020: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
a030: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
a040: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
a050: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
a060: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  ..    for (idx =
a070: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   2; idx < objc; 
a080: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a  idx++) {..char *
a090: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
a0a0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
a0b0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69  idx], NULL);...i
a0c0: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27  f (opt[0] != '-'
a0d0: 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09  )..    break;...
a0e0: 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20  OPTOBJ("-alpn", 
a0f0: 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22  alpn);..OPTSTR("
a100: 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b  -cadir", CAdir);
a110: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c  ..OPTSTR("-cafil
a120: 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50  e", CAfile);..OP
a130: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63  TBYTE("-cert", c
a140: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a  ert, cert_len);.
a150: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69  .OPTSTR("-certfi
a160: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a  le", certfile);.
a170: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
a180: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
a190: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c  TSTR("-ciphers",
a1a0: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
a1b0: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65  TR("-ciphersuite
a1c0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  s", ciphersuites
a1d0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d  );..OPTOBJ("-com
a1e0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
a1f0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61  .OPTSTR("-dhpara
a200: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a  ms", DHparams);.
a210: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c  .OPTBYTE("-key",
a220: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a   key, key_len);.
a230: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c  .OPTSTR("-keyfil
a240: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f  e", keyfile);..O
a250: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20  PTSTR("-model", 
a260: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
a270: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
a280: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
a290: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ("-post_handshak
a2a0: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61  e", post_handsha
a2b0: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  ke);..OPTBOOL("-
a2c0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73  request", reques
a2d0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  t);..OPTBOOL("-r
a2e0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65  equire", require
a2f0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63  );..OPTINT("-sec
a300: 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 6c 65 76  uritylevel", lev
a310: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  el);..OPTBOOL("-
a320: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29  server", server)
a330: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76  ;..OPTSTR("-serv
a340: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e  ername", servern
a350: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ame);..OPTSTR("-
a360: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
a370: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f  sion_id);..OPTBO
a380: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32  OL("-ssl2", ssl2
a390: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
a3a0: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54  l3", ssl3);..OPT
a3b0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c  BOOL("-tls1", tl
a3c0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  s1);..OPTBOOL("-
a3d0: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29  tls1.1", tls1_1)
a3e0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
a3f0: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
a400: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33  OPTBOOL("-tls1.3
a410: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54  ", tls1_3);..OPT
a420: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f  OBJ("-validateco
a430: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09  mmand", vcmd);..
a440: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20  OPTOBJ("-vcmd", 
a450: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28  vcmd);...OPTBAD(
a460: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e  "option", "-alpn
a470: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c  , -cadir, -cafil
a480: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66  e, -cert, -certf
a490: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
a4a0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f  iphersuites, -co
a4b0: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73  mmand, -dhparams
a4c0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65  , -key, -keyfile
a4d0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
a4e0: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73  ord, -post_hands
a4f0: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20  hake, -request, 
a500: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72  -require, -secur
a510: 69 74 79 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65  itylevel, -serve
a520: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
a530: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73  -session_id, -ss
a540: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31  l2, -ssl3, -tls1
a550: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31  , -tls1.1, -tls1
a560: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20  .2, -tls1.3, or 
a570: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
a580: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
a590: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
a5a0: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09    if (request)..
a5b0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
a5c0: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
a5d0: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45   | SSL_VERIFY_PE
a5e0: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  ER;.    if (requ
a5f0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09  est && require).
a600: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
a610: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
a620: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69  PEER_CERT;.    i
a630: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
a640: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65  st_handshake).ve
a650: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
a660: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
a670: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66  E;.    if (verif
a680: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20  y == 0)..verify 
a690: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
a6a0: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
a6b0: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
a6c0: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
a6d0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
a6e0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
a6f0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
a700: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
a710: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
a720: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
a730: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
a740: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
a750: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a760: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
a770: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
a780: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a790: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
a7a0: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
a7b0: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
a7c0: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
a7d0: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
a7e0: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
a7f0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
a800: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
a810: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
a820: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
a830: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
a840: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a850: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
a860: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
a870: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
a880: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
a890: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
a8a0: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
a8b0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a8c0: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
a8d0: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
a8e0: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
a8f0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a900: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
a910: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
a920: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
a930: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
a940: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
a950: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
a960: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a970: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26      if (CAdir &&
a980: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20   !*CAdir).      
a990: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20    CAdir.        
a9a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a9b0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
a9c0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
a9d0: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
a9e0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
a9f0: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
aa00: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
aa10: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
aa20: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
aa30: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
aa40: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
aa50: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
aa60: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
aa70: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
aa80: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
aa90: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
aaa0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
aab0: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79  >vflags.= verify
aac0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
aad0: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f  err.= "";..    /
aae0: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70  * allocate scrip
aaf0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72  t */.    if (scr
ab00: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ipt) {..(void) T
ab10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
ab20: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e  Obj(script, &len
ab30: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
ab40: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61      statePtr->ca
ab50: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b  llback = script;
ab60: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
ab70: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
ab80: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20  >callback);..}. 
ab90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
aba0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a  ocate password *
abb0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f  /.    if (passwo
abc0: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  rd) {..(void) Tc
abd0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
abe0: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65  bj(password, &le
abf0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
ac00: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
ac10: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f  assword = passwo
ac20: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  rd;..    Tcl_Inc
ac30: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
ac40: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
ac50: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
ac60: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74  allocate validat
ac70: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
ac80: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76   if (vcmd) {..(v
ac90: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
aca0: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20  ngFromObj(vcmd, 
acb0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
acc0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
acd0: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09  ->vcmd = vcmd;..
ace0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
acf0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
ad00: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  cmd);..}.    }..
ad10: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
ad20: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
ad30: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
ad40: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
ad50: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
ad60: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
ad70: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b  , model, &mode);
ad80: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54  ..if (chan == (T
ad90: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
ada0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
adb0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
adc0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
add0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
ade0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
adf0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
ae00: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
ae10: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
ae20: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
ae30: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28  nel(chan);..if (
ae40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
ae50: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
ae60: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
ae70: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ae80: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ae90: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
aea0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
aeb0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
aec0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
aed0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
aee0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
aef0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
af00: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
af10: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
af20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
af30: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
af40: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
af50: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
af60: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
af70: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
af80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
af90: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
afa0: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
afb0: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
afc0: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
afd0: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
afe0: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
aff0: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
b000: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65  key_len,..    ce
b010: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43  rt_len, CAdir, C
b020: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
b030: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
b040: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
b050: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
b060: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b070: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b080: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b090: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b0a0: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20    statePtr->ctx 
b0b0: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20  = ctx;..    /*. 
b0c0: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
b0d0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
b0e0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b  the channel work
b0f0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72  s in binary (for
b100: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72   the.     * encr
b110: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
b120: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20  t goofed up)..  
b130: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e     * We only wan
b140: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  t to adjust the 
b150: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65  buffering in pre
b160: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68  -v2 channels, wh
b170: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20  ere.     * each 
b180: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73  channel in the s
b190: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20  tack maintained 
b1a0: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e  its own buffers.
b1b0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
b1c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
b1d0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
b1e0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
b1f0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
b200: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
b210: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
b220: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
b230: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
b240: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
b250: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
b260: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
b270: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
b280: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
b290: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
b2a0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
b2b0: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
b2c0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
b2d0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
b2e0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
b2f0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
b300: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
b310: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
b320: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
b330: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
b340: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b350: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
b360: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b370: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
b380: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
b390: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
b3a0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
b3b0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
b3c0: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
b3d0: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
b3e0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
b3f0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
b400: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
b410: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
b420: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
b430: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
b440: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
b450: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
b460: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
b470: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
b480: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
b490: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
b4a0: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
b4b0: 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52 45  tatePtr, (TCL_RE
b4c0: 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49  ADABLE | TCL_WRI
b4d0: 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20  TABLE), chan);. 
b4e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65 61     dprintf("Crea
b4f0: 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65  ted channel name
b500: 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  d %s", Tcl_GetCh
b510: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
b520: 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20  tr->self));.    
b530: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65  if (statePtr->se
b540: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  lf == (Tcl_Chann
b550: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a  el) NULL) {../*.
b560: 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63  . * No use of Tc
b570: 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  l_EventuallyFree
b580: 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73   because no poss
b590: 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76  ible Tcl_Preserv
b5a0: 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65  e... */..Tls_Fre
b5b0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
b5c0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  Ptr);..return TC
b5d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
b5e0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b5f0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b600: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b610: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
b620: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b630: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
b640: 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20  ranslation));.  
b650: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b660: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b670: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b680: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f  -encoding", Tcl_
b690: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
b6a0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
b6b0: 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ng));.    Tcl_Se
b6c0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b6d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b6e0: 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72  >self, "-eofchar
b6f0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
b700: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
b710: 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20  lEOFChar));.    
b720: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
b730: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
b740: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62  tePtr->self, "-b
b750: 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53  locking", Tcl_DS
b760: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
b770: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
b780: 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ));..    /*.    
b790: 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a   * SSL Initializ
b7a0: 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20  ation.     */.  
b7b0: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20    statePtr->ssl 
b7c0: 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50  = SSL_new(stateP
b7d0: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66  tr->ctx);.    if
b7e0: 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   (!statePtr->ssl
b7f0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72  ) {../* SSL libr
b800: 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63  ary error */..Tc
b810: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b820: 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74  nterp, "couldn't
b830: 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73   construct ssl s
b840: 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53 4f  ession: ", REASO
b850: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b860: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b870: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b880: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b890: 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49  T", "INIT", "FAI
b8a0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b8b0: 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28  ULL);..Tls_Free(
b8c0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
b8d0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
b8e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
b8f0: 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65    /* Set host se
b900: 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  rver name */.   
b910: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29   if (servername)
b920: 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20   {../* Sets the 
b930: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
b940: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20  cation (SNI) in 
b950: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65  ClientHello exte
b960: 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72  nsion */../* Per
b970: 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e   RFC 6066, hostn
b980: 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65  ame is a ASCII e
b990: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74  ncoded string, t
b9a0: 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73  hough RFC 4366 s
b9b0: 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69  ays UTF-8. */..i
b9c0: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65  f (!SSL_set_tlse
b9d0: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61  xt_host_name(sta
b9e0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
b9f0: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69  ername) && requi
ba00: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  re) {..    Tcl_A
ba10: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ba20: 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c 53  rp, "setting TLS
ba30: 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65 6e   host name exten
ba40: 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28 63  sion failed", (c
ba50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ba60: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
ba70: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
ba80: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e  ", "IMPORT", "SN
ba90: 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  I", "FAILED", (c
baa0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
bab0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
bac0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
bad0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
bae0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  ERROR;..}.../* S
baf0: 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20  et hostname for 
bb00: 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65  peer certificate
bb10: 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69   hostname verifi
bb20: 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74  cation in client
bb30: 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65  s...   Don't use
bb40: 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73   SSL_set1_host s
bb50: 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69  ince it has limi
bb60: 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20  tations. */..if 
bb70: 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28  (!SSL_add1_host(
bb80: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
bb90: 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20  ervername)) {.. 
bba0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
bbb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65 74  ult(interp, "set
bbc0: 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e 61  ting DNS host na
bbd0: 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61  me failed", (cha
bbe0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
bbf0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
bc00: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
bc10: 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54   "IMPORT", "HOST
bc20: 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c  NAME", "FAILED",
bc30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
bc40: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
bc50: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
bc60: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
bc70: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
bc80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d   }..    /* Resum
bc90: 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  e session id */.
bca0: 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f      if (session_
bcb0: 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73  id && strlen(ses
bcc0: 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f  sion_id) <= SSL_
bcd0: 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47  MAX_SID_CTX_LENG
bce0: 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65  TH) {../* SSL_se
bcf0: 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09  t_session() */..
bd00: 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e  if (!SSL_SESSION
bd10: 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74  _set1_id_context
bd20: 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e  (SSL_get_session
bd30: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
bd40: 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e   session_id, (un
bd50: 73 69 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c  signed int) strl
bd60: 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29  en(session_id)))
bd70: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
bd80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bd90: 20 22 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e   "Resume session
bda0: 20 69 64 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69   id ", session_i
bdb0: 64 2c 20 22 20 66 61 69 6c 65 64 22 2c 20 28 63  d, " failed", (c
bdc0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
bdd0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
bde0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
bdf0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45  ", "IMPORT", "SE
be00: 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22  SSION", "FAILED"
be10: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
be20: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
be30: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
be40: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
be50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
be60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62    }..    /* Enab
be70: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c  le Application-L
be80: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65  ayer Protocol Ne
be90: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70  gotiation. Examp
bea0: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e  les are: http/1.
beb0: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32  0,..http/1.1, h2
bec0: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c  , h3, ftp, imap,
bed0: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65   pop3, xmpp-clie
bee0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c  nt, xmpp-server,
bef0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e   mqtt, irc, etc.
bf00: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e   */.    if (alpn
bf10: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20  ) {../* Convert 
bf20: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20  a TCL list into 
bf30: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  a protocol-list 
bf40: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a  in wire-format *
bf50: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  /..unsigned char
bf60: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75   *protos, *p;..u
bf70: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74  nsigned int prot
bf80: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 69 6e 74  os_len = 0;..int
bf90: 20 69 2c 20 6c 65 6e 2c 20 63 6e 74 3b 0a 09 54   i, len, cnt;..T
bfa0: 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a  cl_Obj **list;..
bfb0: 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
bfc0: 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
bfd0: 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20  rp, alpn, &cnt, 
bfe0: 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b  &list) != TCL_OK
bff0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
c000: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
c010: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
c020: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
c030: 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  ../* Determine t
c040: 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  he memory requir
c050: 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f  ed for the proto
c060: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72  col-list */..for
c070: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74   (i = 0; i < cnt
c080: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63  ; i++) {..    Tc
c090: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
c0a0: 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e  bj(list[i], &len
c0b0: 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20  );..    if (len 
c0c0: 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41  > 255) {...Tcl_A
c0d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c0e0: 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63  rp, "ALPN protoc
c0f0: 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20 6c 6f 6e 67  ol name too long
c100: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
c110: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f  );...Tcl_SetErro
c120: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
c130: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
c140: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c  ALPN", "FAILED",
c150: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
c160: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ...Tls_Free((cha
c170: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
c180: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
c190: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
c1a0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20  protos_len += 1 
c1b0: 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42  + len;..}.../* B
c1c0: 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74  uild the complet
c1d0: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
c1e0: 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61  */..protos = cka
c1f0: 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29  lloc(protos_len)
c200: 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c  ;../* protocol-l
c210: 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20  ists consist of 
c220: 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65  8-bit length-pre
c230: 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69  fixed, byte stri
c240: 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ngs */..for (i =
c250: 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20   0, p = protos; 
c260: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a  i < cnt; i++) {.
c270: 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d  .    char *str =
c280: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
c290: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26  omObj(list[i], &
c2a0: 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20  len);..    *p++ 
c2b0: 3d 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63  = len;..    memc
c2c0: 70 79 28 70 2c 20 73 74 72 2c 20 6c 65 6e 29 3b  py(p, str, len);
c2d0: 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a  ..    p += len;.
c2e0: 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  .}.../* SSL_set_
c2f0: 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65  alpn_protos make
c300: 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  s a copy of the 
c310: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f  protocol-list */
c320: 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20  ../* Note: This 
c330: 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65 72 73  functions revers
c340: 65 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  es the return va
c350: 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a  lue convention *
c360: 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61  /..if (SSL_set_a
c370: 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65  lpn_protos(state
c380: 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73  Ptr->ssl, protos
c390: 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b  , protos_len)) {
c3a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
c3b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c3c0: 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 41 4c  failed to set AL
c3d0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 28  PN protocols", (
c3e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
c3f0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
c400: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
c410: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41  S", "IMPORT", "A
c420: 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  LPN", "FAILED", 
c430: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c440: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
c450: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
c460: 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72  ;..    ckfree(pr
c470: 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75  otos);..    retu
c480: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
c490: 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74  .../* Store prot
c4a0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73  ocols list */..s
c4b0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c4c0: 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65  = protos;..state
c4d0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c4e0: 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  = protos_len;.  
c4f0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74    } else {..stat
c500: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
c510: 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ULL;..statePtr->
c520: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
c530: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
c540: 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63     * SSL Callbac
c550: 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53  ks.     */.    S
c560: 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  SL_set_app_data(
c570: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
c580: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c590: 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20  ;./* point back 
c5a0: 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c  to us */.    SSL
c5b0: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
c5c0: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
c5d0: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
c5e0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  k);.    SSL_set_
c5f0: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
c600: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66  atePtr->ssl, Inf
c610: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20  oCallback);..   
c620: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72   /* Callback for
c630: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f   observing proto
c640: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  col messages */.
c650: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
c660: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20  NO_SSL_TRACE.   
c670: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58   /* void SSL_CTX
c680: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c690: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c6a0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c6b0: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64  tePtr);.    void
c6c0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
c6d0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c6e0: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65  tr->ctx, Message
c6f0: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20  Callback); */.  
c700: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
c710: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
c720: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
c730: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
c740: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c750: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c760: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ssl, MessageCall
c770: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  back);.#endif.. 
c780: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
c790: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
c7a0: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
c7b0: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
c7c0: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
c7d0: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
c7e0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
c7f0: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
c800: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
c810: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
c820: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61  /* Server callba
c830: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  cks */..SSL_CTX_
c840: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c850: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50  rname_arg(stateP
c860: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a  tr->ctx, (void *
c870: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
c880: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
c890: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62  servername_callb
c8a0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
c8b0: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b  x, SNICallback);
c8c0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
c8d0: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74  ient_hello_cb(st
c8e0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c  atePtr->ctx, Hel
c8f0: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  loCallback, (voi
c900: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c910: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c920: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  otos != NULL) {.
c930: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
c940: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28  _alpn_select_cb(
c950: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
c960: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
c970: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c980: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c990: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d      if (tls1_2 =
c9a0: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c9b0: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f   0) {...SSL_CTX_
c9c0: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f  set_next_protos_
c9d0: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74  advertised_cb(st
c9e0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e  atePtr->ctx, NPN
c9f0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
ca00: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
ca10: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09    }.#endif..}...
ca20: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72  /* Enable server
ca30: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65   to send cert re
ca40: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64  quest after hand
ca50: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f  shake (TLS 1.3 o
ca60: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72  nly) */../* A wr
ca70: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75  ite operation mu
ca80: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f  st take place fo
ca90: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74  r the Certificat
caa0: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a  e Request to be.
cab0: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20  .   sent to the 
cac0: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e  client, this can
cad0: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53   be done with SS
cae0: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29  L_do_handshake()
caf0: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
cb00: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
cb10: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b  ake && tls1_3) {
cb20: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79  ..    SSL_verify
cb30: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e  _client_post_han
cb40: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d  dshake(statePtr-
cb50: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73  >ssl);..}.../* s
cb60: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72  et automatic cur
cb70: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a  ve selection */.
cb80: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75  .SSL_set_ecdh_au
cb90: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  to(statePtr->ssl
cba0: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73  , 1);.../* Set s
cbb0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
cbc0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
cbd0: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
cbe0: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
cbf0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
cc00: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
cc10: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
cc20: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
cc30: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
cc40: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
cc50: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
cc60: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
cc70: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
cc80: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
cc90: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
cca0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
ccb0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
ccc0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
ccd0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
cce0: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
ccf0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
cd00: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
cd10: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
cd20: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
cd30: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
cd40: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
cd50: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
cd60: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
cd70: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
cd80: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
cd90: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
cda0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
cdb0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
cdc0: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
cdd0: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
cde0: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
cdf0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
ce00: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
ce10: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
ce20: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
ce30: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
ce40: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
ce50: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
ce60: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
ce70: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
ce80: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73  .    }.    SSL_s
ce90: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d  et_bio(statePtr-
cea0: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e  >ssl, statePtr->
ceb0: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  p_bio, statePtr-
cec0: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f  >p_bio);.    BIO
ced0: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74  _set_ssl(statePt
cee0: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72  r->bio, statePtr
cef0: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  ->ssl, BIO_NOCLO
cf00: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  SE);..    /*.   
cf10: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49    * End of SSL I
cf20: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nit.     */.    
cf30: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
cf40: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ng %s", Tcl_GetC
cf50: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
cf60: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
cf70: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
cf80: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20  nterp, (char *) 
cf90: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
cfa0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
cfb0: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
cfc0: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
cfd0: 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
cfe0: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
cff0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
d000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
d040: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  . * UnimportObjC
d050: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
d060: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
d070: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  voked to remove 
d080: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
d090: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20  nel filter.. *. 
d0a0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
d0b0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
d0c0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
d0d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
d0e0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76  modify the behav
d0f0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61  ior of an IO cha
d100: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
d110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
d150: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e  */.static int.Un
d160: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69  importObjCmd(Cli
d170: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
d180: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
d190: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
d1a0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
d1b0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
d1c0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
d1d0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
d1e0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
d1f0: 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e  n. */..    dprin
d200: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
d210: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
d220: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
d230: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
d240: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
d250: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
d260: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
d270: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
d280: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
d290: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
d2a0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
d2b0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
d2c0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
d2d0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
d2e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d2f0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
d300: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
d310: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
d320: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
d330: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
d340: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20  (chan);..    if 
d350: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
d360: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
d370: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
d380: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d390: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
d3a0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
d3b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
d3c0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
d3d0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
d3e0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  ", NULL);..    T
d3f0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
d400: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
d410: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e  UNIMPORT", "CHAN
d420: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
d430: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d440: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d450: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
d460: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68  f (Tcl_UnstackCh
d470: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
d480: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
d490: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
d4a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d4b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
d4c0: 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63  ..clientData = c
d4d0: 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f  lientData;.}.../
d4e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
d4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54  -------. *. * CT
d530: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72  X_Init -- constr
d540: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e  uct a SSL_CTX in
d550: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73  stance. *. * Res
d560: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64  ults:. *.A valid
d570: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
d580: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a  e or NULL.. *. *
d590: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
d5a0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c  *.constructs SSL
d5b0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20   context (CTX). 
d5c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
d5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d600: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
d610: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58  ic SSL_CTX *.CTX
d620: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61  _Init(State *sta
d630: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72  tePtr, int isSer
d640: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20  ver, int proto, 
d650: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63  char *keyfile, c
d660: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20  har *certfile,. 
d670: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
d680: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20   *key, unsigned 
d690: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20  char *cert, int 
d6a0: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72  key_len, int cer
d6b0: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 64  t_len, char *CAd
d6c0: 69 72 2c 0a 20 20 20 20 63 68 61 72 20 2a 43 41  ir,.    char *CA
d6d0: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70 68  file, char *ciph
d6e0: 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65  ers, char *ciphe
d6f0: 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76  rsuites, int lev
d700: 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61  el, char *DHpara
d710: 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e  ms) {.    Tcl_In
d720: 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20 73  terp *interp = s
d730: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
d740: 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74  .    SSL_CTX *ct
d750: 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  x = NULL;.    Tc
d760: 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20 20  l_DString ds;.  
d770: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
d780: 31 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d  1;.    int off =
d790: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64   0;.    int load
d7a0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20  _private_key;.  
d7b0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48    const SSL_METH
d7c0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20  OD *method;..   
d7d0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
d7e0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72  ");..    if (!pr
d7f0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  oto) {..Tcl_Appe
d800: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d810: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f   "no valid proto
d820: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 4e  col selected", N
d830: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d840: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
d850: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e  * create SSL con
d860: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  text */.#if OPEN
d870: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
d880: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30  ER >= 0x10100000
d890: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f  L || defined(NO_
d8a0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL2) || defined
d8b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
d8c0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d8d0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d8e0: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c  TO_SSL2)) {..Tcl
d8f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d900: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74  terp, "SSL2 prot
d910: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d920: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  ed", NULL);..ret
d930: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d940: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
d950: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
d960: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d970: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28  O_SSL3).    if (
d980: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d990: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20  LS_PROTO_SSL3)) 
d9a0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d9b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
d9c0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
d9d0: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
d9e0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d9f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
da00: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
da10: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
da20: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
da30: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
da40: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
da50: 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  LS1)) {..Tcl_App
da60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
da70: 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f  , "TLS 1.0 proto
da80: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
da90: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
daa0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
dab0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
dac0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
dad0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dae0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69  NO_TLS1_1).    i
daf0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
db00: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
db10: 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _1)) {..Tcl_Appe
db20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
db30: 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63   "TLS 1.1 protoc
db40: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
db50: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ", NULL);..retur
db60: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
db70: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
db80: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
db90: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dba0: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
dbb0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
dbc0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
dbd0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
dbe0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dbf0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
dc00: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
dc10: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  , NULL);..return
dc20: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
dc30: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
dc40: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
dc50: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dc60: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
dc70: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dc80: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
dc90: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
dca0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dcb0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c  TLS 1.3 protocol
dcc0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
dcd0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
dce0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
dcf0: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
dd00: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
dd10: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
dd20: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
dd30: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
dd40: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
dd50: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
dd60: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
dd70: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
dd80: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f   (proto) {.#if O
dd90: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
dda0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
ddb0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
ddc0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
ddd0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dde0: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54  SSL2).    case T
ddf0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09  LS_PROTO_SSL2:..
de00: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
de10: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72  r ? SSLv2_server
de20: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
de30: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
de40: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
de50: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
de60: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
de70: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
de80: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
de90: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
dea0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
deb0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
dec0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
ded0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72  rver ? SSLv3_ser
dee0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
def0: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv3_client_meth
df00: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
df10: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
df20: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
df30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
df40: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
df50: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
df60: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
df70: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
df80: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
df90: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
dfa0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
dfb0: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
dfc0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
dfd0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dfe0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
dff0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e000: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
e010: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e020: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
e030: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
e040: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
e050: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e060: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
e070: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e080: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
e090: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
e0a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e0b0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
e0c0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e0d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
e0e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e0f0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
e100: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
e110: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
e120: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e130: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
e140: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e150: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
e160: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
e170: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e180: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
e190: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e1a0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
e1b0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
e1c0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
e1d0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
e1e0: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
e1f0: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
e200: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
e210: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
e220: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
e230: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e240: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
e250: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e260: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
e270: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
e280: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
e290: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
e2a0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
e2b0: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
e2c0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e2d0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
e2e0: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
e2f0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
e300: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
e310: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
e320: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e330: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f  NSSL_NO_SSL2)..o
e340: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
e350: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
e360: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL2)   ? 0 : SS
e370: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
e380: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e390: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
e3a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e3b0: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c  _NO_SSL3)..off |
e3c0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e3d0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
e3e0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
e3f0: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64  _NO_SSLv3);.#end
e400: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e410: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
e420: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e430: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
e440: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e450: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
e460: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e470: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
e480: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e490: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
e4a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e4b0: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
e4c0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e4d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
e4e0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e4f0: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
e500: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e510: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
e520: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e530: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
e540: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e550: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
e560: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e570: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
e580: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e590: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e5a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e5b0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
e5c0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e5d0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
e5e0: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
e5f0: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
e600: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
e610: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
e620: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
e630: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
e640: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
e650: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
e660: 72 6e 28 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a  rn(NULL);.    }.
e670: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28  .    if (getenv(
e680: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20  SSLKEYLOGFILE)) 
e690: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b  {..SSL_CTX_set_k
e6a0: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63  eylog_callback(c
e6b0: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  tx, KeyLogCallba
e6c0: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  ck);.    }..#if 
e6d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
e6e0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
e6f0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e700: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  3).    if (proto
e710: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c   == TLS_PROTO_TL
e720: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58  S1_3) {..SSL_CTX
e730: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
e740: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
e750: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53  _3_VERSION);..SS
e760: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
e770: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
e780: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
e790: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
e7a0: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70      /* Force cip
e7b0: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72  her selection or
e7c0: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f  der by server */
e7d0: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76  .    if (!isServ
e7e0: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73  er) {..SSL_CTX_s
e7f0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
e800: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45  SSL_OP_CIPHER_SE
e810: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29  RVER_PREFERENCE)
e820: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ;.    }..#if OPE
e830: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
e840: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
e850: 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64  L.    OpenSSL_ad
e860: 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73  d_all_algorithms
e870: 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68  (); /* Load ciph
e880: 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20  ers and digests 
e890: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53  */.#endif..    S
e8a0: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
e8b0: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
e8c0: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
e8d0: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
e8e0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
e8f0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e900: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
e910: 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67  ;./* all SSL bug
e920: 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a   workarounds */.
e930: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e940: 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c  options(ctx, SSL
e950: 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49  _OP_NO_COMPRESSI
e960: 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20  ON);./* disable 
e970: 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e  compression even
e980: 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f   if supported */
e990: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e9a0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66  _options(ctx, of
e9b0: 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20  f);../* disable 
e9c0: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
e9d0: 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  s */.#if OPENSSL
e9e0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e9f0: 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20  < 0x10101000L.  
ea00: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f    SSL_CTX_set_mo
ea10: 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45  de(ctx, SSL_MODE
ea20: 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a  _AUTO_RETRY);./*
ea30: 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64   handle new hand
ea40: 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72  shakes in backgr
ea50: 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61  ound. On by defa
ea60: 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ult in OpenSSL 1
ea70: 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a  .1.1. */.#endif.
ea80: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
ea90: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
eaa0: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20  ctx, 128);..    
eab0: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69  /* Set user defi
eac0: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70  ned ciphers, cip
ead0: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20  her suites, and 
eae0: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
eaf0: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  /.    if ((ciphe
eb00: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  rs != NULL) && !
eb10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
eb20: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70  er_list(ctx, cip
eb30: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  hers)) {..Tcl_Ap
eb40: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
eb50: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20  p, "Set ciphers 
eb60: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
eb70: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
eb80: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
eb90: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
eba0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
ebb0: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
ebc0: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
ebd0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
ebe0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
ebf0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
ec00: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
ec10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ec20: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
ec30: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
ec40: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
ec50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
ec60: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ec70: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
ec80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
ec90: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
eca0: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
ecb0: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
ecc0: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
ecd0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
ece0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
ecf0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
ed00: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
ed10: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
ed20: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
ed30: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
ed40: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
ed50: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
ed60: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
ed70: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
ed80: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
ed90: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
eda0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
edb0: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
edc0: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
edd0: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
ede0: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
edf0: 20 6f 6e 65 20 2a 2f 0a 23 69 66 64 65 66 20 4f   one */.#ifdef O
ee00: 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20  PENSSL_NO_DH.   
ee10: 20 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d   if (DHparams !=
ee20: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70   NULL) {..Tcl_Ap
ee30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ee40: 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72  p, "DH parameter
ee50: 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61   support not ava
ee60: 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a  ilable", (char *
ee70: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
ee80: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
ee90: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
eea0: 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48  .#else.    {..DH
eeb0: 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72  * dh;..if (DHpar
eec0: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
eed0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 09 20      BIO *bio;.. 
eee0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
eef0: 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 62 69  it(&ds);..    bi
ef00: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65  o = BIO_new_file
ef10: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26  (F2N(DHparams, &
ef20: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20  ds), "r");..    
ef30: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63  if (!bio) {...Tc
ef40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
ef50: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  s);...Tcl_Append
ef60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ef70: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44  Could not find D
ef80: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  H parameters fil
ef90: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
efa0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
efb0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
efc0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a  n NULL;..    }..
efd0: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65  .    dh = PEM_re
efe0: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28  ad_bio_DHparams(
eff0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  bio, NULL, NULL,
f000: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f   NULL);..    BIO
f010: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20  _free(bio);..   
f020: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f030: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28  (&ds);..    if (
f040: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  !dh) {...Tcl_App
f050: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f060: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "Could not rea
f070: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
f080: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61  from file", (cha
f090: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f0a0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f0b0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f0c0: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b  .    }..} else {
f0d0: 0a 09 20 20 20 20 64 68 20 3d 20 67 65 74 5f 64  ..    dh = get_d
f0e0: 68 50 61 72 61 6d 73 28 29 3b 0a 09 7d 0a 09 53  hParams();..}..S
f0f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64  SL_CTX_set_tmp_d
f100: 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 44 48 5f  h(ctx, dh);..DH_
f110: 66 72 65 65 28 64 68 29 3b 0a 20 20 20 20 7d 0a  free(dh);.    }.
f120: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73  #endif..    /* s
f130: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61  et our certifica
f140: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70  te */.    load_p
f150: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a  rivate_key = 0;.
f160: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
f170: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
f180: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
f190: 31 3b 0a 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  1;...Tcl_DString
f1a0: 49 6e 69 74 28 26 64 73 29 3b 0a 0a 09 69 66 20  Init(&ds);...if 
f1b0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
f1c0: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
f1d0: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c  x, F2N(certfile,
f1e0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
f1f0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
f200: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f210: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
f220: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f230: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f240: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
f250: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
f260: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09  tfile, ": ",....
f270: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
f280: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f290: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
f2a0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
f2b0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20  rn NULL;..}.    
f2c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
f2d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
f2e0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
f2f0: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
f300: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
f310: 53 4e 31 28 63 74 78 2c 20 63 65 72 74 5f 6c 65  SN1(ctx, cert_le
f320: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
f330: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f340: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
f350: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f360: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f370: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
f380: 63 61 74 65 3a 20 22 2c 0a 09 09 09 20 20 20 20  cate: ",....    
f390: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
f3a0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
f3b0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f3c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
f3d0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
f3e0: 73 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d  se {..certfile =
f3f0: 20 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74   (char*)X509_get
f400: 5f 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69  _default_cert_fi
f410: 6c 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f  le();...if (SSL_
f420: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
f430: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65  ate_file(ctx, ce
f440: 72 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45  rtfile, SSL_FILE
f450: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
f460: 7b 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c  {.#if 0..    Tcl
f470: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f480: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
f490: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f4a0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
f4b0: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
f4c0: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
f4d0: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20  file, ": ",.... 
f4e0: 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28 63      REASON(), (c
f4f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
f500: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
f510: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
f520: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09  n NULL;.#endif..
f530: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
f540: 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20  set our private 
f550: 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c  key */.    if (l
f560: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29  oad_private_key)
f570: 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20   {..if (keyfile 
f580: 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d  == NULL && key =
f590: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b  = NULL) {..    k
f5a0: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
f5b0: 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66  e;..}...if (keyf
f5c0: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
f5d0: 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70      /* get the p
f5e0: 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63  rivate key assoc
f5f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20  iated with this 
f600: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
f610: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
f620: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79  == NULL) {...key
f630: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
f640: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
f650: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
f660: 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74  ivateKey_file(ct
f670: 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20  x, F2N(keyfile, 
f680: 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59  &ds), SSL_FILETY
f690: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
f6a0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f6b0: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
f6c0: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
f6d0: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
f6e0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
f6f0: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
f700: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
f710: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
f720: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
f730: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f740: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
f750: 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b  ic key file ", k
f760: 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 09  eyfile, " ",....
f770: 20 20 20 20 20 20 20 20 20 52 45 41 53 4f 4e 28           REASON(
f780: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
f790: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
f7a0: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
f7b0: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
f7c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
f7d0: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
f7e0: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
f7f0: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
f800: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
f810: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
f820: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
f830: 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20  ,key_len) <= 0) 
f840: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
f850: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
f860: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
f870: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
f880: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
f890: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
f8a0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
f8b0: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
f8c0: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
f8d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f8e0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
f8f0: 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 52 45 41  blic key: ", REA
f900: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f910: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f920: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f930: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f940: 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20  }..}../* Now we 
f950: 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20  know that a key 
f960: 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65  and cert have be
f970: 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09  en set against..
f980: 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65   * the SSL conte
f990: 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  xt */..if (!SSL_
f9a0: 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74  CTX_check_privat
f9b0: 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20  e_key(ctx)) {.. 
f9c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f9d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69  ult(interp, "pri
f9e0: 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f  vate key does no
f9f0: 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74  t match the cert
fa00: 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b  ificate public k
fa10: 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68  ey",....     (ch
fa20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
fa30: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
fa40: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
fa50: 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a   NULL;..}.    }.
fa60: 0a 20 20 20 20 2f 2a 20 53 65 74 20 76 65 72 69  .    /* Set veri
fa70: 66 69 63 61 74 69 6f 6e 20 43 41 73 20 2a 2f 0a  fication CAs */.
fa80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
fa90: 6e 69 74 28 26 64 73 29 3b 0a 20 20 20 20 54 63  nit(&ds);.    Tc
faa0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
fab0: 73 31 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65 72  s1);.    /* Ther
fac0: 65 20 69 73 20 6f 6e 65 20 64 65 66 61 75 6c 74  e is one default
fad0: 20 64 69 72 65 63 74 6f 72 79 2c 20 6f 6e 65 20   directory, one 
fae0: 64 65 66 61 75 6c 74 20 66 69 6c 65 2c 20 61 6e  default file, an
faf0: 64 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 73 74  d one default st
fb00: 6f 72 65 2e 0a 09 54 68 65 20 64 65 66 61 75 6c  ore...The defaul
fb10: 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  t CA certificate
fb20: 73 20 64 69 72 65 63 74 6f 72 79 20 28 61 6e 64  s directory (and
fb30: 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 29 20   default store) 
fb40: 69 73 20 69 6e 20 74 68 65 20 4f 70 65 6e 53 53  is in the OpenSS
fb50: 4c 0a 09 63 65 72 74 73 20 64 69 72 65 63 74 6f  L..certs directo
fb60: 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76  ry. It can be ov
fb70: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
fb80: 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65 6e 76  SSL_CERT_DIR env
fb90: 20 76 61 72 2e 20 54 68 65 0a 09 64 65 66 61 75   var. The..defau
fba0: 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61 74  lt CA certificat
fbb0: 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c 65  es file is calle
fbc0: 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74 68  d cert.pem in th
fbd0: 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53  e default OpenSS
fbe0: 4c 0a 09 64 69 72 65 63 74 6f 72 79 2e 20 49 74  L..directory. It
fbf0: 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
fc00: 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45  en by the SSL_CE
fc10: 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e  RT_FILE env var.
fc20: 20 2a 2f 0a 09 2f 2a 20 69 6e 74 20 53 53 4c 5f   */../* int SSL_
fc30: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
fc40: 76 65 72 69 66 79 5f 64 69 72 28 53 53 4c 5f 43  verify_dir(SSL_C
fc50: 54 58 20 2a 63 74 78 29 20 61 6e 64 20 69 6e 74  TX *ctx) and int
fc60: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
fc70: 61 75 6c 74 5f 76 65 72 69 66 79 5f 66 69 6c 65  ault_verify_file
fc80: 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 2a  (SSL_CTX *ctx) *
fc90: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
fca0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 6c  TX_load_verify_l
fcb0: 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46 32  ocations(ctx, F2
fcc0: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c 20  N(CAfile, &ds), 
fcd0: 46 32 4e 28 43 41 64 69 72 2c 20 26 64 73 31 29  F2N(CAdir, &ds1)
fce0: 29 20 7c 7c 0a 09 21 53 53 4c 5f 43 54 58 5f 73  ) ||..!SSL_CTX_s
fcf0: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
fd00: 79 5f 70 61 74 68 73 28 63 74 78 29 29 20 7b 0a  y_paths(ctx)) {.
fd10: 23 69 66 20 30 0a 09 54 63 6c 5f 44 53 74 72 69  #if 0..Tcl_DStri
fd20: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 54 63  ngFree(&ds);..Tc
fd30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
fd40: 73 31 29 3b 0a 09 2f 2a 20 44 6f 6e 27 74 20 63  s1);../* Don't c
fd50: 75 72 72 65 6e 74 6c 79 20 63 61 72 65 20 69 66  urrently care if
fd60: 20 74 68 69 73 20 66 61 69 6c 73 20 2a 2f 0a 09   this fails */..
fd70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
fd80: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 20 64 65  (interp, "SSL de
fd90: 66 61 75 6c 74 20 76 65 72 69 66 79 20 70 61 74  fault verify pat
fda0: 68 73 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c  hs: ", REASON(),
fdb0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
fdc0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
fdd0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
fde0: 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  L;.#endif.    }.
fdf0: 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f  .    /* https://
fe00: 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f  sourceforge.net/
fe10: 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a  p/tls/bugs/57/ *
fe20: 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44  /.    /* XXX:TOD
fe30: 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72 20  O: Let the user 
fe40: 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65  supply values he
fe50: 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f  re instead of so
fe60: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78 69  mething that exi
fe70: 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73  sts on the files
fe80: 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20  ystem */.    if 
fe90: 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  (CAfile != NULL)
fea0: 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30   {..STACK_OF(X50
feb0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
fec0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
fed0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
fee0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
fef0: 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21  .if (certNames !
ff00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
ff10: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
ff20: 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63  t_CA_list(ctx, c
ff30: 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20  ertNames);..}.  
ff40: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
ff50: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20  ringFree(&ds);. 
ff60: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
ff70: 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65  ee(&ds1);.    re
ff80: 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a  turn ctx;.}.../*
ff90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
ffa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ffd0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61  ------. *. * Sta
ffe0: 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  tusObjCmd -- ret
fff0: 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20  urn certificate 
10000 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65  for connected pe
10010 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  er.. *. * Result
10020 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
10030 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
10040 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
10050 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
10060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
100a0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
100b0 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43  t.StatusObjCmd(C
100c0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
100d0 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
100e0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
100f0 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
10100 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
10110 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
10120 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72  ;.    X509 *peer
10130 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  ;.    Tcl_Obj *o
10140 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43  bjPtr;.    Tcl_C
10150 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20  hannel chan;.   
10160 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61   char *channelNa
10170 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20  me, *ciphers;.  
10180 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
10190 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
101a0 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20  har *proto;.    
101b0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e  unsigned int len
101c0 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72  ;.    int nid, r
101d0 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
101e0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
101f0 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c   if (objc < 2 ||
10200 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62   objc > 3 || (ob
10210 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63  jc == 3 && !strc
10220 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  mp(Tcl_GetString
10230 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63  (objv[1]), "-loc
10240 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72  al"))) {..Tcl_Wr
10250 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10260 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c  p, 1, objv, "?-l
10270 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b  ocal? channel");
10280 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
10290 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
102a0 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64  * Get channel Id
102b0 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e   */.    channelN
102c0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
102d0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
102e0 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a  (objc == 2 ? 1 :
102f0 20 32 29 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20   2)], NULL);.   
10300 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
10310 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
10320 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64  hannelName, &mod
10330 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  e);.    if (chan
10340 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
10350 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
10360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10370 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
10380 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
10390 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
103a0 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
103b0 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
103c0 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
103d0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
103e0 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
103f0 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
10400 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
10410 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
10420 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
10430 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
10440 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
10450 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
10460 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
10470 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
10480 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
10490 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e  "STATUS", "CHANN
104a0 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
104b0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
104c0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
104d0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  R;.    }.    sta
104e0 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
104f0 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
10500 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
10510 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  n);..    /* Get 
10520 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
10530 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a  peer or self */.
10540 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
10550 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  2) {..peer = SSL
10560 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66  _get_peer_certif
10570 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
10580 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
10590 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67   {..peer = SSL_g
105a0 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  et_certificate(s
105b0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
105c0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20     }.    /* Get 
105d0 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
105e0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20   info */.    if 
105f0 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72  (peer) {..objPtr
10600 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   = Tls_NewX509Ob
10610 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b  j(interp, peer);
10620 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29  ..if (objc == 2)
10630 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65   {..    X509_fre
10640 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65  e(peer);..    pe
10650 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  er = NULL;..}.  
10660 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50    } else {..objP
10670 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
10680 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
10690 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72    }..    /* Peer
106a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50   name */.    LAP
106b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
106c0 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61   objPtr, "peerna
106d0 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65  me", SSL_get0_pe
106e0 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  ername(statePtr-
106f0 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20  >ssl), -1);.    
10700 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10710 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69  rp, objPtr, "sbi
10720 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70  ts", SSL_get_cip
10730 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74  her_bits(statePt
10740 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a  r->ssl, NULL));.
10750 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28  .    ciphers = (
10760 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69  char*)SSL_get_ci
10770 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73  pher(statePtr->s
10780 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  sl);.    LAPPEND
10790 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
107a0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63  Ptr, "cipher", c
107b0 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20  iphers, -1);..  
107c0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20    /* Verify the 
107d0 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
107e0 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68   presented by th
107f0 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41  e peer */.    LA
10800 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10810 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
10820 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f  yResult",..X509_
10830 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
10840 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74  r_string(SSL_get
10850 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73  _verify_result(s
10860 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20  tatePtr->ssl)), 
10870 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  -1);..    /* Ver
10880 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ify mode */.    
10890 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76  mode = SSL_get_v
108a0 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65  erify_mode(state
108b0 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69  Ptr->ssl);.    i
108c0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
108d0 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c  ERIFY_NONE) {..L
108e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
108f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
10900 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c  fyMode", "none",
10910 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65   -1);.    } else
10920 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73   {..Tcl_Obj *lis
10930 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  tObjPtr = Tcl_Ne
10940 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
10950 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  );..if (mode && 
10960 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29  SSL_VERIFY_PEER)
10970 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
10980 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10990 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
109a0 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
109b0 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31  ngObj("peer", -1
109c0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
109d0 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   && SSL_VERIFY_F
109e0 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
109f0 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ERT) {..    Tcl_
10a00 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10a10 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10a20 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10a30 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20  StringObj("fail 
10a40 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22  if no peer cert"
10a50 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
10a60 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
10a70 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20  FY_CLIENT_ONCE) 
10a80 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
10a90 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
10aa0 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
10ab0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10ac0 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63  gObj("client onc
10ad0 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  e", -1));..}..if
10ae0 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10af0 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48  RIFY_POST_HANDSH
10b00 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  AKE) {..    Tcl_
10b10 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10b20 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10b30 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10b40 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20  StringObj("post 
10b50 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29  handshake", -1))
10b60 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42  ;..}..LAPPEND_OB
10b70 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  J(interp, objPtr
10b80 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
10b90 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20  listObjPtr).    
10ba0 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  }..    /* Verify
10bb0 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20   mode depth */. 
10bc0 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
10bd0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10be0 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53  verifyDepth", SS
10bf0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70  L_get_verify_dep
10c00 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
10c10 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f  ));..    /* Repo
10c20 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
10c30 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
10c40 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f  sult of the nego
10c50 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53  tiation */.    S
10c60 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c  SL_get0_alpn_sel
10c70 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e  ected(statePtr->
10c80 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ssl, &proto, &le
10c90 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  n);.    LAPPEND_
10ca0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10cb0 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
10cc0 72 20 2a 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29  r *)proto, (int)
10cd0 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45   len);.    LAPPE
10ce0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10cf0 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
10d00 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69  ", SSL_get_versi
10d10 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
10d20 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
10d30 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53  Valid for non-RS
10d40 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20  A signature and 
10d50 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69  TLS 1.3 */.    i
10d60 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
10d70 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70  .res = SSL_get_p
10d80 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69  eer_signature_ni
10d90 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10da0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c   &nid);.    } el
10db0 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
10dc0 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69  get_signature_ni
10dd0 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10de0 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20   &nid);.    }.  
10df0 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64    if (!res) {nid
10e00 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45   = 0;}.    LAPPE
10e10 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10e20 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72  bjPtr, "signatur
10e30 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c  eHashAlgorithm",
10e40 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
10e50 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66 20 28  , -1);..    if (
10e60 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65  objc == 2) {..re
10e70 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  s = SSL_get_peer
10e80 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f  _signature_type_
10e90 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
10ea0 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
10eb0 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
10ec0 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
10ed0 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
10ee0 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10ef0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65     }.    if (!re
10f00 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20  s) {nid = 0;}.  
10f10 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10f20 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
10f30 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f  ignatureType", O
10f40 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
10f50 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  -1);..    Tcl_Se
10f60 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10f70 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
10f80 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
10f90 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69  clientData = cli
10fa0 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a  entData;.}.../*.
10fb0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ff0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
11000 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
11010 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
11020 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
11030 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
11040 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
11050 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
11060 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
11070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
110a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
110b0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
110c0 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
110d0 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
110e0 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
110f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
11100 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
11110 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
11120 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
11130 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
11140 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
11150 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
11160 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
11170 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
11180 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
11190 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
111a0 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
111b0 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
111c0 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
111d0 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
111e0 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
111f0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
11200 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
11210 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20  VP_MD *md;..    
11220 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
11230 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
11240 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
11250 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
11260 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
11270 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  R);.    }..    c
11280 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
11290 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
112a0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
112b0 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
112c0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
112d0 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
112e0 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
112f0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
11300 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
11310 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
11320 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
11330 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
11340 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
11350 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
11360 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
11370 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
11380 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
11390 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
113a0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
113b0 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
113c0 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
113d0 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
113e0 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
113f0 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
11400 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
11410 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
11420 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43  , "TLS", "CONNEC
11430 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22  TION", "CHANNEL"
11440 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
11450 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
11460 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
11470 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
11480 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
11490 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
114a0 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
114b0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
114c0 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
114d0 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
114e0 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
114f0 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
11500 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
11510 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
11520 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f   {../* connectio
11530 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50  n state */..LAPP
11540 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11550 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c  objPtr, "state",
11560 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
11570 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
11580 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
11590 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
115a0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
115b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
115c0 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  Ptr, "servername
115d0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  ", SSL_get_serve
115e0 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
115f0 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
11600 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  name), -1);.../*
11610 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
11620 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11630 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
11640 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
11650 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
11660 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  -1);.../* Renego
11670 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
11680 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11690 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
116a0 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f   "renegotiation_
116b0 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65  allowed", SSL_ge
116c0 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74  t_secure_renegot
116d0 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73  iation_support(s
116e0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73  sl));.../* Get s
116f0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
11700 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11710 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11720 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c 20 53  ecuritylevel", S
11730 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_get_security_
11740 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f  level(ssl));.../
11750 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11760 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11770 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11780 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22  "session_reused"
11790 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65  , SSL_session_re
117a0 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  used(ssl));.../*
117b0 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20   Is server info 
117c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
117d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
117e0 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53   "is_server", SS
117f0 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29  L_is_server(ssl)
11800 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20  );.../* Is DTLS 
11810 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11820 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11830 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f   "is_dtls", SSL_
11840 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20  is_dtls(ssl));. 
11850 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70     }..    /* Cip
11860 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  her info */.    
11870 63 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74  cipher = SSL_get
11880 5f 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28  _current_cipher(
11890 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69  ssl);.    if (ci
118a0 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  pher != NULL) {.
118b0 09 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a  .char buf[BUFSIZ
118c0 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69  ] = {0};..int bi
118d0 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09  ts, alg_bits;...
118e0 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a  /* Cipher name *
118f0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11900 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11910 63 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50  cipher", SSL_CIP
11920 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70  HER_get_name(cip
11930 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
11940 52 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  RFC name of ciph
11950 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
11960 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11970 72 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d  r, "standard_nam
11980 65 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73  e", SSL_CIPHER_s
11990 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
119a0 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
119b0 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20  OpenSSL name of 
119c0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
119d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
119e0 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f  bjPtr, "openssl_
119f0 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63  name", OPENSSL_c
11a00 69 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43  ipher_name(SSL_C
11a10 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
11a20 61 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31  ame(cipher)), -1
11a30 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f  );.../* number o
11a40 66 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73  f secret bits us
11a50 65 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f  ed for cipher */
11a60 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50  ..bits = SSL_CIP
11a70 48 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70  HER_get_bits(cip
11a80 68 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b  her, &alg_bits);
11a90 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11aa0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11ab0 65 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74  ecret_bits", bit
11ac0 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
11ad0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11ae0 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73   "algorithm_bits
11af0 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f  ", alg_bits);../
11b00 2a 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63  * alg_bits is ac
11b10 74 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20  tual key secret 
11b20 62 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74  bits. If use bit
11b30 73 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c  s and secret (al
11b40 67 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69  gorithm) bits di
11b50 66 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65  ffer,..   the re
11b60 73 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61  st of the bits a
11b70 72 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66  re fixed, i.e. f
11b80 6f 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72  or limited expor
11b90 74 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20  t ciphers (bits 
11ba0 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e  < 56) */.../* In
11bb0 64 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53  dicates which SS
11bc0 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76  L/TLS protocol v
11bd0 65 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66  ersion first def
11be0 69 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20  ined the cipher 
11bf0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11c00 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11c10 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53  "min_version", S
11c20 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65  SL_CIPHER_get_ve
11c30 72 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d  rsion(cipher), -
11c40 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  1);.../* Cipher 
11c50 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  NID */..LAPPEND_
11c60 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11c70 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44 22 2c  tr, "cipherNID",
11c80 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
11c90 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
11ca0 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28 63 69  et_cipher_nid(ci
11cb0 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
11cc0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11cd0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67 65 73  , objPtr, "diges
11ce0 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  tNID", (char *)O
11cf0 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
11d00 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73 74 5f  PHER_get_digest_
11d10 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11d20 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11d30 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11d40 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49 44 22  "keyExchangeNID"
11d50 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
11d60 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
11d70 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65  get_kx_nid(ciphe
11d80 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
11d90 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11da0 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e 74 69  bjPtr, "authenti
11db0 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61  cationNID", (cha
11dc0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
11dd0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 61 75  SL_CIPHER_get_au
11de0 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  th_nid(cipher)),
11df0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61   -1);.../* messa
11e00 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
11e10 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65 72 20  n code - Cipher 
11e20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20 47 43  is AEAD (e.g. GC
11e30 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f 50 6f  M or ChaCha20/Po
11e40 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a  ly1305) or not *
11e50 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69 63 61  /../* Authentica
11e60 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e 20 77  ted Encryption w
11e70 69 74 68 20 61 73 73 6f 63 69 61 74 65 64 20 64  ith associated d
11e80 61 74 61 20 28 41 45 41 44 29 20 63 68 65 63 6b  ata (AEAD) check
11e90 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
11ea0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
11eb0 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61 65 61  , "cipher_is_aea
11ec0 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 69  d", SSL_CIPHER_i
11ed0 73 5f 61 65 61 64 28 63 69 70 68 65 72 29 29 3b  s_aead(cipher));
11ee0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
11ef0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
11f00 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
11f10 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
11f20 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
11f30 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
11f40 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
11f50 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
11f60 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11f70 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
11f80 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
11f90 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
11fa0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
11fb0 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69 63  OpenSSL-specific
11fc0 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44   ID, not IANA ID
11fd0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
11fe0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11ff0 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28 69   "cipher_id", (i
12000 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
12010 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  et_id(cipher));.
12020 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49 44  ../* Two-byte ID
12030 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c 53   used in the TLS
12040 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65   protocol of the
12050 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a 2f   given cipher */
12060 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12070 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
12080 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e  rotocol_id", (in
12090 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  t) SSL_CIPHER_ge
120a0 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69  t_protocol_id(ci
120b0 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78  pher));.../* Tex
120c0 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f 6e  tual description
120d0 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 20 2a   of the cipher *
120e0 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48 45  /..if (SSL_CIPHE
120f0 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63 69  R_description(ci
12100 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f  pher, buf, sizeo
12110 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
12120 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44 5f   {..    LAPPEND_
12130 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12140 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f 6e  tr, "description
12150 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a  ", buf, -1);..}.
12160 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
12170 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
12180 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
12190 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
121a0 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
121b0 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
121c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
121d0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
121e0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
121f0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
12200 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
12210 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
12220 70 72 6f 74 6f 3b 0a 09 63 68 61 72 20 62 75 66  proto;..char buf
12230 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54  fer[SSL_MAX_MAST
12240 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a  ER_KEY_LENGTH];.
12250 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
12260 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
12270 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
12280 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69   the ALPN negoti
12290 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45  ation */..SSL_SE
122a0 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f  SSION_get0_alpn_
122b0 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e  selected(session
122c0 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29  , &proto, &len2)
122d0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
122e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
122f0 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20  alpn", (char *) 
12300 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65 6e  proto, (int) len
12310 32 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  2);.../* Report 
12320 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
12330 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
12340 74 20 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67  t of the NPN neg
12350 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64  otiation */.#ifd
12360 65 66 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f  ef USE_NPN..SSL_
12370 67 65 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f  get0_next_proto_
12380 6e 65 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20  negotiated(ssl, 
12390 26 70 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a  &proto, &ulen);.
123a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
123b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70  erp, objPtr, "np
123c0 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f  n", (char *) pro
123d0 74 6f 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b  to, (int) ulen);
123e0 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
123f0 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
12400 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
12410 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12420 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c  "resumable", SSL
12430 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75  _SESSION_is_resu
12440 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b  mable(session));
12450 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74  .../* Session st
12460 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64  art time (second
12470 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a  s since epoch) *
12480 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
12490 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
124a0 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53  "start_time", SS
124b0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
124c0 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  me(session));...
124d0 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
124e0 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74   - SSL_CTX_get_t
124f0 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e  imeout (in secon
12500 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
12510 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
12520 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20  Ptr, "timeout", 
12530 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
12540 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
12550 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
12560 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64  id - TLSv1.2 and
12570 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09   below only */..
12580 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
12590 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
125a0 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
125b0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
125c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
125d0 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73   "session_id", s
125e0 65 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29  ession_id, (int)
125f0 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73   ulen);.../* Ses
12600 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sion context */.
12610 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53  .session_id = SS
12620 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69  L_SESSION_get0_i
12630 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f  d_context(sessio
12640 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  n, &ulen);..LAPP
12650 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
12660 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
12670 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65  ion_context", se
12680 73 73 69 6f 6e 5f 69 64 2c 20 28 69 6e 74 29 20  ssion_id, (int) 
12690 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ulen);.../* Sess
126a0 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20 63 6c 69  ion ticket - cli
126b0 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c  ent only */..SSL
126c0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69  _SESSION_get0_ti
126d0 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74  cket(session, &t
126e0 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09  icket, &len2);..
126f0 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
12700 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12710 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c  session_ticket",
12720 20 74 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c   ticket, (int) l
12730 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  en2);.../* Sessi
12740 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69  on ticket lifeti
12750 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f  me hint (in seco
12760 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  nds) */..LAPPEND
12770 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62  _LONG(interp, ob
12780 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22  jPtr, "lifetime"
12790 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
127a0 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d  t_ticket_lifetim
127b0 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29  e_hint(session))
127c0 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70  ;.../* Ticket ap
127d0 70 20 64 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53  p data */..SSL_S
127e0 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
127f0 65 74 5f 61 70 70 64 61 74 61 28 73 65 73 73 69  et_appdata(sessi
12800 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
12810 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
12820 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
12830 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70 70  Ptr, "ticket_app
12840 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c 20  _data", ticket, 
12850 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  (int) len2);.../
12860 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79  * Get master key
12870 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f   */..len2 = SSL_
12880 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74  SESSION_get_mast
12890 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20  er_key(session, 
128a0 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f  buffer, SSL_MAX_
128b0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
128c0 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  H);..LAPPEND_BAR
128d0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
128e0 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22  tr, "master_key"
128f0 2c 20 62 75 66 66 65 72 2c 20 28 69 6e 74 29 20  , buffer, (int) 
12900 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70  len2);.../* Comp
12910 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 09 75  ression id */..u
12920 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64 20 3d  nsigned int id =
12930 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
12940 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73 65 73  _compress_id(ses
12950 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  sion);..LAPPEND_
12960 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12970 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
12980 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20 3f 20  _id", id == 1 ? 
12990 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65 22 2c  "zlib" : "none",
129a0 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
129b0 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20   /* Compression 
129c0 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
129d0 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23  ssl != NULL) {.#
129e0 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c 5f 43  ifdef HAVE_SSL_C
129f0 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f 6e 73  OMPRESSION..cons
12a00 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20 2a 63  t COMP_METHOD *c
12a10 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d  omp, *expn;..com
12a20 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  p = SSL_get_curr
12a30 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f 6e 28  ent_compression(
12a40 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20 53 53  ssl);..expn = SS
12a50 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 65 78  L_get_current_ex
12a60 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09  pansion(ssl);...
12a70 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12a80 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d  rp, objPtr, "com
12a90 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d 70 20  pression", comp 
12aa0 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  ? SSL_COMP_get_n
12ab0 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e  ame(comp) : "non
12ac0 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
12ad0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12ae0 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
12af0 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f 43 4f  ", expn ? SSL_CO
12b00 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78 70 6e  MP_get_name(expn
12b10 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  ) : "none", -1);
12b20 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e 44 5f  .#else..LAPPEND_
12b30 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12b40 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
12b50 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
12b60 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
12b80 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  pansion", "none"
12b90 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
12ba0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 72 76    }..    /* Serv
12bb0 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b  er info */.    {
12bc0 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20 53 53  ..long mode = SS
12bd0 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73 69 6f  L_CTX_get_sessio
12be0 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
12bf0 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 63 68  tePtr->ctx);..ch
12c00 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20 28 6d  ar *msg;...if (m
12c10 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12c20 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20 20 20  ACHE_OFF) {..   
12c30 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a 09 7d   msg = "off";..}
12c40 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26   else if (mode &
12c50 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
12c60 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20 20 6d  CLIENT) {..    m
12c70 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b 0a 09  sg = "client";..
12c80 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65 20  } else if (mode 
12c90 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
12ca0 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20 20 20  _SERVER) {..    
12cb0 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22 3b 0a  msg = "server";.
12cc0 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
12cd0 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
12ce0 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20 20 6d  E_BOTH) {..    m
12cf0 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09 7d 20  sg = "both";..} 
12d00 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73 67 20  else {..    msg 
12d10 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a  = "unknown";..}.
12d20 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12d30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
12d40 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
12d50 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20 20 20  ", msg, -1);.   
12d60 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20 4c 69   }..    /* CA Li
12d70 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49 46 20  st */.    /* IF 
12d80 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20 73 61  not a server, sa
12d90 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30 5f 70  me as SSL_get0_p
12da0 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49 66 20  eer_CA_list. If 
12db0 73 65 72 76 65 72 20 73 61 6d 65 20 61 73 20 53  server same as S
12dc0 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69 65 6e  SL_CTX_get_clien
12dd0 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20 20 20  t_CA_list */.   
12de0 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e   listPtr = Tcl_N
12df0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
12e00 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46  L);.    STACK_OF
12e10 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 61 5f  (X509_NAME) *ca_
12e20 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28 28 63  list;.    if ((c
12e30 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67 65 74  a_list = SSL_get
12e40 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
12e50 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  ssl)) != NULL) {
12e60 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b 42 55  ..char buffer[BU
12e70 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69 6e 74  FSIZ];..for (int
12e80 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58   i = 0; i < sk_X
12e90 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
12ea0 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20  list); i++) {.. 
12eb0 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61     X509_NAME *na
12ec0 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  me = sk_X509_NAM
12ed0 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c  E_value(ca_list,
12ee0 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28 6e 61   i);..    if (na
12ef0 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d  me) {...X509_NAM
12f00 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20  E_oneline(name, 
12f10 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a 29 3b  buffer, BUFSIZ);
12f20 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ...Tcl_ListObjAp
12f30 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
12f40 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
12f50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75  _NewStringObj(bu
12f60 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20  ffer, -1));..   
12f70 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20   }..}.    }.    
12f80 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
12f90 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c  rp, objPtr, "caL
12fa0 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a  ist", listPtr);.
12fb0 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
12fc0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12fd0 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73  "caListCount", s
12fe0 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28  k_X509_NAME_num(
12ff0 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20 20 20  ca_list));..    
13000 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
13010 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
13020 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
13030 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
13040 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
13050 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
130a0 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20  * MiscObjCmd -- 
130b0 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a  misc commands. *
130c0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
130d0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
130e0 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
130f0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
13100 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
13110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
13150 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63  .static int.Misc
13160 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
13170 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
13180 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13190 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
131a0 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
131b0 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ]) {.    static 
131c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d  const char *comm
131d0 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71  ands [] = { "req
131e0 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c  ", "strreq", NUL
131f0 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f  L };.    enum co
13200 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43  mmand { C_REQ, C
13210 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59  _STRREQ, C_DUMMY
13220 20 7d 3b 0a 20 20 20 20 69 6e 74 20 63 6d 64 2c   };.    int cmd,
13230 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72   isStr;.    char
13240 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a   buffer[16384];.
13250 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13260 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
13270 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63  (objc < 2) {..Tc
13280 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
13290 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
132a0 22 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67  "subcommand ?arg
132b0 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  s?");..return TC
132c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
132d0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
132e0 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
132f0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d  p, objv[1], comm
13300 61 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c  ands, "command",
13310 20 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c   0, &cmd) != TCL
13320 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
13330 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
13340 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
13350 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53  rror();..    isS
13360 74 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53  tr = (cmd == C_S
13370 54 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74  TRREQ);.    swit
13380 63 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e  ch ((enum comman
13390 64 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20  d) cmd) {..case 
133a0 43 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53  C_REQ:..case C_S
133b0 54 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56  TRREQ: {..    EV
133c0 50 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c  P_PKEY *pkey=NUL
133d0 4c 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65  L;..    X509 *ce
133e0 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35  rt=NULL;..    X5
133f0 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55  09_NAME *name=NU
13400 4c 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a  LL;..    Tcl_Obj
13410 20 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 69   **listv;..    i
13420 6e 74 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20  nt listc,i;...  
13430 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b    BIO *out=NULL;
13440 0a 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43  ...    char *k_C
13450 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f  ="",*k_ST="",*k_
13460 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f  L="",*k_O="",*k_
13470 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a  OU="",*k_CN="",*
13480 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20  k_Email="";..   
13490 20 63 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70   char *keyout,*p
134a0 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20  emout,*str;..   
134b0 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72   int keysize,ser
134c0 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a  ial=0,days=365;.
134d0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
134e0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
134f0 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42  30000000L..    B
13500 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c  IGNUM *bne = NUL
13510 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61  L;..    RSA *rsa
13520 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09   = NULL;.#else..
13530 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58      EVP_PKEY_CTX
13540 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65   *ctx = NULL;.#e
13550 6e 64 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28  ndif...    if ((
13560 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63  objc<5) || (objc
13570 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f  >6)) {...Tcl_Wro
13580 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
13590 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73  , 2, objv, "keys
135a0 69 7a 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74  ize keyfile cert
135b0 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09  file ?info?");..
135c0 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
135d0 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  R;..    }...    
135e0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
135f0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13600 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29  jv[2], &keysize)
13610 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09   != TCL_OK) {...
13620 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13630 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65  ;..    }..    ke
13640 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  yout=Tcl_GetStri
13650 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20  ng(objv[3]);..  
13660 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74    pemout=Tcl_Get
13670 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b  String(objv[4]);
13680 0a 09 20 20 20 20 69 66 20 28 69 73 53 74 72 29  ..    if (isStr)
13690 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28   {...Tcl_SetVar(
136a0 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22  interp,keyout,""
136b0 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61  ,0);...Tcl_SetVa
136c0 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
136d0 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  "",0);..    }...
136e0 20 20 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29      if (objc>=6)
136f0 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73   {...if (Tcl_Lis
13700 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
13710 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c  interp, objv[5],
13720 0a 09 09 09 26 6c 69 73 74 63 2c 20 26 6c 69 73  ....&listc, &lis
13730 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tv) != TCL_OK) {
13740 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
13750 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
13760 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d  if ((listc%2) !=
13770 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f   0) {...    Tcl_
13780 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
13790 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69  ,"Information li
137a0 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65  st must have eve
137b0 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  n number of argu
137c0 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09  ments",NULL);...
137d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
137e0 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20  RROR;...}...for 
137f0 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69  (i=0; i<listc; i
13800 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72  +=2) {...    str
13810 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
13820 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20  istv[i]);...    
13830 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13840 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09  days")==0) {....
13850 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
13860 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73  omObj(interp,lis
13870 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d  tv[i+1],&days)!=
13880 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
13890 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
138a0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
138b0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65   (strcmp(str,"se
138c0 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  rial")==0) {....
138d0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
138e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73  omObj(interp,lis
138f0 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29  tv[i+1],&serial)
13900 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20  !=TCL_OK)....   
13910 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13920 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  R;...    } else 
13930 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13940 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  C")==0) {....k_C
13950 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
13960 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
13970 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13980 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30  cmp(str,"ST")==0
13990 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f  ) {....k_ST=Tcl_
139a0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
139b0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
139c0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
139d0 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"L")==0) {...
139e0 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_L=Tcl_GetStri
139f0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13a00 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
13a10 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29  (strcmp(str,"O")
13a20 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63  ==0) {....k_O=Tc
13a30 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13a40 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13a50 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13a60 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b  (str,"OU")==0) {
13a70 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74  ....k_OU=Tcl_Get
13a80 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
13a90 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
13aa0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13ab0 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "CN")==0) {....k
13ac0 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _CN=Tcl_GetStrin
13ad0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
13ae0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13af0 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69  strcmp(str,"Emai
13b00 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45  l")==0) {....k_E
13b10 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69  mail=Tcl_GetStri
13b20 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
13b30 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
13b40 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
13b50 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20  interp,"Unknown 
13b60 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29  parameter",NULL)
13b70 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  ;....return TCL_
13b80 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09  ERROR;...    }..
13b90 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f  .}..    }..#if O
13ba0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13bb0 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13bc0 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42  00L..    bne = B
13bd0 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73  N_new();..    rs
13be0 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09  a = RSA_new();..
13bf0 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50      pkey = EVP_P
13c00 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20  KEY_new();..    
13c10 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20  if (bne == NULL 
13c20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c  || rsa == NULL |
13c30 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c  | pkey == NULL |
13c40 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62  | !BN_set_word(b
13c50 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09  ne,RSA_F4) ||...
13c60 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65  !RSA_generate_ke
13c70 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a  y_ex(rsa, keysiz
13c80 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c  e, bne, NULL) ||
13c90 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67   !EVP_PKEY_assig
13ca0 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29  n_RSA(pkey, rsa)
13cb0 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  ) {...EVP_PKEY_f
13cc0 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20  ree(pkey);.../* 
13cd0 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66  RSA_free(rsa); f
13ce0 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59  reed by EVP_PKEY
13cf0 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72  _free */...BN_fr
13d00 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09  ee(bne);.#else..
13d10 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52      pkey = EVP_R
13d20 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64  SA_gen((unsigned
13d30 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a   int) keysize);.
13d40 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50  .    ctx = EVP_P
13d50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79  KEY_CTX_new(pkey
13d60 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20  ,NULL);..    if 
13d70 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  (pkey == NULL ||
13d80 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   ctx == NULL || 
13d90 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e  !EVP_PKEY_keygen
13da0 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09  _init(ctx) ||...
13db0 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65  !EVP_PKEY_CTX_se
13dc0 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74  t_rsa_keygen_bit
13dd0 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20  s(ctx, keysize) 
13de0 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79  || !EVP_PKEY_key
13df0 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29  gen(ctx, &pkey))
13e00 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
13e10 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f  ee(pkey);...EVP_
13e20 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74  PKEY_CTX_free(ct
13e30 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c  x);.#endif...Tcl
13e40 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
13e50 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74  p,"Error generat
13e60 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22  ing private key"
13e70 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e  ,NULL);...return
13e80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
13e90 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28   } else {...if (
13ea0 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
13eb0 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
13ec0 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
13ed0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69  EM_write_bio_Pri
13ee0 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79  vateKey(out,pkey
13ef0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c  ,NULL,NULL,0,NUL
13f00 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69  L,NULL);...    i
13f10 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
13f20 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
13f30 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
13f40 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
13f50 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
13f60 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
13f70 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79  etVar(interp,key
13f80 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
13f90 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
13fa0 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
13fb0 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
13fc0 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
13fd0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
13fe0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
13ff0 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
14000 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20  ut,keyout);...  
14010 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
14020 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70  PrivateKey(out,p
14030 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c  key,NULL,NULL,0,
14040 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  NULL,NULL);...  
14050 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62    /* PEM_write_b
14060 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79  io_RSAPrivateKey
14070 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c  (out, rsa, NULL,
14080 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20   NULL, 0, NULL, 
14090 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20  NULL); */...    
140a0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
140b0 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28  );.. .}....if ((
140c0 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29  cert=X509_new())
140d0 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  ==NULL) {...    
140e0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
140f0 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65  terp,"Error gene
14100 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61  rating certifica
14110 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c  te request",NULL
14120 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
14130 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69  Y_free(pkey);.#i
14140 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
14150 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
14160 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f  00000L...    BN_
14170 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
14180 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 28 54  f...    return(T
14190 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d 0a 0a  CL_ERROR);...}..
141a0 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69  ..X509_set_versi
141b0 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53  on(cert,2);...AS
141c0 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58  N1_INTEGER_set(X
141d0 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75  509_get_serialNu
141e0 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61  mber(cert),seria
141f0 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d  l);...X509_gmtim
14200 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f  e_adj(X509_getm_
14210 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c  notBefore(cert),
14220 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d  0);...X509_gmtim
14230 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f  e_adj(X509_getm_
14240 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28  notAfter(cert),(
14250 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61  long)60*60*24*da
14260 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f  ys);...X509_set_
14270 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79  pubkey(cert,pkey
14280 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f  );....name=X509_
14290 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  get_subject_name
142a0 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f  (cert);....X509_
142b0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
142c0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20  y_txt(name,"C", 
142d0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
142e0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
142f0 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d  ar *) k_C, -1, -
14300 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
14310 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
14320 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d  txt(name,"ST", M
14330 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
14340 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
14350 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d  r *) k_ST, -1, -
14360 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
14370 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
14380 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42  txt(name,"L", MB
14390 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
143a0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
143b0 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c   *) k_L, -1, -1,
143c0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
143d0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
143e0 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54  t(name,"O", MBST
143f0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
14400 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
14410 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30  ) k_O, -1, -1, 0
14420 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14430 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14440 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52  name,"OU", MBSTR
14450 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
14460 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
14470 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30   k_OU, -1, -1, 0
14480 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
14490 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
144a0 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52  name,"CN", MBSTR
144b0 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
144c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
144d0 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30   k_CN, -1, -1, 0
144e0 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  );...X509_NAME_a
144f0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
14500 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42  name,"Email", MB
14510 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
14520 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
14530 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c   *) k_Email, -1,
14540 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39   -1, 0);....X509
14550 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d  _set_subject_nam
14560 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09  e(cert,name);...
14570 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28  .if (!X509_sign(
14580 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68  cert,pkey,EVP_sh
14590 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20  a256())) {...   
145a0 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29   X509_free(cert)
145b0 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59  ;...    EVP_PKEY
145c0 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
145d0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
145e0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
145f0 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66  0000L...    BN_f
14600 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
14610 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
14620 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
14630 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69  or signing certi
14640 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09  ficate",NULL);..
14650 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14660 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66  ERROR;...}....if
14670 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20   (isStr) {...   
14680 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
14690 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20  _s_mem());...   
146a0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58   PEM_write_bio_X
146b0 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09  509(out,cert);..
146c0 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
146d0 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
146e0 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
146f0 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
14700 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
14710 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
14720 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
14730 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72  rp,pemout,buffer
14740 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
14750 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
14760 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
14770 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
14780 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
14790 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
147a0 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
147b0 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29  name(out,pemout)
147c0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
147d0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
147e0 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  ert);...    BIO_
147f0 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09  free_all(out);..
14800 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28  .}....X509_free(
14810 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45  cert);...EVP_PKE
14820 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69  Y_free(pkey);.#i
14830 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
14840 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
14850 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65  00000L...BN_free
14860 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20  (bne);.#endif.. 
14870 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a     }..}..break;.
14880 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72      default:..br
14890 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  eak;.    }.    r
148a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
148b0 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
148c0 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  ntData;.}.../***
148d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
148e0 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
148f0 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
14900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
14910 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
14960 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
14970 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
14980 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
14990 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
149a0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
149b0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
149c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
149d0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
149e0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
149f0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
14a00 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
14a10 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
14a20 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
14a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
14a70 69 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72  id.Tls_Free(char
14a80 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20   *blockPtr) {.  
14a90 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
14aa0 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f  r = (State *)blo
14ab0 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69  ckPtr;..    dpri
14ac0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
14ad0 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74      Tls_Clean(st
14ae0 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66  atePtr);.    ckf
14af0 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d  ree(blockPtr);.}
14b00 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
14b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
14b50 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20  * Tls_Clean --. 
14b60 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
14b70 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68  ure cleans up wh
14b80 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20  en a SSL socket 
14b90 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a  based channel. *
14ba0 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69  .is closed and i
14bb0 74 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  ts reference cou
14bc0 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31  nt falls below 1
14bd0 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20  .  This should. 
14be0 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63  *.be called sync
14bf0 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65  hronously by the
14c00 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20   CloseProc, not 
14c10 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75  in the. *.Eventu
14c20 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63  allyFree callbac
14c30 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
14c40 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.none. *. * 
14c50 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14c60 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73  .Frees all the s
14c70 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tate. *. *------
14c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14cc0 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e  /.void Tls_Clean
14cd0 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
14ce0 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ) {.    dprintf(
14cf0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
14d00 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20  /*.     * we're 
14d10 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68  assuming here th
14d20 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d  at we're single-
14d30 74 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f  threaded.     */
14d40 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14d50 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c  r->timer != (Tcl
14d60 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c  _TimerToken) NUL
14d70 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65  L) {..Tcl_Delete
14d80 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61  TimerHandler(sta
14d90 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09  tePtr->timer);..
14da0 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
14db0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
14dc0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14dd0 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72  >protos) {..ckfr
14de0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ee(statePtr->pro
14df0 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  tos);..statePtr-
14e00 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
14e10 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
14e20 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09  atePtr->bio) {..
14e30 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c  /* This will cal
14e40 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20  l SSL_shutdown. 
14e50 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09  Bug 1414045 */..
14e60 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65  dprintf("BIO_fre
14e70 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74  e_all(%p)", stat
14e80 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f  ePtr->bio);..BIO
14e90 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50  _free_all(stateP
14ea0 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65  tr->bio);..state
14eb0 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b  Ptr->bio = NULL;
14ec0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14ed0 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
14ee0 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72  .dprintf("SSL_fr
14ef0 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ee(%p)", statePt
14f00 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72  r->ssl);..SSL_fr
14f10 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ee(statePtr->ssl
14f20 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73  );..statePtr->ss
14f30 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  l = NULL;.    }.
14f40 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14f50 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54  ->ctx) {..SSL_CT
14f60 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d  X_free(statePtr-
14f70 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72  >ctx);..statePtr
14f80 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->ctx = NULL;.  
14f90 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14fa0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20  ePtr->callback) 
14fb0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
14fc0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61  unt(statePtr->ca
14fd0 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50  llback);..stateP
14fe0 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e  tr->callback = N
14ff0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
15000 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  f (statePtr->pas
15010 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65  sword) {..Tcl_De
15020 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
15030 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
15040 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  .statePtr->passw
15050 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ord = NULL;.    
15060 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
15070 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c  tr->vcmd) {..Tcl
15080 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _DecrRefCount(st
15090 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
150a0 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
150b0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
150c0 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72    dprintf("Retur
150d0 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ning");.}.../*. 
150e0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
150f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15120 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 49  ----. *. * Tls_I
15130 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  nit --. *. *.Thi
15140 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69  s is a package i
15150 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
15160 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20 69  ocedure, which i
15170 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20 54  s called. *.by T
15180 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61 63  cl when this pac
15190 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61 64  kage is to be ad
151a0 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72 70  ded to an interp
151b0 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73  reter.. *. * Res
151c0 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66 69  ults:  Ssl confi
151d0 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65 64  gured and loaded
151e0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
151f0 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65 20  cts:. *. create 
15200 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 2c  the ssl command,
15210 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c 20   initialize ssl 
15220 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d 2d  context. *. *---
15230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15270 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
15280 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f  nt Tls_Init(Tcl_
15290 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
152a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
152b0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
152c0 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65  t[] = {.#include
152d0 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30 78   "tls.tcl.h"..0x
152e0 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 64  00.    };..    d
152f0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
15300 3b 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52  ;..#if TCL_MAJOR
15310 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 69 66  _VERSION > 8.#if
15320 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
15330 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e  S.    if (Tcl_In
15340 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
15350 22 39 2e 30 22 2c 20 30 29 20 3d 3d 20 4e 55 4c  "9.0", 0) == NUL
15360 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
15370 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
15380 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c  ndif.    if (Tcl
15390 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65  _PkgRequire(inte
153a0 72 70 2c 20 22 54 63 6c 22 2c 20 22 39 2e 30 2d  rp, "Tcl", "9.0-
153b0 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ", 0) == NULL) {
153c0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
153d0 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  OR;.    }.#else.
153e0 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53  #ifdef USE_TCL_S
153f0 54 55 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c  TUBS.    if (Tcl
15400 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72  _InitStubs(inter
15410 70 2c 20 22 38 2e 35 22 2c 20 30 29 20 3d 3d 20  p, "8.5", 0) == 
15420 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
15430 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15440 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28  .#endif.    if (
15450 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69  Tcl_PkgRequire(i
15460 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 22 38  nterp, "Tcl", "8
15470 2e 35 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c  .5-", 0) == NULL
15480 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
15490 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e  ERROR;.    }.#en
154a0 64 69 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73  dif..    if (Tls
154b0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
154c0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
154d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
154e0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
154f0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
15500 61 72 79 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ary", NULL);..re
15510 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15520 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
15530 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
15540 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6f  interp, "tls::co
15550 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e 65  nnection", Conne
15560 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 2c  ctionInfoObjCmd,
15570 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c   (ClientData) 0,
15580 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15590 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
155a0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
155b0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
155c0 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
155d0 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
155e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
155f0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15600 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15610 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15620 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15630 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49  "tls::import", I
15640 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
15650 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15660 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15670 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15680 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15690 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
156a0 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
156b0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
156c0 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65   0, (Tcl_CmdDele
156d0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
156e0 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
156f0 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
15700 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74  , "tls::unimport
15710 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
15720 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
15730 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  0, (Tcl_CmdDelet
15740 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15750 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15760 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15770 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20   "tls::status", 
15780 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43  StatusObjCmd, (C
15790 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54  lientData) 0, (T
157a0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
157b0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20   *) NULL);..    
157c0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
157d0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
157e0 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69 70  s::ciphers", Cip
157f0 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  hersObjCmd, (Cli
15800 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
15810 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
15820 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
15830 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15840 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15850 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
15860 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  ocolsObjCmd, (Cl
15870 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
15880 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15890 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
158a0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
158b0 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
158c0 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69  :version", Versi
158d0 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  onObjCmd, (Clien
158e0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
158f0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
15900 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
15910 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 69  DigestCommands(i
15920 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
15930 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15940 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64  (interp, "tls::d
15950 69 67 65 73 74 73 22 2c 20 44 69 67 65 73 74 4c  igests", DigestL
15960 69 73 74 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  istCmd, (ClientD
15970 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64  ata) 0, (Tcl_Cmd
15980 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15990 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  LL);..    if (in
159a0 74 65 72 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61  terp) {..Tcl_Eva
159b0 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c  l(interp, tlsTcl
159c0 49 6e 69 74 53 63 72 69 70 74 29 3b 0a 20 20 20  InitScript);.   
159d0 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
159e0 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
159f0 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41  terp, PACKAGE_NA
15a00 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53  ME, PACKAGE_VERS
15a10 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ION);.}../*. *--
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a50 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f  ----*. *. *.Tls_
15a60 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
15a70 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15aa0 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20  --*. *.Standard 
15ab0 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
15ac0 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a  ed by 'load'.. *
15ad0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69  .Initializes thi
15ae0 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20  s extension for 
15af0 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  a safe interpret
15b00 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  er.. *.---------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
15b40 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
15b50 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74  .As of 'Tls_Init
15b60 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  '. *. *.Result:.
15b70 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54   *..A standard T
15b80 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  cl error code.. 
15b90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
15bd0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
15be0 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49  s_SafeInit(Tcl_I
15bf0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b  nterp *interp) {
15c00 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
15c10 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  lled");.    retu
15c20 72 6e 28 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65  rn(Tls_Init(inte
15c30 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  rp));.}../*. *--
15c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c70 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c  ----*. *. *.TlsL
15c80 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  ibInit --. *. *.
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  *. *.Initializes
15cd0 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63   SSL library onc
15ce0 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f  e per applicatio
15cf0 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *.-----------
15d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d20 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
15d30 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69  e effects:. *..i
15d40 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
15d50 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73  ibrary. *. *.Res
15d60 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a  ult:. *..none. *
15d70 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73  ---------*. */.s
15db0 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62  tatic int TlsLib
15dc0 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69  Init(int uniniti
15dd0 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61  alize) {.    sta
15de0 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69  tic int initiali
15df0 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zed = 0;.    int
15e00 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b   status = TCL_OK
15e10 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ;.#if defined(OP
15e20 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15e30 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15e40 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f  READS).    size_
15e50 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e  t num_locks;.#en
15e60 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69  dif..    if (uni
15e70 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66  nitialize) {..if
15e80 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20   (!initialized) 
15e90 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
15ea0 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
15eb0 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72  alize, but we ar
15ec0 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  e not initialize
15ed0 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72  d");...    retur
15ee0 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09  n(TCL_OK);..}...
15ef0 64 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74  dprintf("Asked t
15f00 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29  o uninitialize")
15f10 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15f20 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15f30 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15f40 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74  HREADS)..Tcl_Mut
15f50 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
15f60 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b  ;...if (locks) {
15f70 0a 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73  ..    free(locks
15f80 29 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20  );..    locks = 
15f90 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73  NULL;..    locks
15fa0 43 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65  Count = 0;..}.#e
15fb0 6e 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65  ndif..initialize
15fc0 64 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69  d = 0;..#if defi
15fd0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15fe0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15ff0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
16000 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69  l_MutexUnlock(&i
16010 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
16020 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29  ..return(TCL_OK)
16030 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
16040 28 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  (initialized) {.
16050 09 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64  .dprintf("Called
16060 2c 20 62 75 74 20 75 73 69 6e 67 20 63 61 63 68  , but using cach
16070 65 64 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74  ed value");..ret
16080 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 20 20 20  urn(status);.   
16090 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
160a0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
160b0 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
160c0 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
160d0 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
160e0 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f  .    Tcl_MutexLo
160f0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
16100 6e 64 69 66 0a 20 20 20 20 69 6e 69 74 69 61 6c  ndif.    initial
16110 69 7a 65 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64  ized = 1;..#if d
16120 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54  efined(OPENSSL_T
16130 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e  HREADS) && defin
16140 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a  ed(TCL_THREADS).
16150 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20      num_locks = 
16160 31 3b 0a 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  1;.    locksCoun
16170 74 20 3d 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f  t = (int) num_lo
16180 63 6b 73 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d  cks;.    locks =
16190 20 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a   malloc(sizeof(*
161a0 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63  locks) * num_loc
161b0 6b 73 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ks);.    memset(
161c0 6c 6f 63 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66  locks, 0, sizeof
161d0 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c  (*locks) * num_l
161e0 6f 63 6b 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ocks);.#endif.. 
161f0 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
16200 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20   BOTH libcrypto 
16210 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20  and libssl. */. 
16220 20 20 20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f     OPENSSL_init_
16230 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ssl(OPENSSL_INIT
16240 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47  _LOAD_SSL_STRING
16250 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
16260 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52  _LOAD_CRYPTO_STR
16270 49 4e 47 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f  INGS..| OPENSSL_
16280 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50  INIT_ADD_ALL_CIP
16290 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  HERS | OPENSSL_I
162a0 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45  NIT_ADD_ALL_DIGE
162b0 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  STS, NULL);..   
162c0 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c   BIO_new_tcl(NUL
162d0 4c 2c 20 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20  L, 0);..#if 0.  
162e0 20 20 2f 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a    /*.     * XXX:
162f0 54 4f 44 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69  TODO: Remove thi
16300 73 20 63 6f 64 65 20 61 6e 64 20 72 65 70 6c 61  s code and repla
16310 63 65 20 69 74 20 77 69 74 68 20 61 20 63 68 65  ce it with a che
16320 63 6b 0a 20 20 20 20 20 2a 20 66 6f 72 20 65 6e  ck.     * for en
16330 6f 75 67 68 20 65 6e 74 72 6f 70 79 20 61 6e 64  ough entropy and
16340 20 64 6f 20 6e 6f 74 20 74 72 79 20 74 6f 20 63   do not try to c
16350 72 65 61 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20  reate our own.  
16360 20 20 20 2a 20 74 65 72 72 69 62 6c 65 20 65 6e     * terrible en
16370 74 72 6f 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20  tropy.     */.  
16380 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 65 64    /*.     * Seed
16390 20 74 68 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62   the random numb
163a0 65 72 20 67 65 6e 65 72 61 74 6f 72 20 69 6e 20  er generator in 
163b0 74 68 65 20 53 53 4c 20 6c 69 62 72 61 72 79 2c  the SSL library,
163c0 0a 20 20 20 20 20 2a 20 75 73 69 6e 67 20 74 68  .     * using th
163d0 65 20 64 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74  e do/while const
163e0 72 75 63 74 20 62 65 63 61 75 73 65 20 6f 66 20  ruct because of 
163f0 74 68 65 20 62 75 67 20 6e 6f 74 65 20 69 6e 20  the bug note in 
16400 74 68 65 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53  the.     * OpenS
16410 53 4c 20 46 41 51 20 61 74 20 68 74 74 70 3a 2f  SL FAQ at http:/
16420 2f 77 77 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67  /www.openssl.org
16430 2f 73 75 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d  /support/faq.htm
16440 6c 23 55 53 45 52 31 0a 20 20 20 20 20 2a 0a 20  l#USER1.     *. 
16450 20 20 20 20 2a 20 54 68 65 20 63 72 75 78 20 6f      * The crux o
16460 66 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73  f the problem is
16470 20 74 68 61 74 20 53 6f 6c 61 72 69 73 20 37 20   that Solaris 7 
16480 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61 0a  does not have a.
16490 20 20 20 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64       * /dev/rand
164a0 6f 6d 20 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64  om or /dev/urand
164b0 6f 6d 20 64 65 76 69 63 65 20 73 6f 20 69 74 20  om device so it 
164c0 63 61 6e 6e 6f 74 20 67 61 74 68 65 72 20 65 6e  cannot gather en
164d0 6f 75 67 68 0a 20 20 20 20 20 2a 20 65 6e 74 72  ough.     * entr
164e0 6f 70 79 20 66 72 6f 6d 20 74 68 65 20 52 41 4e  opy from the RAN
164f0 44 5f 73 65 65 64 28 29 20 77 68 65 6e 20 54 4c  D_seed() when TL
16500 53 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e  S initializes an
16510 64 20 72 65 66 75 73 65 73 0a 20 20 20 20 20 2a  d refuses.     *
16520 20 74 6f 20 67 6f 20 66 75 72 74 68 65 72 2e 20   to go further. 
16530 45 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73  Earlier versions
16540 20 6f 66 20 4f 70 65 6e 53 53 4c 20 63 61 72 72   of OpenSSL carr
16550 69 65 64 20 6f 6e 20 72 65 67 61 72 64 6c 65 73  ied on regardles
16560 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73  s..     */.    s
16570 72 61 6e 64 28 28 75 6e 73 69 67 6e 65 64 20 69  rand((unsigned i
16580 6e 74 29 20 74 69 6d 65 28 28 74 69 6d 65 5f 74  nt) time((time_t
16590 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20   *) NULL));.    
165a0 64 6f 20 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30  do {..for (i = 0
165b0 3b 20 69 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b  ; i < 16; i++) {
165c0 0a 09 20 20 20 20 72 6e 64 5f 73 65 65 64 5b 69  ..    rnd_seed[i
165d0 5d 20 3d 20 31 20 2b 20 28 63 68 61 72 29 20 28  ] = 1 + (char) (
165e0 32 35 35 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28  255.0 * rand()/(
165f0 52 41 4e 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a  RAND_MAX+1.0));.
16600 09 7d 0a 09 52 41 4e 44 5f 73 65 65 64 28 72 6e  .}..RAND_seed(rn
16610 64 5f 73 65 65 64 2c 20 73 69 7a 65 6f 66 28 72  d_seed, sizeof(r
16620 6e 64 5f 73 65 65 64 29 29 3b 0a 20 20 20 20 7d  nd_seed));.    }
16630 20 77 68 69 6c 65 20 28 52 41 4e 44 5f 73 74 61   while (RAND_sta
16640 74 75 73 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e  tus() != 1);.#en
16650 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  dif..#if defined
16660 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
16670 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
16680 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
16690 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
166a0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72  _mx);.#endif...r
166b0 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d  eturn(status);.}
166c0 0a                                               .