Hex Artifact Content

Artifact c4b8d40b2012ff6350302cbd39430494eb58d9353f775560a0ac9776270500f4:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e  h>.../* Min Open
03a0: 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23  SSL version */.#
03b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
03c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
03d0: 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72 20 22  101000L.#error "
03e0: 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e  Only OpenSSL v1.
03f0: 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69 73 20  1.1 or later is 
0400: 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e 64 69  supported".#endi
0410: 66 0a 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72  f.../*. * Forwar
0420: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20  d declarations. 
0430: 2a 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28  */..#define F2N(
0440: 6b 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28  key, dsp) \..(((
0450: 6b 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20  key) == NULL) ? 
0460: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20  (char *) NULL : 
0470: 5c 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74  \...Tcl_Translat
0480: 65 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70  eFileName(interp
0490: 2c 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29  , (key), (dsp)))
04a0: 0a 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58  ..static SSL_CTX
04b0: 20 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65   *CTX_Init(State
04c0: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
04d0: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
04e0: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a  oto, char *key,.
04f0: 09 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65  ..char *certfile
0500: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
0510: 2a 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67  *key_asn1, unsig
0520: 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61  ned char *cert_a
0530: 73 6e 31 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20  sn1,...Tcl_Size 
0540: 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63  key_asn1_len, Tc
0550: 6c 5f 53 69 7a 65 20 63 65 72 74 5f 61 73 6e 31  l_Size cert_asn1
0560: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61  _len, char *CApa
0570: 74 68 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65  th, char *CAfile
0580: 2c 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65 72  ,...char *cipher
0590: 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  s, char *ciphers
05a0: 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c  uites, int level
05b0: 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73  , char *DHparams
05c0: 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54  );..static int.T
05d0: 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
05e0: 69 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64  initialize);..#d
05f0: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
0600: 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69  SSL2..0x01.#defi
0610: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  ne TLS_PROTO_SSL
0620: 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20  3..0x02.#define 
0630: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09  TLS_PROTO_TLS1..
0640: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x04.#define TLS
0650: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78  _PROTO_TLS1_1.0x
0660: 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  08.#define TLS_P
0670: 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30  ROTO_TLS1_2.0x10
0680: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0690: 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23  TO_TLS1_3.0x20.#
06a0: 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66  define ENABLED(f
06b0: 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c  lag, mask).(((fl
06c0: 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d  ag) & (mask)) ==
06d0: 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e   (mask))..#defin
06e0: 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09  e SSLKEYLOGFILE.
06f0: 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22  ."SSLKEYLOGFILE"
0700: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53  ../*. * Thread-S
0710: 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f  afe TLS Code. */
0720: 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52  ..#ifdef TCL_THR
0730: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45  EADS.#define OPE
0740: 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49  NSSL_THREAD_DEFI
0750: 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  NES.#include <op
0760: 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e  enssl/opensslcon
0770: 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45  f.h>..#ifdef OPE
0780: 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e  NSSL_THREADS.#in
0790: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63  clude <openssl/c
07a0: 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  rypto.h>.#includ
07b0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68  e <openssl/ssl.h
07c0: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65  >../*. * Threade
07d0: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75  d operation requ
07e0: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c  ires locking cal
07f0: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20  lbacks. * Based 
0800: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79  from /crypto/cry
0810: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53  ptlib.c of OpenS
0820: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c  SL and NSOpenSSL
0830: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63  .. */..static Tc
0840: 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d  l_Mutex *locks =
0850: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e   NULL;.static in
0860: 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30  t locksCount = 0
0870: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74  ;.static Tcl_Mut
0880: 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64  ex init_mx;.#end
0890: 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48  if /* OPENSSL_TH
08a0: 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20  READS */.#endif 
08b0: 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a  /* TCL_THREADS *
08c0: 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..../**********
08d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43  **********/./* C
08e0: 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20  allbacks        
08f0: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43  ---. *. * Eval C
0960: 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20  allback Command 
0970: 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61  --. *. *.Eval ca
0980: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61  llback command a
0990: 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72  nd catch any err
09a0: 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ors. *. * Result
09b0: 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e  s:. *.0 = Comman
09c0: 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20  d returned fail 
09d0: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
09e0: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20   TCL_ERROR. *.1 
09f0: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  = Command return
0a00: 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76  ed success or ev
0a10: 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f  al returned TCL_
0a20: 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OK. *. * Side ef
0a30: 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61  fects:. *.Evalua
0a40: 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  tes callback com
0a50: 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  mand. *. *------
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0aa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61  /.static int.Eva
0ab0: 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e  lCallback(Tcl_In
0ac0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74  terp *interp, St
0ad0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54  ate *statePtr, T
0ae0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20  cl_Obj *cmdPtr) 
0af0: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  {.    int code, 
0b00: 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ok = 0;..    dpr
0b10: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
0b20: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0b30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
0b40: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
0b50: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
0b60: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
0b70: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
0b80: 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 63  llback with succ
0b90: 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65  ess for ok or re
0ba0: 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 61  turn value 1, fa
0bb0: 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20  il for error or 
0bc0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 2a  return value 0 *
0bd0: 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  /.    Tcl_ResetR
0be0: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
0bf0: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
0c00: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
0c10: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
0c20: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70  _GLOBAL);.    dp
0c30: 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c 62  rintf("EvalCallb
0c40: 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b  ack: %d", code);
0c50: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
0c60: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43   TCL_OK) {../* C
0c70: 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20  heck result for 
0c80: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
0c90: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74  .Tcl_Obj *result
0ca0: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
0cb0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66  ult(interp);..if
0cc0: 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c   (result == NULL
0cd0: 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
0ce0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65  omObj(interp, re
0cf0: 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43  sult, &ok) != TC
0d00: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20  L_OK) {..    ok 
0d10: 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66  = 1;..}..dprintf
0d20: 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f  ("Result: %d", o
0d30: 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  k);.    } else {
0d40: 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a  ../* Error - rej
0d50: 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63  ect the certific
0d60: 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  ate */..dprintf(
0d70: 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  "Tcl_BackgroundE
0d80: 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 4c  rror");.#if (TCL
0d90: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
0da0: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
0db0: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
0dc0: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
0dd0: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
0de0: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
0df0: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
0e00: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
0e10: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  if.    }..    Tc
0e20: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
0e30: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
0e40: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
0e50: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
0e60: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
0e70: 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn ok;.}.../*. *
0e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61  ---. *. * InfoCa
0ed0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
0ee0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e  Monitors SSL con
0ef0: 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a  nection process.
0f00: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0f10: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
0f20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
0f30: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
0f40: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d   defined). *. *-
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  --. */.static vo
0fa0: 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28  id.InfoCallback(
0fb0: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
0fc0: 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72  int where, int r
0fd0: 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  et) {.    State 
0fe0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
0ff0: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
1000: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29  data((SSL *)ssl)
1010: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
1020: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
1030: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
1040: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
1050: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
1060: 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b   *major, *minor;
1070: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1080: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
1090: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
10a0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
10b0: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
10c0: 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20  ..    if (where 
10d0: 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41  & SSL_CB_HANDSHA
10e0: 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a  KE_START) {..maj
10f0: 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22  or = "handshake"
1100: 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72  ;..minor = "star
1110: 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  t";.    } else i
1120: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1130: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45  B_HANDSHAKE_DONE
1140: 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61  ) {..major = "ha
1150: 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72  ndshake";..minor
1160: 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d   = "done";.    }
1170: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65   else {..if (whe
1180: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
1190: 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65  T)..major = "ale
11a0: 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  rt";..else if (w
11b0: 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f  here & SSL_ST_CO
11c0: 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22  NNECT).major = "
11d0: 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20  connect";..else 
11e0: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
11f0: 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f  ST_ACCEPT)..majo
1200: 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65  r = "accept";..e
1210: 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20  lse.....major = 
1220: 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20  "unknown";...if 
1230: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1240: 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22  READ)..minor = "
1250: 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20  read";..else if 
1260: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f  (where & SSL_CB_
1270: 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20  WRITE)..minor = 
1280: 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69  "write";..else i
1290: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12a0: 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d  B_LOOP)..minor =
12b0: 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69   "loop";..else i
12c0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12d0: 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d  B_EXIT)..minor =
12e0: 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09   "exit";..else..
12f0: 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e  ...minor = "unkn
1300: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1310: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1320: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
1330: 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c  fn, chan, major,
1340: 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 61 67 65 2c   minor, message,
1350: 20 61 6e 64 20 74 79 70 65 20 61 72 67 73 20 2a   and type args *
1360: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
1370: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1380: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1390: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
13a0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13b0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
13c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13d0: 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b  bj("info", -1));
13e0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13f0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1400: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1410: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1420: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
1430: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
1440: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
1450: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1460: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1470: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1480: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f  ewStringObj(majo
1490: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  r, -1));.    Tcl
14a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
14c0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
14d0: 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31  ingObj(minor, -1
14e0: 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65  ));..    if (whe
14f0: 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52  re & SSL_CB_ALER
1500: 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  T) {..Tcl_ListOb
1510: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1520: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1530: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1540: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64  gObj(SSL_alert_d
1550: 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  esc_string_long(
1560: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c  ret), -1));..Tcl
1570: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1580: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1590: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
15a0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
15b0: 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e  alert_type_strin
15c0: 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29  g_long(ret), -1)
15d0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
15e0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
15f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1600: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1610: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1620: 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
1630: 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29  _long(ssl), -1))
1640: 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  ;..Tcl_ListObjAp
1650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1660: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
1670: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e  NewStringObj("in
1680: 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d  fo", -1));.    }
1690: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
16a0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
16b0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
16c0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
16d0: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
16e0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
16f0: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
1700: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1710: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
1720: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73  ------. *. * Mes
1770: 73 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a  sageCallback --.
1780: 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53   *. *.Monitors S
1790: 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73  SL protocol mess
17a0: 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ages. *. * Resul
17b0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
17c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
17d0: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
17e0: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
17f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e  -------. */.#ifn
1840: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
1850: 53 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20  SL_TRACE.static 
1860: 76 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c  void.MessageCall
1870: 62 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70  back(int write_p
1880: 2c 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69  , int version, i
1890: 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c  nt content_type,
18a0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66   const void *buf
18b0: 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53  , size_t len, SS
18c0: 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72  L *ssl, void *ar
18d0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
18e0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
18f0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
1900: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
1910: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
1920: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
1930: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72  cmdPtr;.    char
1940: 20 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20   *ver, *type;.  
1950: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20    BIO *bio;.    
1960: 63 68 61 72 20 62 75 66 66 65 72 5b 33 30 30 30  char buffer[3000
1970: 30 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30  0];.    buffer[0
1980: 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69  ] = 0;..    dpri
1990: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
19a0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
19b0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
19c0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72  cl_Obj*)NULL)..r
19d0: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74  eturn;..    swit
19e0: 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69  ch(version) {.#i
19f0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
1a00: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
1a10: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
1a20: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
1a30: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
1a40: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73  NO_SSL2).    cas
1a50: 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a  e SSL2_VERSION:.
1a60: 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a  .ver = "SSLv2";.
1a70: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
1a80: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
1a90: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
1aa0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
1ab0: 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ).    case SSL3_
1ac0: 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20  VERSION:..ver = 
1ad0: 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b  "SSLv3";..break;
1ae0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
1af0: 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09   TLS1_VERSION:..
1b00: 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09  ver = "TLSv1";..
1b10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1b20: 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a  TLS1_1_VERSION:.
1b30: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22  .ver = "TLSv1.1"
1b40: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1b50: 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f  se TLS1_2_VERSIO
1b60: 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31  N:..ver = "TLSv1
1b70: 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  .2";..break;.   
1b80: 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52   case TLS1_3_VER
1b90: 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c  SION:..ver = "TL
1ba0: 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a  Sv1.3";..break;.
1bb0: 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72      case 0:..ver
1bc0: 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61   = "none";..brea
1bd0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1be0: 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  .ver = "unknown"
1bf0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  ;..break;.    }.
1c00: 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e  .    switch (con
1c10: 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20  tent_type) {.   
1c20: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45   case SSL3_RT_HE
1c30: 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48  ADER:..type = "H
1c40: 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a  eader";..break;.
1c50: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1c60: 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54  _INNER_CONTENT_T
1c70: 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e  YPE:..type = "In
1c80: 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65  ner Content Type
1c90: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1ca0: 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e  ase SSL3_RT_CHAN
1cb0: 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a  GE_CIPHER_SPEC:.
1cc0: 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20  .type = "Change 
1cd0: 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b  Cipher";..break;
1ce0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1cf0: 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d  T_ALERT:..type =
1d00: 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b   "Alert";..break
1d10: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1d20: 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74  RT_HANDSHAKE:..t
1d30: 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65  ype = "Handshake
1d40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1d50: 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c  ase SSL3_RT_APPL
1d60: 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74  ICATION_DATA:..t
1d70: 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22  ype = "App Data"
1d80: 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f 50  ;..break;.#if OP
1d90: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
1da0: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
1db0: 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53  0L.    case DTLS
1dc0: 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a  1_RT_HEARTBEAT:.
1dd0: 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65  .type = "Heartbe
1de0: 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  at";..break;.#en
1df0: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
1e00: 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77  ..type = "unknow
1e10: 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  n";.    }..    /
1e20: 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20  * Needs compile 
1e30: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61  time option "ena
1e40: 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20  ble-ssl-trace". 
1e50: 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20  */.    if ((bio 
1e60: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f  = BIO_new(BIO_s_
1e70: 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29  mem())) != NULL)
1e80: 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f   {..int n;..SSL_
1e90: 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76  trace(write_p, v
1ea0: 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f  ersion, content_
1eb0: 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20  type, buf, len, 
1ec0: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f  ssl, (void *)bio
1ed0: 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64  );..n = BIO_read
1ee0: 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49  (bio, buffer, BI
1ef0: 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c  O_pending(bio) <
1f00: 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e   15000 ? BIO_pen
1f10: 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39  ding(bio) : 1499
1f20: 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f  9);..n = (n<0) ?
1f30: 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b   0 : n;..buffer[
1f40: 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42  n] = 0;..(void)B
1f50: 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09  IO_flush(bio);..
1f60: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20  BIO_free(bio);. 
1f70: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
1f80: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
1f90: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
1fa0: 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72  , direction, ver
1fb0: 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20  sion, type, and 
1fc0: 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a  message args */.
1fd0: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
1fe0: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
1ff0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
2000: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2010: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2020: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2030: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2040: 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29  ("message", -1))
2050: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2060: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2070: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2080: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
2090: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
20a0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
20b0: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
20c0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69  NewStringObj(wri
2100: 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20  te_p ? "Sent" : 
2110: 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29  "Received", -1))
2120: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2130: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2140: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2150: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2160: 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ver, -1));.    T
2170: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2180: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2190: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
21a0: 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d  tringObj(type, -
21b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
21c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
21d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
21e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
21f0: 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
2200: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2210: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2220: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2230: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2240: 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b      EvalCallback
2250: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
2260: 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  r, cmdPtr);.    
2270: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2280: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64  (cmdPtr);.}.#end
2290: 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  if.../*. *------
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 2d 2d 0a 20 2a  -------------. *
22e0: 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61  . * VerifyCallba
22f0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
2300: 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69  tors SSL certifi
2310: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20  cate validation 
2320: 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f  process. Used to
2330: 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09   control the. *.
2340: 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68  behavior when th
2350: 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  e SSL_VERIFY_PEE
2360: 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54  R flag is set. T
2370: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a  his is called. *
2380: 09 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74  .whenever a cert
2390: 69 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65  ificate is inspe
23a0: 63 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20  cted or decided 
23b0: 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20  invalid. Called 
23c0: 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74  for. *.each cert
23d0: 69 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63  ificate in the c
23e0: 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a  ert chain.. *. *
23f0: 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68 65 20   Checks:. *.The 
2400: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
2410: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
2420: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
2430: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
2440: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2450: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2460: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2470: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2480: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2490: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
24a0: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
24b0: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
24c0: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
24d0: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
24e0: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24f0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2500: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
2510: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
2520: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
2530: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
2540: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2550: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2560: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2570: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2580: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2590: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
25a0: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
25b0: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
25c0: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
25d0: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
25e0: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25f0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
2600: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
2610: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
2620: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
2630: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
2640: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2650: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2660: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2670: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2680: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2690: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
26a0: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
26b0: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
26c0: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
26d0: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
26e0: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26f0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
2700: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2710: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
2720: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
2730: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2740: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2750: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2760: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2770: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2780: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2790: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
27a0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
27b0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
27c0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
27d0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
27e0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27f0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
2800: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
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 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2850: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2860: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2870: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2880: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2890: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
28a0: 20 53 53 4c 20 20 20 2a 73 73 6c 20 3d 20 28 53   SSL   *ssl = (S
28b0: 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f 43  SL*)X509_STORE_C
28c0: 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28 63  TX_get_ex_data(c
28d0: 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f 64  tx, SSL_get_ex_d
28e0: 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f 43  ata_X509_STORE_C
28f0: 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20 58  TX_idx());.    X
2900: 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58 35  509  *cert..= X5
2910: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2920: 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63 74  _current_cert(ct
2930: 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  x);.    State *s
2940: 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74 65  tatePtr.= (State
2950: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
2960: 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c  ta(ssl);.    Tcl
2970: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
2980: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
2990: 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70 74  rp;.    int dept
29a0: 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f  h..= X509_STORE_
29b0: 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64 65  CTX_get_error_de
29c0: 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69 6e  pth(ctx);.    in
29d0: 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53 54  t err..= X509_ST
29e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f  ORE_CTX_get_erro
29f0: 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70 72  r(ctx);..    dpr
2a00: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
2a10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2a20: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25 64 22  ifyCallback: %d"
2a30: 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66 20 28  , ok);..    if (
2a40: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
2a50: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
2a60: 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b 20 76  ) {../* Use ok v
2a70: 61 6c 75 65 20 69 66 20 76 65 72 69 66 69 63 61  alue if verifica
2a80: 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64  tion is required
2a90: 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65 50 74   */..if (statePt
2aa0: 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53 4c 5f  r->vflags & SSL_
2ab0: 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e  VERIFY_FAIL_IF_N
2ac0: 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09  O_PEER_CERT) {..
2ad0: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 0a 09      return ok;..
2ae0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65  } else {..    re
2af0: 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20 20 7d  turn 1;..}.    }
2b00: 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20 3d   else if (cert =
2b10: 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20 3d 3d  = NULL || ssl ==
2b20: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
2b30: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   0;.    }..    d
2b40: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61  printf("VerifyCa
2b50: 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63 61 6c  llback: eval cal
2b60: 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20 2f 2a  lback");..    /*
2b70: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
2b80: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
2b90: 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65   chan, depth, ce
2ba0: 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74  rt info list, st
2bb0: 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20  atus, and error 
2bc0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
2bd0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
2be0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
2bf0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
2c00: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c10: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2c20: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2c30: 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d  gObj("verify", -
2c40: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
2c50: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c60: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2c70: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
2c80: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
2c90: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
2ca0: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
2cb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2cc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2cd0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2ce0: 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29  ewIntObj(depth))
2cf0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2d00: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2d10: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2d20: 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e  ls_NewX509Obj(in
2d30: 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20  terp, cert));.  
2d40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2d50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2d60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2d70: 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20  ewIntObj(ok));. 
2d80: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2d90: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2da0: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c  rp, cmdPtr,..Tcl
2db0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
2dc0: 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79  har*)X509_verify
2dd0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
2de0: 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a  ng(err), -1));..
2df0: 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49      /* Prevent I
2e00: 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63  /O while callbac
2e10: 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73  k is in progress
2e20: 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65   */.    /* state
2e30: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
2e40: 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20  S_TCL_CALLBACK; 
2e50: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  */..    /* Eval 
2e60: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
2e70: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
2e80: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2e90: 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43  ;.    ok = EvalC
2ea0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
2eb0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
2ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2ed0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2ee0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ..    dprintf("V
2ef0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63  erifyCallback: c
2f00: 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20  ommand result = 
2f10: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f  %d", ok);..    /
2f20: 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  * statePtr->flag
2f30: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43  s &= ~(TLS_TCL_C
2f40: 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20  ALLBACK); */.   
2f50: 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20 42   return ok;./* B
2f60: 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65  y default, leave
2f70: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e   verification un
2f80: 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a  changed. */.}...
2f90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
2fe0: 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20  ls_Error --. *. 
2ff0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
3000: 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73 73   with error mess
3010: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  age.. *. * Side 
3020: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
3030: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
3040: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
3050: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
3060: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
3070: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
3080: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
3090: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
30a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
30f0: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61  id.Tls_Error(Sta
3100: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 6f  te *statePtr, co
3110: 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20 7b  nst char *msg) {
3120: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
3130: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
3140: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
3150: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 2c  Tcl_Obj *cmdPtr,
3160: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 75   *listPtr;.    u
3170: 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72 72  nsigned long err
3180: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
3190: 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20 20  err = msg;..    
31a0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
31b0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
31c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
31d0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
31e0: 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20  )..return;..    
31f0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3200: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3210: 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d 65 73  n, chan, and mes
3220: 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  sage args */.   
3230: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
3240: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
3250: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
3260: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3270: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3280: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3290: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 65  _NewStringObj("e
32a0: 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20 20  rror", -1));.   
32b0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
32c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32d0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
32e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
32f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
3300: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
3310: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69 66  f), -1));.    if
3320: 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20 7b   (msg != NULL) {
3330: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
3340: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3350: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c  ewStringObj(msg,
3370: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c   -1));..    } el
3380: 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54 63  se if ((msg = Tc
3390: 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63 6c 5f  l_GetString(Tcl_
33a0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
33b0: 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20  erp))) != NULL) 
33c0: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
33d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
33e0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
33f0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
3400: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
3410: 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20 3d  lse {..listPtr =
3420: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
3430: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c 65  0, NULL);..while
3440: 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65 74   ((err = ERR_get
3450: 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29 20  _error()) != 0) 
3460: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
3470: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3480: 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
3490: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
34a0: 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72 72  j(ERR_reason_err
34b0: 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20  or_string(err), 
34c0: 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69  -1));..}..Tcl_Li
34d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
34e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
34f0: 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  r, listPtr);.   
3500: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20   }..    /* Eval 
3510: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
3520: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
3530: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3540: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
3550: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
3560: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
3570: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
3580: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a  nt(cmdPtr);.}...
3590: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b  --------. *. * K
35e0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d 2d  eyLogCallback --
35f0: 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65 63  . *. *.Write rec
3600: 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20 74  eived key data t
3610: 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a 20  o log file.. *. 
3620: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
3630: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f 67  . */.void KeyLog
3690: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
36a0: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 63  SL *ssl, const c
36b0: 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20 20  har *line) {.   
36c0: 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65 74   char *str = get
36d0: 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  env(SSLKEYLOGFIL
36e0: 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66 64  E);.    FILE *fd
36f0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
3700: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
3710: 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d 20  f (str) {..fd = 
3720: 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29 3b  fopen(str, "a");
3730: 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22 25  ..fprintf(fd, "%
3740: 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c  s\n",line);..fcl
3750: 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a 7d  ose(fd);.    }.}
3760: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
37b0: 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c 62  * Password Callb
37c0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ack --. *. *.Cal
37d0: 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73 77  led when a passw
37e0: 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20 66 6f  ord is needed fo
37f0: 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79 20  r a private key 
3800: 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20 2a 09  when loading. *.
3810: 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50 45 4d  or storing a PEM
3820: 20 63 65 72 74 69 66 69 63 61 74 65 20 77 69 74   certificate wit
3830: 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76  h encryption. Ev
3840: 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20 2a 09  als callback. *.
3850: 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72  script and retur
3860: 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20 61 73  ns the result as
3870: 20 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74   the password st
3880: 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a  ring in buf.. *.
3890: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
38a0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
38b0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
38c0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
38d0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
38e0: 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72  urns:. *.Passwor
38f0: 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  d size in bytes 
3900: 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72  or -1 for an err
3910: 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  or.. *. *-------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3960: 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73  .static int.Pass
3970: 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61  wordCallback(cha
3980: 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65  r *buf, int size
3990: 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f  , int rwflag, vo
39a0: 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20  id *udata) {.   
39b0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
39c0: 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61  .= (State *) uda
39d0: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ta;.    Tcl_Inte
39e0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
39f0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
3a00: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
3a10: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
3a20: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c  ;.    Tcl_Size l
3a30: 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  en;..    dprintf
3a40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3a50: 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61   /* If no callba
3a60: 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 20  ck, use default 
3a70: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20  callback */.    
3a80: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
3a90: 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20  ssword == NULL) 
3aa0: 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45  {..if (Tcl_EvalE
3ab0: 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  x(interp, "tls::
3ac0: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54  password", -1, T
3ad0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20  CL_EVAL_GLOBAL) 
3ae0: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  == TCL_OK) {..  
3af0: 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63    char *ret = (c
3b00: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3b10: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3b20: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3b30: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 20 20  erp), &len);..  
3b40: 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c    if (len > (Tcl
3b50: 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b  _Size) size-1) {
3b60: 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69  ...len = (Tcl_Si
3b70: 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20 20 20  ze) size-1;..   
3b80: 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28   }..    strncpy(
3b90: 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f  buf, ret, (size_
3ba0: 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 62 75  t) len);..    bu
3bb0: 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09  f[len] = '\0';..
3bc0: 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29      return (int)
3bd0: 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a   len;..} else {.
3be0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
3bf0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
3c00: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
3c10: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
3c20: 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a   rwflag, and siz
3c30: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3c40: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3c50: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3c60: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20  ->password);.   
3c70: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3c80: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3c90: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3ca0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73  wStringObj("pass
3cb0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20  word", -1));.   
3cc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3cd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3ce0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3cf0: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29  wIntObj(rwflag))
3d00: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3d10: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3d20: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3d30: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a  cl_NewIntObj(siz
3d40: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  e));..    Tcl_Pr
3d50: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
3d60: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
3d70: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
3d80: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
3d90: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  Ptr);..    /* Ev
3da0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
3db0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
3dc0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
3dd0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
3de0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
3df0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
3e00: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
3e10: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
3e20: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
3e30: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
3e40: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
3e50: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
3e60: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
3e70: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
3e80: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
3e90: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
3ea0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
3eb0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
3ec0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3ed0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
3ee0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3ef0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3f00: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63  ;..    /* If suc
3f10: 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61  cessful, pass ba
3f20: 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 69  ck password stri
3f30: 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  ng and truncate 
3f40: 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20  if too long */. 
3f50: 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54     if (code == T
3f60: 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72 20 2a  CL_OK) {..char *
3f70: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3f80: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3f90: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3fa0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c  sult(interp), &l
3fb0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20  en);..if (len > 
3fc0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d  (Tcl_Size) size-
3fd0: 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20  1) {..    len = 
3fe0: 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d  (Tcl_Size) size-
3ff0: 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 62  1;..}..strncpy(b
4000: 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74  uf, ret, (size_t
4010: 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e  ) len);..buf[len
4020: 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52  ] = '\0';..Tcl_R
4030: 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61  elease((ClientDa
4040: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65  ta) interp);..re
4050: 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e 3b 0a  turn (int) len;.
4060: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65      }.    Tcl_Re
4070: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
4080: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
4090: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f  return -1;.}.../
40a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
40b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65  -------. *. * Se
40f0: 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66  ssion Callback f
4100: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4110: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20  . *.Called when 
4120: 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73  a new session is
4130: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61   added to the ca
4140: 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a  che. In TLS 1.3.
4150: 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72   *.this may be r
4160: 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65  eceived multiple
4170: 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65   times after the
4180: 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a   handshake. For.
4190: 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69   *.earlier versi
41a0: 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ons, this will b
41b0: 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e  e received durin
41c0: 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  g the handshake.
41d0: 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20  . *.This is the 
41e0: 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f  preferred way to
41f0: 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61   obtain a resuma
4200: 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a  ble session.. *.
4210: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
4220: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
4230: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
4240: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
4250: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
4260: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20  urn codes:. *.0 
4270: 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65  = error where se
4280: 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d  ssion will be im
4290: 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65  mediately remove
42a0: 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  d from the inter
42b0: 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20  nal cache.. *.1 
42c0: 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20  = success where 
42d0: 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73  app retains sess
42e0: 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63  ion in session c
42f0: 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63  ache, and must c
4300: 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  all SSL_SESSION_
4310: 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65  free() when done
4320: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4370: 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f  tatic int.Sessio
4380: 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73  nCallback(SSL *s
4390: 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  sl, SSL_SESSION 
43a0: 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20  *session) {.    
43b0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
43c0: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
43d0: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20  t_app_data((SSL 
43e0: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  *)ssl);.    Tcl_
43f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
4400: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
4410: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
4420: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  cmdPtr;.    cons
4430: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4440: 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e  *ticket;.    con
4450: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4460: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20   *session_id;.  
4470: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20    size_t len2;. 
4480: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
4490: 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ulen;..    dprin
44a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
44b0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
44c0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
44d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
44e0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
44f0: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
4500: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
4510: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4520: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4530: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
4540: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
4550: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
4560: 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 69 6f  fn, chan, sessio
4570: 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 74 69  n id, session ti
4580: 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 74 69  cket, and lifeti
4590: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  me args */.    c
45a0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
45b0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
45c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
45d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
45f0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4600: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
4610: 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  sion", -1));.   
4620: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4630: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4640: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
4650: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4660: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
4670: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
4680: 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  f), -1));..    /
4690: 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  * Session id */.
46a0: 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d      session_id =
46b0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
46c0: 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  _id(session, &ul
46d0: 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  en);.    Tcl_Lis
46e0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
46f0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4700: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
4710: 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64  ayObj(session_id
4720: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
4730: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73  n));..    /* Ses
4740: 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20  sion ticket */. 
4750: 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67     SSL_SESSION_g
4760: 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
4770: 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
4780: 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  n2);.    Tcl_Lis
4790: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
47a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
47b0: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
47c0: 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 54  ayObj(ticket, (T
47d0: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b  cl_Size) len2));
47e0: 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d  ..    /* Lifetim
47f0: 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  e - number of se
4800: 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c  conds */.    Tcl
4810: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4820: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4830: 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f  dPtr,..Tcl_NewLo
4840: 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c  ngObj((long) SSL
4850: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
4860: 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
4870: 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20  t(session)));.. 
4880: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
4890: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
48a0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
48b0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
48c0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
48d0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
48e0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
48f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
4900: 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  dPtr);..    /* R
4910: 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f 77 20  eturn 0 for now 
4920: 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 68 61  until session ha
4930: 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65  ndling is comple
4940: 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  te */.    return
4950: 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d   0;.}.../*. *---
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49a0: 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c  . *. * ALPN Call
49b0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
49c0: 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63   and NPN Callbac
49d0: 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d  k for Clients --
49e0: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70  . *. *.Perform p
49f0: 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e  rotocol (http/1.
4a00: 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29  1, h2, h3, etc.)
4a10: 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74   selection for t
4a20: 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63  he. *.incoming c
4a30: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65  onnection. Calle
4a40: 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e  d after Hello an
4a50: 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63  d server callbac
4a60: 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75  ks.. *.Where 'ou
4a70: 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70  t' is selected p
4a80: 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27  rotocol and 'in'
4a90: 20 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76   is the peer adv
4aa0: 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a  ertised list.. *
4ab0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
4ac0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
4ad0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
4ae0: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
4af0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65  efined). *. * Re
4b00: 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53  turn codes:. *.S
4b10: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4b20: 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  : ALPN protocol 
4b30: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
4b40: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
4b50: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
4b70: 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20  L: There was no 
4b80: 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20  overlap between 
4b90: 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09  the client's. *.
4ba0: 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73      supplied lis
4bb0: 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72  t and the server
4bc0: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
4bd0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  The connection w
4be0: 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a  ill be aborted..
4bf0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4c00: 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72  R_NOACK: ALPN pr
4c10: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
4c20: 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75  ted, e.g., becau
4c30: 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20  se no ALPN. *.  
4c40: 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20    protocols are 
4c50: 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74  configured for t
4c60: 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  his connection. 
4c70: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
4c80: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cd0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
4ce0: 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53  t.ALPNCallback(S
4cf0: 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75  SL *ssl, const u
4d00: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f  nsigned char **o
4d10: 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ut, unsigned cha
4d20: 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73  r *outlen,..cons
4d30: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4d40: 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  *in, unsigned in
4d50: 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  t inlen, void *a
4d60: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
4d70: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
4d80: 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c  te*)arg;.    Tcl
4d90: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09  _Interp *interp.
4da0: 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65  = statePtr->inte
4db0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  rp;.    Tcl_Obj 
4dc0: 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74  *cmdPtr;.    int
4dd0: 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20   code, res;..   
4de0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
4df0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c  ");..    if (ssl
4e00: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20   == NULL || arg 
4e10: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
4e20: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4e30: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4e40: 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72      /* Select pr
4e50: 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66  otocol */.    if
4e60: 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78   (SSL_select_nex
4e70: 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65  t_proto((unsigne
4e80: 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20  d char **) out, 
4e90: 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72  outlen, statePtr
4ea0: 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50  ->protos, stateP
4eb0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a  tr->protos_len,.
4ec0: 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f  .in, inlen) == O
4ed0: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54  PENSSL_NPN_NEGOT
4ee0: 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74  IATED) {../* Mat
4ef0: 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73  ch found */..res
4f00: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4f10: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4f20: 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e   {../* OPENSSL_N
4f30: 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20  PN_NO_OVERLAP = 
4f40: 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75  No overlap, so u
4f50: 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72  se first item fr
4f60: 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63  om client protoc
4f70: 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20  ol list */..res 
4f80: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4f90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4fa0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
4fb0: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
4fc0: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4fd0: 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20  rn res;.    }.. 
4fe0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4ff0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
5000: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74  h fn, chan, dept
5010: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73  h, cert info lis
5020: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65  t, status, and e
5030: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20  rror args */.   
5040: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
5050: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
5060: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
5070: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5080: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5090: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
50a0: 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22  StringObj("alpn"
50b0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
50c0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
50d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
50e0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
50f0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5100: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5110: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5120: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5130: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5140: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5150: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5160: 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  bj((const char *
5170: 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20  ) *out, -1));.  
5180: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5190: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
51a0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
51b0: 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73  ewBooleanObj(res
51c0: 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45   == SSL_TLSEXT_E
51d0: 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a  RR_OK));..    /*
51e0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
51f0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
5200: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
5210: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  mdPtr);.    if (
5220: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c  (code = EvalCall
5230: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
5240: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20  tePtr, cmdPtr)) 
5250: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  > 1) {..res = SS
5260: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5270: 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  CK;.    } else i
5280: 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a  f (code == 1) {.
5290: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
52a0: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
52b0: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
52c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
52d0: 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a  RT_FATAL;.    }.
52e0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
52f0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5300: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
5310: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
5360: 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f   Advertise Proto
5370: 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f  cols Callback fo
5380: 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20  r Next Protocol 
5390: 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e  Negotiation (NPN
53a0: 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f  ) in ServerHello
53b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64   --. *. *.called
53c0: 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72 76   when a TLS serv
53d0: 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74 20  er needs a list 
53e0: 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 72 6f  of supported pro
53f0: 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a  tocols for Next.
5400: 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f   *.Protocol Nego
5410: 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  tiation.. *. * R
5420: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
5430: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
5440: 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ts:. *. * Return
5450: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54   codes:. *.SSL_T
5460: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50  LSEXT_ERR_OK: NP
5470: 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  N protocol selec
5480: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5490: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
54a0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
54b0: 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74  _NOACK: NPN prot
54c0: 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65  ocol not selecte
54d0: 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  d. The connectio
54e0: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a  n continues.. *.
54f0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66  -----. */.#ifdef
5540: 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20   USE_NPN.static 
5550: 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28  int.NPNCallback(
5560: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
5570: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
5580: 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67  har **out, unsig
5590: 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c  ned int *outlen,
55a0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
55b0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
55c0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
55d0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
55e0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
55f0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
5600: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
5610: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5620: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5630: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
5640: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a  protocols list *
5650: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  /.    if (stateP
5660: 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55  tr->protos != NU
5670: 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74  LL) {..*out = st
5680: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a  atePtr->protos;.
5690: 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 65  .*outlen = state
56a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b  Ptr->protos_len;
56b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a  .    } else {..*
56c0: 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75  out = NULL;..*ou
56d0: 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72  tlen = 0;..retur
56e0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
56f0: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  _NOACK;.    }.  
5700: 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53    return SSL_TLS
5710: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65  EXT_ERR_OK;.}.#e
5720: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5770: 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61   *. * SNI Callba
5780: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d  ck for Servers -
5790: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20  -. *. *.Perform 
57a0: 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20  server-side SNI 
57b0: 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69  hostname selecti
57c0: 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 69  on after receivi
57d0: 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e  ng SNI extension
57e0: 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 65  . *.in Client He
57f0: 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 65  llo. Called afte
5800: 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b  r hello callback
5810: 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e   but before ALPN
5820: 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
5830: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5840: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5850: 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63  ects:. *.Calls c
5860: 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69  allback (if defi
5870: 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72  ned). *. * Retur
5880: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
5890: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53  TLSEXT_ERR_OK: S
58a0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  NI hostname is a
58b0: 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e  ccepted. The con
58c0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
58d0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
58e0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
58f0: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5900: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20  s not accepted. 
5910: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  The connection. 
5920: 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64  *.    is aborted
5930: 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c  . Default for al
5940: 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e  ert is SSL_AD_UN
5950: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e  RECOGNIZED_NAME.
5960: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
5970: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
5980: 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69  : SNI hostname i
5990: 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20  s not accepted, 
59a0: 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a  warning alert. *
59b0: 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 73  .    sent (not s
59c0: 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 76  upported in TLSv
59d0: 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63  1.3). The connec
59e0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
59f0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5a00: 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73  R_NOACK: SNI hos
5a10: 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63  tname is not acc
5a20: 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63  epted and not ac
5a30: 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20  knowledged,. *. 
5a40: 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68     e.g. if SNI h
5a50: 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66  as not been conf
5a60: 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e  igured. The conn
5a70: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5a80: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
5a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
5ad0: 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c  tatic int.SNICal
5ae0: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
5af0: 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74  *ssl, int *alert
5b00: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
5b10: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
5b20: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
5b30: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
5b40: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
5b50: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
5b60: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
5b70: 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  ;.    int code, 
5b80: 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  res;.    const c
5b90: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20  har *servername 
5ba0: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72  = NULL;..    dpr
5bb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
5bc0: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
5bd0: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
5be0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5bf0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5c00: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
5c10: 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  /* Only works fo
5c20: 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61  r TLS 1.2 and ea
5c30: 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72  rlier */.    ser
5c40: 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65  vername = SSL_ge
5c50: 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
5c60: 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
5c70: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20  E_host_name);.  
5c80: 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d    if (!servernam
5c90: 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b  e || servername[
5ca0: 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72  0] == '\0') {..r
5cb0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5cc0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5cd0: 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
5ce0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
5cf0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
5d00: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5d10: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  T_ERR_OK;.    }.
5d20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
5d30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
5d40: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e  ith fn, chan, an
5d50: 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72  d server name ar
5d60: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
5d70: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
5d80: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
5d90: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
5da0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5db0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5dc0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5dd0: 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a  bj("sni", -1));.
5de0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5df0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5e00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
5e10: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
5e20: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
5e30: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
5e40: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
5e50: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5e60: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5e70: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5e80: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65  wStringObj(serve
5e90: 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20  rname , -1));.. 
5ea0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
5eb0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
5ec0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
5ed0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
5ee0: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
5ef0: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
5f00: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
5f10: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
5f20: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5f30: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b  R_ALERT_WARNING;
5f40: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41  ..*alert = SSL_A
5f50: 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e  D_UNRECOGNIZED_N
5f60: 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70  AME; /* Not supp
5f70: 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33  orted by TLS 1.3
5f80: 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   */.    } else i
5f90: 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a  f (code == 1) {.
5fa0: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
5fb0: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
5fc0: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
5fd0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5fe0: 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72  RT_FATAL;..*aler
5ff0: 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43  t = SSL_AD_UNREC
6000: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a  OGNIZED_NAME; /*
6010: 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62   Not supported b
6020: 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  y TLS 1.3 */.   
6030: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
6040: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
6050: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
6060: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
6070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
60b0: 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  . * ClientHello 
60c0: 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61  Handshake Callba
60d0: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d  ck for Servers -
60e0: 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20  -. *. *.Used by 
60f0: 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e  server to examin
6100: 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  e the server nam
6110: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
6120: 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  I) extension. *.
6130: 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20  provided by the 
6140: 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20  client in order 
6150: 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70  to select an app
6160: 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69  ropriate certifi
6170: 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65  cate to. *.prese
6180: 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68  nt, and make oth
6190: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
61a0: 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c   adjustments rel
61b0: 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65  evant to that se
61c0: 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64  rver. *.name and
61d0: 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69   its configurati
61e0: 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65  on. This include
61f0: 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74  s swapping out t
6200: 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a  he associated. *
6210: 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72  .SSL_CTX pointer
6220: 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  , modifying the 
6230: 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66  server's list of
6240: 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76   permitted TLS v
6250: 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e  ersions,. *.chan
6260: 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27  ging the server'
6270: 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e  s cipher list in
6280: 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65   response to the
6290: 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72   client's cipher
62a0: 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43   list, etc.. *.C
62b0: 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49  alled before SNI
62c0: 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61   and ALPN callba
62d0: 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cks.. *. * Resul
62e0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
62f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6300: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
6310: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
6320: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
6330: 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  s:. *.SSL_CLIENT
6340: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75  _HELLO_RETRY: su
6350: 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68  spend the handsh
6360: 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e  ake, and the han
6370: 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20  dshake function 
6380: 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65  will return imme
6390: 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43  diately. *.SSL_C
63a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
63b0: 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d  R: failure, term
63c0: 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  inate connection
63d0: 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65  . Set alert to e
63e0: 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53  rror code.. *.SS
63f0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
6400: 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a  UCCESS: success.
6410: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
6460: 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c  tic int.HelloCal
6470: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20  lback(SSL *ssl, 
6480: 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64  int *alert, void
6490: 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61   *arg) {.    Sta
64a0: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
64b0: 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20  State*)arg;.    
64c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
64d0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
64e0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
64f0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
6500: 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20  int code, res;. 
6510: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
6520: 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63  ervername;.    c
6530: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
6540: 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f  ar *p;.    size_
6550: 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67  t len, remaining
6560: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
6570: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
6580: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
6590: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
65a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
65b0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
65c0: 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65  SUCCESS;.    } e
65d0: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28  lse if (ssl == (
65e0: 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c  const SSL *)NULL
65f0: 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64   || arg == (void
6600: 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75   *)NULL) {..retu
6610: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6620: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6630: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d  ..    /* Get nam
6640: 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53  es */.    if (!S
6650: 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  SL_client_hello_
6660: 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c  get0_ext(ssl, TL
6670: 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72  SEXT_TYPE_server
6680: 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61  _name, &p, &rema
6690: 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e  ining) || remain
66a0: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
66b0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
66c0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
66d0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
66e0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
66f0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6700: 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74  ..    /* Extract
6710: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
6720: 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74  he supplied list
6730: 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20   of names. */.  
6740: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
6750: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
6760: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
6770: 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d   (len + 2 != rem
6780: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72  aining) {..*aler
6790: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
67a0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
67b0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
67c0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
67d0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
67e0: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
67f0: 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20  en;..    /* The 
6800: 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65  list in practice
6810: 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67   only has a sing
6820: 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77  le element, so w
6830: 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20  e only consider 
6840: 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a  the first one. *
6850: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6860: 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b  ing == 0 || *p++
6870: 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54   != TLSEXT_NAMET
6880: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b  YPE_host_name) {
6890: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
68a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
68b0: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65  ERNAL_ERROR;..re
68c0: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
68d0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
68e0: 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67   }.    remaining
68f0: 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20  --;..    /* Now 
6900: 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70  we can finally p
6910: 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65  ull out the byte
6920: 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
6930: 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e  actual hostname.
6940: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
6950: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
6960: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6970: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6980: 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72  AL_ERROR;..retur
6990: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
69a0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
69b0: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
69c0: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
69d0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
69e0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65  if (len + 2 > re
69f0: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6a00: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6a10: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6a20: 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53  ERROR;..return S
6a30: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6a40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6a50: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
6a60: 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65  ;.    servername
6a70: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
6a80: 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  )p;..    /* Crea
6a90: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
6aa0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
6ab0: 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d  , and server nam
6ac0: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
6ad0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
6ae0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
6af0: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c  ->vcmd);.    Tcl
6b00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
6b10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
6b20: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
6b30: 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20  ingObj("hello", 
6b40: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
6b50: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6b60: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
6b70: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
6b80: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
6b90: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
6ba0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
6bb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
6bc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
6bd0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
6be0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6bf0: 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54 63  (servername, (Tc
6c00: 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a  l_Size) len));..
6c10: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
6c20: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
6c30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
6c40: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
6c50: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
6c60: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
6c70: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
6c80: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
6c90: 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  s = SSL_CLIENT_H
6ca0: 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c  ELLO_RETRY;..*al
6cb0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6cc0: 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e  1_ALERT_USER_CAN
6cd0: 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c  CELLED;.    } el
6ce0: 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31  se if (code == 1
6cf0: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  ) {..res = SSL_C
6d00: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
6d10: 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ESS;.    } else 
6d20: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49  {..res = SSL_CLI
6d30: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6d40: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6d50: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54  _TLSV1_ALERT_INT
6d60: 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  ERNAL_ERROR;.   
6d70: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
6d80: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
6d90: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b  .    return res;
6da0: 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43  **********/./* C
6dc0: 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20  ommands         
6dd0: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
6de0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
6df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e30: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
6e40: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
6e50: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
6e60: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
6e70: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
6e80: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
6e90: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
6ea0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
6eb0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
6ec0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
6ed0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
6ee0: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
6ef0: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
6f00: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
6f10: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
6f20: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
6f30: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6f80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
6f90: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
6fa0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
6fb0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
6fc0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
6fd0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
6fe0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
6ff0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
7000: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
7010: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
7020: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
7030: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
7040: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
7050: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
7060: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
7070: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
7080: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
7090: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
70a0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28  t err = 0;.    (
70b0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
70c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
70d0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
70e0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
70f0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
7100: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
7110: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
7120: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7130: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
7140: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
7150: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
7160: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
7170: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
7180: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
7190: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
71a0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
71b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
71c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
71d0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
71e0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
71f0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
7200: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
7210: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
7220: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
7230: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
7240: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
7250: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
7260: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
7270: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
7280: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
7290: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
72a0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
72b0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
72c0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
72d0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
72e0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
72f0: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53  p, "TLS", "HANDS
7300: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22  HAKE", "CHANNEL"
7310: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
7320: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
7330: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7340: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
7350: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
7360: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
7370: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
7380: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7390: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
73a0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20  rConnect");.    
73b0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f  ret = Tls_WaitFo
73c0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
73d0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20  r, &err, 1);.   
73e0: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
73f0: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
7400: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29  urned: %i", ret)
7410: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c  ;..    if (ret <
7420: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72   0 && ((statePtr
7430: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
7440: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72  L_ASYNC) && (err
7450: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a   == EAGAIN))) {.
7460: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20  .dprintf("Async 
7470: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41  set and err = EA
7480: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30  GAIN");..ret = 0
7490: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
74a0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e  (ret < 0) {..lon
74b0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74  g result;..errSt
74c0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72  r = statePtr->er
74d0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73  r;..Tcl_ResetRes
74e0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63  ult(interp);..Tc
74f0: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
7500: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c  ...if (!errStr |
7510: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  | (*errStr == 0)
7520: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20  ) {..    errStr 
7530: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  = Tcl_PosixError
7540: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54  (interp);..}...T
7550: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7560: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61  interp, "handsha
7570: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72  ke failed: ", er
7580: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e  rStr, (char *) N
7590: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75  ULL);..if ((resu
75a0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  lt = SSL_get_ver
75b0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
75c0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35  Ptr->ssl)) != X5
75d0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20  09_V_OK) {..    
75e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
75f0: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74  (interp, " due t
7600: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69  o \"", X509_veri
7610: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
7620: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c  ring(result), "\
7630: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
7640: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45  L);..}..Tcl_SetE
7650: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
7660: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
7670: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
7680: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
7690: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
76a0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
76b0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
76c0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
76d0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
76e0: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ROR;.    } else 
76f0: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  {..if (err != 0)
7700: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
7710: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69  "Got an error wi
7720: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68  th a completed h
7730: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20  andshake: err = 
7740: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72  %i", err);..}..r
7750: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  et = 1;.    }.. 
7760: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
7770: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74  rning TCL_OK wit
7780: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20  h data \"%i\"", 
7790: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ret);.    Tcl_Se
77a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
77b0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
77c0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75  (ret));.    retu
77d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
77e0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
77f0: 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 5b 5d  *command_opts []
7800: 20 3d 20 7b 0a 20 20 20 20 22 2d 61 6c 70 6e 22   = {.    "-alpn"
7810: 2c 20 22 2d 63 61 64 69 72 22 2c 20 22 2d 63 61  , "-cadir", "-ca
7820: 66 69 6c 65 22 2c 20 22 2d 63 65 72 74 22 2c 20  file", "-cert", 
7830: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 22 2d 63  "-certfile", "-c
7840: 69 70 68 65 72 22 2c 20 22 2d 63 69 70 68 65 72  ipher", "-cipher
7850: 73 22 2c 20 22 2d 63 69 70 68 65 72 73 75 69 74  s", "-ciphersuit
7860: 65 73 22 2c 0a 20 20 20 20 22 2d 63 6f 6d 6d 61  es",.    "-comma
7870: 6e 64 22 2c 20 22 2d 64 68 70 61 72 61 6d 73 22  nd", "-dhparams"
7880: 2c 20 22 2d 6b 65 79 22 2c 20 22 2d 6b 65 79 66  , "-key", "-keyf
7890: 69 6c 65 22 2c 20 22 2d 6d 6f 64 65 6c 22 2c 20  ile", "-model", 
78a0: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 22 2d 70  "-password", "-p
78b0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 0a  ost_handshake",.
78c0: 20 20 20 20 22 2d 72 65 71 75 65 73 74 22 2c 20      "-request", 
78d0: 22 2d 72 65 71 75 69 72 65 22 2c 20 22 2d 73 65  "-require", "-se
78e0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 22  curity_level", "
78f0: 2d 73 65 72 76 65 72 22 2c 20 22 2d 73 65 72 76  -server", "-serv
7900: 65 72 6e 61 6d 65 22 2c 20 22 2d 73 65 73 73 69  ername", "-sessi
7910: 6f 6e 5f 69 64 22 2c 20 22 2d 73 73 6c 32 22 2c  on_id", "-ssl2",
7920: 0a 20 20 20 20 22 2d 73 73 6c 33 22 2c 20 22 2d  .    "-ssl3", "-
7930: 74 6c 73 31 22 2c 20 22 2d 74 6c 73 31 2e 31 22  tls1", "-tls1.1"
7940: 2c 20 22 2d 74 6c 73 31 2e 32 22 2c 20 22 2d 74  , "-tls1.2", "-t
7950: 6c 73 31 2e 33 22 2c 20 22 2d 76 61 6c 69 64 61  ls1.3", "-valida
7960: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 76 63  tecommand", "-vc
7970: 6d 64 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75  md", NULL};..enu
7980: 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20  m _command_opts 
7990: 7b 0a 20 20 20 20 5f 6f 70 74 5f 61 6c 70 6e 2c  {.    _opt_alpn,
79a0: 20 5f 6f 70 74 5f 63 61 64 69 72 2c 20 5f 6f 70   _opt_cadir, _op
79b0: 74 5f 63 61 66 69 6c 65 2c 20 5f 6f 70 74 5f 63  t_cafile, _opt_c
79c0: 65 72 74 2c 20 5f 6f 70 74 5f 63 65 72 74 66 69  ert, _opt_certfi
79d0: 6c 65 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 2c  le, _opt_cipher,
79e0: 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 2c 0a 20   _opt_ciphers,. 
79f0: 20 20 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 75     _opt_ciphersu
7a00: 69 74 65 2c 20 5f 6f 70 74 5f 63 6d 64 2c 20 5f  ite, _opt_cmd, _
7a10: 6f 70 74 5f 64 68 70 61 72 61 6d 73 2c 20 5f 6f  opt_dhparams, _o
7a20: 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f 6b 65 79  pt_key, _opt_key
7a30: 66 69 6c 65 2c 20 5f 6f 70 74 5f 6d 6f 64 65 6c  file, _opt_model
7a40: 2c 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 2c  , _opt_password,
7a50: 0a 20 20 20 20 5f 6f 70 74 5f 68 61 6e 64 73 68  .    _opt_handsh
7a60: 61 6b 65 2c 20 5f 6f 70 74 5f 72 65 71 75 65 73  ake, _opt_reques
7a70: 74 2c 20 5f 6f 70 74 5f 72 65 71 75 69 72 65 2c  t, _opt_require,
7a80: 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f 6c   _opt_security_l
7a90: 65 76 65 6c 2c 20 5f 6f 70 74 5f 73 65 72 76 65  evel, _opt_serve
7aa0: 72 2c 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e 61  r, _opt_serverna
7ab0: 6d 65 2c 0a 20 20 20 20 5f 6f 70 74 5f 73 65 73  me,.    _opt_ses
7ac0: 73 69 6f 6e 5f 69 64 2c 20 5f 6f 70 74 5f 73 73  sion_id, _opt_ss
7ad0: 6c 32 2c 20 5f 6f 70 74 5f 73 73 6c 33 2c 20 5f  l2, _opt_ssl3, _
7ae0: 6f 70 74 5f 74 6c 73 31 2c 20 5f 6f 70 74 5f 74  opt_tls1, _opt_t
7af0: 6c 73 31 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 32  ls11, _opt_tls12
7b00: 2c 20 5f 6f 70 74 5f 74 6c 73 31 33 2c 0a 20 20  , _opt_tls13,.  
7b10: 20 20 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 2c    _opt_validate,
7b20: 20 5f 6f 70 74 5f 76 63 6d 64 0a 7d 3b 0a 0a 2f   _opt_vcmd.};../
7b30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
7b80: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
7b90: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
7ba0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
7bb0: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
7bc0: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
7bd0: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
7be0: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
7bf0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
7c00: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
7c10: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
7c20: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
7c30: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
7c40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
7c50: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
7c60: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
7c70: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
7cd0: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
7ce0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
7cf0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
7d00: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
7d10: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
7d20: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
7d30: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
7d40: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
7d50: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
7d60: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
7d70: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
7d80: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
7d90: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
7da0: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7db0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
7dc0: 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 09 09 3d  l_Obj *cmdObj..=
7dd0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
7de0: 62 6a 20 2a 70 61 73 73 77 64 4f 62 6a 09 09 3d  bj *passwdObj..=
7df0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
7e00: 62 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c  bj *vcmd..= NULL
7e10: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
7e20: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  g upperChannelTr
7e30: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72  anslation, upper
7e40: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c  ChannelBlocking,
7e50: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63   upperChannelEnc
7e60: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  oding, upperChan
7e70: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20  nelEOFChar;.    
7e80: 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c  int idx;.    Tcl
7e90: 5f 53 69 7a 65 20 66 6e 2c 20 6c 65 6e 3b 0a 20  _Size fn, len;. 
7ea0: 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 09 3d     int flags...=
7eb0: 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20   TLS_TCL_INIT;. 
7ec0: 20 20 20 69 6e 74 20 73 65 72 76 65 72 09 09 09     int server...
7ed0: 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65  = 0;./* is conne
7ee0: 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f  ction incoming o
7ef0: 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20  r outgoing? */. 
7f00: 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65     char *keyfile
7f10: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
7f20: 61 72 20 2a 63 65 72 74 66 69 6c 65 09 09 3d 20  ar *certfile..= 
7f30: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e  NULL;.    unsign
7f40: 65 64 20 63 68 61 72 20 2a 6b 65 79 09 09 3d 20  ed char *key..= 
7f50: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
7f60: 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d 20 30 3b  ze key_len..= 0;
7f70: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
7f80: 61 72 20 2a 63 65 72 74 09 09 3d 20 4e 55 4c 4c  ar *cert..= NULL
7f90: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
7fa0: 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20  ert_len..= 0;.  
7fb0: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09    char *ciphers.
7fc0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
7fd0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 09  r *ciphersuites.
7fe0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
7ff0: 72 20 2a 43 41 66 69 6c 65 09 09 3d 20 4e 55 4c  r *CAfile..= NUL
8000: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 70  L;.    char *CAp
8010: 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ath..= NULL;.   
8020: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09   char *DHparams.
8030: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
8040: 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c  r *model...= NUL
8050: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72  L;.    char *ser
8060: 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b  vername..= NULL;
8070: 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72  ./* hostname for
8080: 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64   Server Name Ind
8090: 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ication */.    c
80a0: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
80b0: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d  ar *session_id =
80c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
80d0: 69 7a 65 20 73 65 73 73 5f 6c 65 6e 09 09 3d 20  ize sess_len..= 
80e0: 30 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  0;.    Tcl_Obj *
80f0: 61 6c 70 6e 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b  alpnObj..= NULL;
8100: 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20  .    int ssl2 = 
8110: 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20  0, ssl3 = 0;.   
8120: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74   int tls1 = 1, t
8130: 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_1 = 1, tls1_
8140: 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20  2 = 1, tls1_3 = 
8150: 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f  1;.    int proto
8160: 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31   = 0, level = -1
8170: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79  ;.    int verify
8180: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20   = 0, require = 
8190: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20  0, request = 1, 
81a0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d  post_handshake =
81b0: 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63   0;.    (void) c
81c0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
81d0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
81e0: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
81f0: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
8200: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8210: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
8220: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
8230: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
8240: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
8250: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
8260: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23     tls1_1 = 0;.#
8270: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
8280: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
8290: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
82a0: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74  NO_TLS1_2).    t
82b0: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_2 = 0;.#endi
82c0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
82d0: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
82e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
82f0: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_3).    tls1_
8300: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  3 = 0;.#endif.. 
8310: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
8320: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
8330: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
8340: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f  objv, "channel ?
8350: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74  options?");..ret
8360: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8370: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
8380: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
8390: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
83a0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
83b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
83c0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
83d0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
83e0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
83f0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
8400: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8410: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8420: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
8430: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
8440: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
8450: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
8460: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f  l(chan);..    fo
8470: 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20  r (idx = 2; idx 
8480: 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b  < objc; idx++) {
8490: 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64  ..if (Tcl_GetInd
84a0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
84b0: 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d  , objv[idx], com
84c0: 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69  mand_opts, "opti
84d0: 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20  on", 0, &fn) != 
84e0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
84f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8500: 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74  ..}.../* Validat
8510: 65 20 61 72 67 20 68 61 73 20 76 61 6c 75 65 20  e arg has value 
8520: 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e 3d  */..if (++idx >=
8530: 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54 63   objc) {..    Tc
8540: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8550: 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75 65  nterp, "No value
8560: 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22 2c   for option \"",
8570: 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e   command_opts[fn
8580: 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a  ], "\"", (char *
8590: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
85a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
85b0: 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 20  .}...switch(fn) 
85c0: 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 61 6c 70  {..case _opt_alp
85d0: 6e 3a 0a 09 20 20 20 20 61 6c 70 6e 4f 62 6a 20  n:..    alpnObj 
85e0: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
85f0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8600: 6f 70 74 5f 63 61 64 69 72 3a 0a 09 20 20 20 20  opt_cadir:..    
8610: 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f  GET_OPT_STRING(o
8620: 62 6a 76 5b 69 64 78 5d 2c 20 43 41 70 61 74 68  bjv[idx], CApath
8630: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
8640: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8650: 63 61 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 54  cafile:..    GET
8660: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76  _OPT_STRING(objv
8670: 5b 69 64 78 5d 2c 20 43 41 66 69 6c 65 2c 20 4e  [idx], CAfile, N
8680: 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ULL);..    break
8690: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 65 72  ;..case _opt_cer
86a0: 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  t:..    GET_OPT_
86b0: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
86c0: 69 64 78 5d 2c 20 63 65 72 74 2c 20 26 63 65 72  idx], cert, &cer
86d0: 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  t_len);..    bre
86e0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ak;..case _opt_c
86f0: 65 72 74 66 69 6c 65 3a 0a 09 20 20 20 20 47 45  ertfile:..    GE
8700: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8710: 76 5b 69 64 78 5d 2c 20 63 65 72 74 66 69 6c 65  v[idx], certfile
8720: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
8730: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8740: 63 69 70 68 65 72 3a 0a 09 63 61 73 65 20 5f 6f  cipher:..case _o
8750: 70 74 5f 63 69 70 68 65 72 73 3a 0a 09 20 20 20  pt_ciphers:..   
8760: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28   GET_OPT_STRING(
8770: 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68 65  objv[idx], ciphe
8780: 72 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  rs, NULL);..    
8790: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
87a0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 3a 0a 09  t_ciphersuite:..
87b0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49      GET_OPT_STRI
87c0: 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69  NG(objv[idx], ci
87d0: 70 68 65 72 73 75 69 74 65 73 2c 20 4e 55 4c 4c  phersuites, NULL
87e0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
87f0: 63 61 73 65 20 5f 6f 70 74 5f 63 6d 64 3a 0a 09  case _opt_cmd:..
8800: 20 20 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a      cmdObj = obj
8810: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65  v[idx];..    bre
8820: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64  ak;..case _opt_d
8830: 68 70 61 72 61 6d 73 3a 0a 09 20 20 20 20 47 45  hparams:..    GE
8840: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8850: 76 5b 69 64 78 5d 2c 20 44 48 70 61 72 61 6d 73  v[idx], DHparams
8860: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72  , NULL);..    br
8870: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8880: 6b 65 79 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  key:..    GET_OP
8890: 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a  T_BYTE_ARRAY(obj
88a0: 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26 6b 65  v[idx], key, &ke
88b0: 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65  y_len);..    bre
88c0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b  ak;..case _opt_k
88d0: 65 79 66 69 6c 65 3a 0a 09 20 20 20 20 47 45 54  eyfile:..    GET
88e0: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76  _OPT_STRING(objv
88f0: 5b 69 64 78 5d 2c 20 6b 65 79 66 69 6c 65 2c 20  [idx], keyfile, 
8900: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
8910: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6d 6f  k;..case _opt_mo
8920: 64 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  del:..    GET_OP
8930: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8940: 78 5d 2c 20 6d 6f 64 65 6c 2c 20 4e 55 4c 4c 29  x], model, NULL)
8950: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8960: 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f 72  ase _opt_passwor
8970: 64 3a 0a 09 20 20 20 20 70 61 73 73 77 64 4f 62  d:..    passwdOb
8980: 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09  j = objv[idx];..
8990: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
89a0: 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 3a   _opt_handshake:
89b0: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f  ..    GET_OPT_BO
89c0: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 70  OL(objv[idx], &p
89d0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a  ost_handshake);.
89e0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
89f0: 65 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 3a 0a  e _opt_request:.
8a00: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f  .    GET_OPT_BOO
8a10: 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 65  L(objv[idx], &re
8a20: 71 75 65 73 74 29 3b 0a 09 20 20 20 20 62 72 65  quest);..    bre
8a30: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72  ak;..case _opt_r
8a40: 65 71 75 69 72 65 3a 0a 09 20 20 20 20 47 45 54  equire:..    GET
8a50: 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69  _OPT_BOOL(objv[i
8a60: 64 78 5d 2c 20 26 72 65 71 75 69 72 65 29 3b 0a  dx], &require);.
8a70: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8a80: 65 20 5f 6f 70 74 5f 73 65 63 75 72 69 74 79 5f  e _opt_security_
8a90: 6c 65 76 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f  level:..    GET_
8aa0: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8ab0: 5d 2c 20 26 6c 65 76 65 6c 29 3b 0a 09 20 20 20  ], &level);..   
8ac0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8ad0: 70 74 5f 73 65 72 76 65 72 3a 0a 09 20 20 20 20  pt_server:..    
8ae0: 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a  GET_OPT_BOOL(obj
8af0: 76 5b 69 64 78 5d 2c 20 26 73 65 72 76 65 72 29  v[idx], &server)
8b00: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8b10: 61 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 6e  ase _opt_servern
8b20: 61 6d 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ame:..    GET_OP
8b30: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8b40: 78 5d 2c 20 73 65 72 76 65 72 6e 61 6d 65 2c 20  x], servername, 
8b50: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
8b60: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65  k;..case _opt_se
8b70: 73 73 69 6f 6e 5f 69 64 3a 0a 09 20 20 20 20 47  ssion_id:..    G
8b80: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
8b90: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65 73  Y(objv[idx], ses
8ba0: 73 69 6f 6e 5f 69 64 2c 20 26 73 65 73 73 5f 6c  sion_id, &sess_l
8bb0: 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  en);..    break;
8bc0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c 32  ..case _opt_ssl2
8bd0: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49  :..    GET_OPT_I
8be0: 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73  NT(objv[idx], &s
8bf0: 73 6c 32 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  sl2);..    break
8c00: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c  ;..case _opt_ssl
8c10: 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  3:..    GET_OPT_
8c20: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8c30: 73 73 6c 33 29 3b 0a 09 20 20 20 20 62 72 65 61  ssl3);..    brea
8c40: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c  k;..case _opt_tl
8c50: 73 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  s1:..    GET_OPT
8c60: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  _INT(objv[idx], 
8c70: 26 74 6c 73 31 29 3b 0a 09 20 20 20 20 62 72 65  &tls1);..    bre
8c80: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74  ak;..case _opt_t
8c90: 6c 73 31 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f  ls11:..    GET_O
8ca0: 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d  PT_INT(objv[idx]
8cb0: 2c 20 26 74 6c 73 31 5f 31 29 3b 0a 09 20 20 20  , &tls1_1);..   
8cc0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8cd0: 70 74 5f 74 6c 73 31 32 3a 0a 09 20 20 20 20 47  pt_tls12:..    G
8ce0: 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b  ET_OPT_INT(objv[
8cf0: 69 64 78 5d 2c 20 26 74 6c 73 31 5f 32 29 3b 0a  idx], &tls1_2);.
8d00: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8d10: 65 20 5f 6f 70 74 5f 74 6c 73 31 33 3a 0a 09 20  e _opt_tls13:.. 
8d20: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f     GET_OPT_INT(o
8d30: 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f  bjv[idx], &tls1_
8d40: 33 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  3);..    break;.
8d50: 09 63 61 73 65 20 5f 6f 70 74 5f 76 61 6c 69 64  .case _opt_valid
8d60: 61 74 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f  ate:..case _opt_
8d70: 76 63 6d 64 3a 0a 09 20 20 20 20 76 63 6d 64 20  vcmd:..    vcmd 
8d80: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
8d90: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
8da0: 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  }..    if (reque
8db0: 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53  st)..verify |= S
8dc0: 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
8dd0: 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49  _ONCE | SSL_VERI
8de0: 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20  FY_PEER;.    if 
8df0: 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75  (request && requ
8e00: 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53  ire).verify |= S
8e10: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
8e20: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a  F_NO_PEER_CERT;.
8e30: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
8e40: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
8e50: 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c  e).verify |= SSL
8e60: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
8e70: 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28  DSHAKE;.    if (
8e80: 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65  verify == 0)..ve
8e90: 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46  rify = SSL_VERIF
8ea0: 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f  Y_NONE;..    pro
8eb0: 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c  to |= (ssl2 ? TL
8ec0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30  S_PROTO_SSL2 : 0
8ed0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8ee0: 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl3 ? TLS_PROT
8ef0: 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20  O_SSL3 : 0);.   
8f00: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20   proto |= (tls1 
8f10: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  ? TLS_PROTO_TLS1
8f20: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
8f30: 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c   |= (tls1_1 ? TL
8f40: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a  S_PROTO_TLS1_1 :
8f50: 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c   0);.    proto |
8f60: 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f  = (tls1_2 ? TLS_
8f70: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30  PROTO_TLS1_2 : 0
8f80: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8f90: 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52  (tls1_3 ? TLS_PR
8fa0: 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b  OTO_TLS1_3 : 0);
8fb0: 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74  ..    /* reset t
8fc0: 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20  o NULL if blank 
8fd0: 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20  string provided 
8fe0: 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20  */.    if (cert 
8ff0: 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20  && !*cert)..    
9000: 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20      cert.       
9010: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
9020: 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09  (key && !*key)..
9030: 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20          key.    
9040: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9050: 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20  if (certfile && 
9060: 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20  !*certfile)     
9070: 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e      certfile.= N
9080: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
9090: 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c  file && !*keyfil
90a0: 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20  e)..keyfile.    
90b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
90c0: 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21  if (ciphers && !
90d0: 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20  *ciphers).      
90e0: 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20    ciphers.      
90f0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9100: 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26   (ciphersuites &
9110: 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73  & !*ciphersuites
9120: 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20  ) ciphersuites  
9130: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9140: 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41   (CAfile && !*CA
9150: 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41  file).        CA
9160: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
9170: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 70  ULL;.    if (CAp
9180: 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68 29  ath && !*CApath)
9190: 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68 09  .        CApath.
91a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
91b0: 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73      if (DHparams
91c0: 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29 09   && !*DHparams).
91d0: 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d 73          DHparams
91e0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
91f0: 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c 20  .    /* new SSL 
9200: 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74 61  state */.    sta
9210: 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65 20  tePtr..= (State 
9220: 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69  *) ckalloc((unsi
9230: 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74 61  gned) sizeof(Sta
9240: 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  te));.    memset
9250: 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69  (statePtr, 0, si
9260: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a 20  zeof(State));.. 
9270: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61     statePtr->fla
9280: 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20  gs.= flags;.    
9290: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
92a0: 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73  .= interp;.    s
92b0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
92c0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
92d0: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
92e0: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
92f0: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
9300: 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20 4e   if (cmdObj != N
9310: 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ULL) {..(void) T
9320: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
9330: 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 26 6c 65 6e  Obj(cmdObj, &len
9340: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
9350: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61      statePtr->ca
9360: 6c 6c 62 61 63 6b 20 3d 20 63 6d 64 4f 62 6a 3b  llback = cmdObj;
9370: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
9380: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
9390: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20  >callback);..}. 
93a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
93b0: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a  ocate password *
93c0: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 64  /.    if (passwd
93d0: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  Obj != NULL) {..
93e0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
93f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73  ringFromObj(pass
9400: 77 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69  wdObj, &len);..i
9410: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
9420: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
9430: 64 20 3d 20 70 61 73 73 77 64 4f 62 6a 3b 0a 09  d = passwdObj;..
9440: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
9450: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70  ount(statePtr->p
9460: 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20  assword);..}.   
9470: 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63   }..    /* alloc
9480: 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d  ate validate com
9490: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  mand */.    if (
94a0: 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20  vcmd) {..(void) 
94b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
94c0: 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29  mObj(vcmd, &len)
94d0: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
94e0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d     statePtr->vcm
94f0: 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54  d = vcmd;..    T
9500: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
9510: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
9520: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ..}.    }..    i
9530: 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c  f (model != NULL
9540: 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09  ) {..int mode;..
9550: 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65  /* Get the "mode
9560: 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63  l" context */..c
9570: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
9580: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64  nnel(interp, mod
9590: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20  el, &mode);..if 
95a0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
95b0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
95c0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
95d0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
95e0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
95f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9600: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
9610: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
9620: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
9630: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
9640: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
9650: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
9660: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
9670: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
9680: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
9690: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
96a0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
96b0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
96c0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
96d0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
96e0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
96f0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
9700: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
9710: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
9720: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
9730: 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45  IMPORT", "CHANNE
9740: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28  L", "INVALID", (
9750: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
9760: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
9770: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
9780: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
9790: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
97a0: 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61  ..}..ctx = ((Sta
97b0: 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
97c0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
97d0: 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20  chan))->ctx;.   
97e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28   } else {..if ((
97f0: 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73  ctx = CTX_Init(s
9800: 74 61 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c  tatePtr, server,
9810: 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c   proto, keyfile,
9820: 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20   certfile, key, 
9830: 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09  cert, key_len,..
9840: 20 20 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41      cert_len, CA
9850: 70 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69  path, CAfile, ci
9860: 70 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69  phers, ciphersui
9870: 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61  tes, level, DHpa
9880: 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20  rams)) == NULL) 
9890: 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  {..    Tls_Free(
98a0: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
98b0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
98c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
98d0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
98e0: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20    statePtr->ctx 
98f0: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20  = ctx;..    /*. 
9900: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
9910: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9920: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b  the channel work
9930: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72  s in binary (for
9940: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72   the.     * encr
9950: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
9960: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20  t goofed up)..  
9970: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53     */.    Tcl_DS
9980: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
9990: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
99a0: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
99b0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
99c0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
99d0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
99e0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
99f0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
9a00: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9a10: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
9a20: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
9a30: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9a40: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9a50: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65  -eofchar", &uppe
9a60: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
9a70: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
9a80: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9a90: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64  p, chan, "-encod
9aa0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
9ab0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
9ac0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9ad0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9ae0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
9af0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
9b00: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
9b10: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
9b20: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9b30: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
9b40: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
9b50: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
9b60: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
9b70: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
9b80: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
9b90: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20  ", "binary");.  
9ba0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
9bb0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9bc0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
9bd0: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64  , "true");.    d
9be0: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e  printf("Consumin
9bf0: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73  g Tcl channel %s
9c00: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
9c10: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20  lName(chan));.  
9c20: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
9c30: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e   = Tcl_StackChan
9c40: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f  nel(interp, Tls_
9c50: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28  ChannelType(), (
9c60: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
9c70: 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44  ePtr,..(TCL_READ
9c80: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
9c90: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20  BLE), chan);.   
9ca0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
9cb0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
9cc0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
9cd0: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
9ce0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
9cf0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
9d00: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
9d10: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
9d20: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
9d30: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
9d40: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
9d50: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
9d60: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54 63 6c  anslation);..Tcl
9d70: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
9d80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
9d90: 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e  ng);..Tcl_DStrin
9da0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
9db0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09 54 63  nelEOFChar);..Tc
9dc0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
9dd0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
9de0: 69 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ing);..return TC
9df0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
9e00: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
9e10: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
9e20: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
9e30: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
9e40: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
9e50: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9e60: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
9e70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
9e80: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63  translation", Tc
9e90: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
9ea0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
9eb0: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54  slation));.    T
9ec0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
9ed0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
9ee0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e  ePtr->self, "-en
9ef0: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  coding", Tcl_DSt
9f00: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
9f10: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
9f20: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9f30: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9f40: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
9f50: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  lf, "-eofchar", 
9f60: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
9f70: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
9f80: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c  FChar));.    Tcl
9f90: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
9fa0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
9fb0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63  tr->self, "-bloc
9fc0: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  king", Tcl_DStri
9fd0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
9fe0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b  annelBlocking));
9ff0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a000: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
a010: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
a020: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
a030: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
a040: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
a050: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
a060: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46  &upperChannelEOF
a070: 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  Char);.    Tcl_D
a080: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
a090: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
a0a0: 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
a0b0: 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61  * SSL Initializa
a0c0: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  tion.     */.   
a0d0: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d   statePtr->ssl =
a0e0: 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74   SSL_new(statePt
a0f0: 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20  r->ctx);.    if 
a100: 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  (!statePtr->ssl)
a110: 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61   {../* SSL libra
a120: 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c  ry error */..Tcl
a130: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a140: 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20  terp, "couldn't 
a150: 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65  construct ssl se
a160: 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52  ssion: ", GET_ER
a170: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
a180: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a190: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
a1a0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
a1b0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54   "IMPORT", "INIT
a1c0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
a1d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c  ar *) NULL);..Tl
a1e0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
a1f0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
a200: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
a210: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
a220: 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73 65    /* Set host se
a230: 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  rver name */.   
a240: 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65 29   if (servername)
a250: 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65 20   {../* Sets the 
a260: 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69  server name indi
a270: 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e 20  cation (SNI) in 
a280: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74 65  ClientHello exte
a290: 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65 72  nsion */../* Per
a2a0: 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74 6e   RFC 6066, hostn
a2b0: 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20 65  ame is a ASCII e
a2c0: 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20 74  ncoded string, t
a2d0: 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20 73  hough RFC 4366 s
a2e0: 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09 69  ays UTF-8. */..i
a2f0: 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73 65  f (!SSL_set_tlse
a300: 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74 61  xt_host_name(sta
a310: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
a320: 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75 69  ername) && requi
a330: 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  re) {..    Tcl_A
a340: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a350: 72 70 2c 20 22 53 65 74 20 53 4e 49 20 65 78 74  rp, "Set SNI ext
a360: 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22  ension failed: "
a370: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
a380: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
a390: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
a3a0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
a3b0: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
a3c0: 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45  ", "SNI", "FAILE
a3d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
a3e0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
a3f0: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
a400: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
a410: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a420: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  RROR;..}.../* Se
a430: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70  t hostname for p
a440: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  eer certificate 
a450: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63  hostname verific
a460: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73  ation in clients
a470: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20  ...   Don't use 
a480: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69  SSL_set1_host si
a490: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74  nce it has limit
a4a0: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28  ations. */..if (
a4b0: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73  !SSL_add1_host(s
a4c0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
a4d0: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20  rvername)) {..  
a4e0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a4f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
a500: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69  DNS hostname fai
a510: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
a520: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
a530: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a540: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
a550: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
a560: 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41  IMPORT", "HOSTNA
a570: 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ME", "FAILED", (
a580: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
a590: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
a5a0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
a5b0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a5c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a5d0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a5e0: 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e  * Resume session
a5f0: 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73   id */.    if (s
a600: 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 65 73  ession_id && ses
a610: 73 5f 6c 65 6e 20 3c 3d 20 53 53 4c 5f 4d 41 58  s_len <= SSL_MAX
a620: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29  _SID_CTX_LENGTH)
a630: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
a640: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20  ession() */..if 
a650: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65  (!SSL_SESSION_se
a660: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53  t1_id_context(SS
a670: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74  L_get_session(st
a680: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65  atePtr->ssl), se
a690: 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67  ssion_id, (unsig
a6a0: 6e 65 64 20 69 6e 74 29 20 73 65 73 73 5f 6c 65  ned int) sess_le
a6b0: 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  n)) {..    Tcl_A
a6c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a6d0: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73  rp, "Resume sess
a6e0: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ion failed: ", G
a6f0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
a700: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
a710: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a720: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a730: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a740: 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c  "SESSION", "FAIL
a750: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
a760: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a770: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
a780: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
a790: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a7a0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
a7b0: 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41  .    /* Enable A
a7c0: 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72  pplication-Layer
a7d0: 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69   Protocol Negoti
a7e0: 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20  ation. Examples 
a7f0: 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09  are: http/1.0,..
a800: 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33  http/1.1, h2, h3
a810: 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70  , ftp, imap, pop
a820: 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20  3, xmpp-client, 
a830: 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74  xmpp-server, mqt
a840: 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a  t, irc, etc. */.
a850: 20 20 20 20 69 66 20 28 61 6c 70 6e 4f 62 6a 20      if (alpnObj 
a860: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 43  != NULL) {../* C
a870: 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73  onvert a TCL lis
a880: 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f  t into a protoco
a890: 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66  l-list in wire-f
a8a0: 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e  ormat */..unsign
a8b0: 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c  ed char *protos,
a8c0: 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69   *p;..unsigned i
a8d0: 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  nt protos_len = 
a8e0: 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74  0;..Tcl_Size cnt
a8f0: 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63  , i;..int j;..Tc
a900: 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09  l_Obj **list;...
a910: 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
a920: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
a930: 70 2c 20 61 6c 70 6e 4f 62 6a 2c 20 26 63 6e 74  p, alpnObj, &cnt
a940: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f  , &list) != TCL_
a950: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  OK) {..    Tls_F
a960: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
a970: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
a980: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a990: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
a9a0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
a9b0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
a9c0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
a9d0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
a9e0: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
a9f0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
aa00: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
aa10: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
aa20: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
aa30: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
aa40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
aa50: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
aa60: 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28  mes too long", (
aa70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
aa80: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
aa90: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
aaa0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
aab0: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
aac0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
aad0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
aae0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
aaf0: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  tr);...return TC
ab00: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
ab10: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20  .    protos_len 
ab20: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e  += 1 + (int) len
ab30: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
ab40: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
ab50: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
ab60: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
ab70: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
ab80: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
ab90: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
aba0: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
abb0: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
abc0: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70  /..for (j = 0, p
abd0: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63   = protos; j < c
abe0: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; j++) {..    
abf0: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
ac00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ac10: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b  (list[j], &len);
ac20: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e  ..    *p++ = (un
ac30: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e  signed char) len
ac40: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
ac50: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c   str, (size_t) l
ac60: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c  en);..    p += l
ac70: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f  en;..}.../* SSL_
ac80: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20  set_alpn_protos 
ac90: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
aca0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
acb0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54  t */../* Note: T
acc0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76  his function rev
acd0: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e  erses the return
ace0: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f   value conventio
acf0: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65  n */..if (SSL_se
ad00: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74  t_alpn_protos(st
ad10: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f  atePtr->ssl, pro
ad20: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29  tos, protos_len)
ad30: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
ad40: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ad50: 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74  , "Set ALPN prot
ad60: 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c  ocols failed: ",
ad70: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
ad80: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
ad90: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
ada0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
adb0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
adc0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
add0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
ade0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
adf0: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
ae00: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
ae10: 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f      ckfree(proto
ae20: 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  s);..    return 
ae30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
ae40: 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f  /* Store protoco
ae50: 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74  ls list */..stat
ae60: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70  ePtr->protos = p
ae70: 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72  rotos;..statePtr
ae80: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70  ->protos_len = p
ae90: 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d  rotos_len;.    }
aea0: 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74   else {..statePt
aeb0: 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c  r->protos = NULL
aec0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
aed0: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20  tos_len = 0;.   
aee0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20   }..    /*.     
aef0: 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a  * SSL Callbacks.
af00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f       */.    SSL_
af10: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61  set_app_data(sta
af20: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69  tePtr->ssl, (voi
af30: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f  d *)statePtr);./
af40: 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20  * point back to 
af50: 75 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  us */.    SSL_se
af60: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74  t_verify(statePt
af70: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20  r->ssl, verify, 
af80: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b  VerifyCallback);
af90: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66  .    SSL_set_inf
afa0: 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  o_callback(state
afb0: 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61  Ptr->ssl, InfoCa
afc0: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a  llback);..    /*
afd0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62   Callback for ob
afe0: 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  serving protocol
aff0: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66   messages */.#if
b000: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
b010: 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a  SSL_TRACE.    /*
b020: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
b030: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
b040: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  rg(statePtr->ctx
b050: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
b060: 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53  tr);.    void SS
b070: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
b080: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
b090: 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ctx, MessageCal
b0a0: 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53  lback); */.    S
b0b0: 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  SL_set_msg_callb
b0c0: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
b0d0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
b0e0: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53  tatePtr);.    SS
b0f0: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
b100: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
b110: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  , MessageCallbac
b120: 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  k);.#endif..    
b130: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68  /* Create Tcl_Ch
b140: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65  annel BIO Handle
b150: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  r */.    statePt
b160: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e  r->p_bio.= BIO_n
b170: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c  ew_tcl(statePtr,
b180: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20   BIO_NOCLOSE);. 
b190: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f     statePtr->bio
b1a0: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66  .= BIO_new(BIO_f
b1b0: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66  _ssl());..    if
b1c0: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20   (server) {../* 
b1d0: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73  Server callbacks
b1e0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
b1f0: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
b200: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  me_arg(statePtr-
b210: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
b220: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54  atePtr);..SSL_CT
b230: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
b240: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b  vername_callback
b250: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b260: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53  SNICallback);..S
b270: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
b280: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65  t_hello_cb(state
b290: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43  Ptr->ctx, HelloC
b2a0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
b2b0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20  )statePtr);..if 
b2c0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
b2d0: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
b2e0: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c    SSL_CTX_set_al
b2f0: 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61  pn_select_cb(sta
b300: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e  tePtr->ctx, ALPN
b310: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
b320: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66  *)statePtr);.#if
b330: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20  def USE_NPN..   
b340: 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30   if (tls1_2 == 0
b350: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
b360: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
b370: 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76  _next_protos_adv
b380: 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65  ertised_cb(state
b390: 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c  Ptr->ctx, NPNCal
b3a0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
b3b0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d  tatePtr);..    }
b3c0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20  .#endif..}.../* 
b3d0: 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f  Enable server to
b3e0: 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65   send cert reque
b3f0: 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61  st after handsha
b400: 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  ke (TLS 1.3 only
b410: 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65  ) */../* A write
b420: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20   operation must 
b430: 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74  take place for t
b440: 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52  he Certificate R
b450: 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20  equest to be..  
b460: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69   sent to the cli
b470: 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65  ent, this can be
b480: 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64   done with SSL_d
b490: 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a  o_handshake(). *
b4a0: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26  /..if (request &
b4b0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
b4c0: 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20   && tls1_3) {.. 
b4d0: 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c     SSL_verify_cl
b4e0: 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  ient_post_handsh
b4f0: 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ake(statePtr->ss
b500: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20  l);..}.../* set 
b510: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20  automatic curve 
b520: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53  selection */..SS
b530: 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28  L_set_ecdh_auto(
b540: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31  statePtr->ssl, 1
b550: 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76  );.../* Set serv
b560: 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74  er mode */..stat
b570: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
b580: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09  LS_TCL_SERVER;..
b590: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73  SSL_set_accept_s
b5a0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
b5b0: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
b5c0: 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c  {../* Client cal
b5d0: 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66  lbacks */.#ifdef
b5e0: 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74   USE_NPN..if (st
b5f0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
b600: 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32  = NULL && tls1_2
b610: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
b620: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c  == 0) {..    SSL
b630: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
b640: 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74  oto_select_cb(st
b650: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50  atePtr->ctx, ALP
b660: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
b670: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d   *)statePtr);..}
b680: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73  .#endif.../* Ses
b690: 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a  sion caching */.
b6a0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73  .SSL_CTX_set_ses
b6b0: 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
b6c0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
b6d0: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
b6e0: 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f  IENT | SSL_SESS_
b6f0: 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41  CACHE_NO_INTERNA
b700: 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43  L_STORE);..SSL_C
b710: 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f  TX_sess_set_new_
b720: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
b730: 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  , SessionCallbac
b740: 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  k);.../* Enable 
b750: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41  post handshake A
b760: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78  uthentication ex
b770: 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33  tension. TLS 1.3
b780: 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f   only, not http/
b790: 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  2. */..if (reque
b7a0: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
b7b0: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
b7c0: 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  _set_post_handsh
b7d0: 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74  ake_auth(statePt
b7e0: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a  r->ssl, 1);..}..
b7f0: 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d  ./* Set client m
b800: 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ode */..SSL_set_
b810: 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74  connect_state(st
b820: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
b830: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f    }.    SSL_set_
b840: 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  bio(statePtr->ss
b850: 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  l, statePtr->p_b
b860: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  io, statePtr->p_
b870: 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65  bio);.    BIO_se
b880: 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e  t_ssl(statePtr->
b890: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  bio, statePtr->s
b8a0: 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  sl, BIO_NOCLOSE)
b8b0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
b8c0: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74   End of SSL Init
b8d0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
b8e0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
b8f0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
b900: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
b910: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63  ->self));.    Tc
b920: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
b930: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c  rp, (char *) Tcl
b940: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
b950: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
b960: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
b970: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b980: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9d0: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
b9e0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
b9f0: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
ba00: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
ba10: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
ba20: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
ba30: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
ba40: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
ba50: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
ba60: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
ba70: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
ba80: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
ba90: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
baa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bae0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
baf0: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
bb00: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
bb10: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
bb20: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
bb30: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
bb40: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
bb50: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
bb60: 61 6e 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68  an, child;./* Th
bb70: 65 20 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e  e stacked and un
bb80: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c  derlying channel
bb90: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74  s */.    Tcl_DSt
bba0: 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65  ring upperChanne
bbb0: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70  lTranslation, up
bbc0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
bbd0: 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ng, upperChannel
bbe0: 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43  Encoding, upperC
bbf0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20  hannelEOFChar;. 
bc00: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c     int res = TCL
bc10: 5f 4f 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  _OK;.    (void) 
bc20: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
bc30: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
bc40: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
bc50: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
bc60: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
bc70: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
bc80: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
bc90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
bca0: 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61  }..    /* Valida
bcb0: 74 65 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20  te channel name 
bcc0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
bcd0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
bce0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
bcf0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
bd00: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
bd10: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
bd20: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
bd30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
bd40: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
bd50: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
bd60: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
bd70: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
bd80: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
bd90: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
bda0: 20 20 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65    child = Tcl_Ge
bdb0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28  tStackedChannel(
bdc0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  chan);..    /* V
bdd0: 65 72 69 66 79 20 69 73 20 61 20 73 74 61 63 6b  erify is a stack
bde0: 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  ed channel */.  
bdf0: 20 20 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e    if (child == N
be00: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
be10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
be20: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
be30: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
be40: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
be50: 5c 22 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65  \": not a stacke
be60: 64 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61  d channel", (cha
be70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
be80: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
be90: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
bea0: 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48   "UNIMPORT", "CH
beb0: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
bec0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
bed0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
bee0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
bef0: 20 2f 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65   /* Flush any pe
bf00: 6e 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20  nding data */.  
bf10: 20 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28    if (Tcl_Flush(
bf20: 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  chan) != TCL_OK)
bf30: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
bf40: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
bf50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
bf60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
bf70: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
bf80: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
bf90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
bfa0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
bfb0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
bfc0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
bfd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
bfe0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
bff0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a  nnelEncoding);..
c000: 20 20 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65      /* Get curre
c010: 6e 74 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20  nt config - EOL 
c020: 74 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63  translation, enc
c030: 6f 64 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72  oding and buffer
c040: 69 6e 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ing options are 
c050: 73 68 61 72 65 64 20 62 65 74 77 65 65 6e 20 61  shared between a
c060: 6c 6c 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74  ll channels in t
c070: 68 65 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20  he stack */.    
c080: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
c090: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
c0a0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
c0b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
c0c0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
c0d0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
c0e0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
c0f0: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
c100: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
c110: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
c120: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
c130: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
c140: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
c150: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
c160: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
c170: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
c180: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
c190: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
c1a0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
c1b0: 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20  .    /* Unstack 
c1c0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20  the channel and 
c1d0: 72 65 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69  restore underlyi
c1e0: 6e 67 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69  ng channel confi
c1f0: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c  g */.    if (Tcl
c200: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28  _UnstackChannel(
c210: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d  interp, chan) ==
c220: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f   TCL_OK) {..Tcl_
c230: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
c240: 28 69 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20  (interp, child, 
c250: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
c260: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
c270: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
c280: 69 6e 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43  ing));..Tcl_SetC
c290: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
c2a0: 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f  erp, child, "-eo
c2b0: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
c2c0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
c2d0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
c2e0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
c2f0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
c300: 68 69 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74  hild, "-translat
c310: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
c320: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
c330: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
c340: 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e  );..Tcl_SetChann
c350: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
c360: 20 63 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69   child, "-blocki
c370: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
c380: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
c390: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20  nelBlocking));. 
c3a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
c3b0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20   = TCL_ERROR;.  
c3c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61    }..    /* Clea
c3d0: 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  n-up */.    Tcl_
c3e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
c3f0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
c400: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
c410: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
c420: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
c430: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
c440: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
c450: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
c460: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
c470: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
c480: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65  locking);.    re
c490: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
c4a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c4b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c4e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58  ------. *. * CTX
c4f0: 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75  _Init -- constru
c500: 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73  ct a SSL_CTX ins
c510: 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75  tance. *. * Resu
c520: 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20  lts:. *.A valid 
c530: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
c540: 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20   or NULL.. *. * 
c550: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c560: 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20  .constructs SSL 
c570: 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a  context (CTX). *
c580: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c5c0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
c5d0: 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f  c SSL_CTX *.CTX_
c5e0: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74  Init(State *stat
c5f0: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76  ePtr, int isServ
c600: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63  er, int proto, c
c610: 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68  har *keyfile, ch
c620: 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20  ar *certfile,.  
c630: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
c640: 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63  *key, unsigned c
c650: 68 61 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53  har *cert, Tcl_S
c660: 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c  ize key_len, Tcl
c670: 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20  _Size cert_len, 
c680: 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20  char *CApath,.  
c690: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20    char *CAfile, 
c6a0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
c6b0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
c6c0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
c6d0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a  ar *DHparams) {.
c6e0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
c6f0: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74  interp = statePt
c700: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53  r->interp;.    S
c710: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
c720: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
c730: 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20  ing ds;.    int 
c740: 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d  off = 0, abort =
c750: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64   0;.    int load
c760: 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20  _private_key;.  
c770: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48    const SSL_METH
c780: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20  OD *method;..   
c790: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
c7a0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72  ");..    if (!pr
c7b0: 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  oto) {..Tcl_Appe
c7c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c7d0: 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f   "no valid proto
c7e0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28  col selected", (
c7f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
c800: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
c810: 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74   }..    /* creat
c820: 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f  e SSL context */
c830: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
c840: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
c850: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
c860: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
c870: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
c880: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69  L_NO_SSL2).    i
c890: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
c8a0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
c8b0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
c8c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
c8d0: 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL2 protocol no
c8e0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
c8f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
c900: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
c910: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
c920: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c  ined(NO_SSL3) ||
c930: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
c940: 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66  _NO_SSL3).    if
c950: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
c960: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
c970: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
c980: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
c990: 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL3 protocol not
c9a0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
c9b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
c9c0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
c9d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
c9e0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
c9f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
ca00: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20  NO_TLS1).    if 
ca10: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
ca20: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29  TLS_PROTO_TLS1))
ca30: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
ca40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
ca50: 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.0 protocol n
ca60: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
ca70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
ca80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
ca90: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
caa0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
cab0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
cac0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
cad0: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
cae0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
caf0: 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_1)) {..Tcl_
cb00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cb10: 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72  erp, "TLS 1.1 pr
cb20: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
cb30: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
cb40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
cb50: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
cb60: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
cb70: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
cb80: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
cb90: 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45  LS1_2).    if (E
cba0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cbb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29  S_PROTO_TLS1_2))
cbc0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
cbd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
cbe0: 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.2 protocol n
cbf0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
cc00: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
cc10: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
cc20: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
cc30: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
cc40: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
cc50: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
cc60: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
cc70: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
cc80: 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_3)) {..Tcl_
cc90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
cca0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72  erp, "TLS 1.3 pr
ccb0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
ccc0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
ccd0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
cce0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
ccf0: 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20  f.    if (proto 
cd00: 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20  == 0) {../* Use 
cd10: 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53  full range */..S
cd20: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
cd30: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
cd40: 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  , 0);..SSL_CTX_s
cd50: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
cd60: 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20  sion(ctx, 0);.  
cd70: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20    }..    switch 
cd80: 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50  (proto) {.#if OP
cd90: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
cda0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
cdb0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
cdc0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
cdd0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
cde0: 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c  SL2).    case TL
cdf0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d  S_PROTO_SSL2:..m
ce00: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
ce10: 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f   ? SSLv2_server_
ce20: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32  method() : SSLv2
ce30: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
ce40: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
ce50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
ce60: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
ce70: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
ce80: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
ce90: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f  OPENSSL_NO_SSL3_
cea0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
ceb0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a   TLS_PROTO_SSL3:
cec0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
ced0: 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76  ver ? SSLv3_serv
cee0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
cef0: 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv3_client_metho
cf00: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
cf10: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
cf20: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
cf30: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
cf40: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
cf50: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
cf60: 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  S1_METHOD).    c
cf70: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
cf80: 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  S1:..method = is
cf90: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73  Server ? TLSv1_s
cfa0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
cfb0: 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65   TLSv1_client_me
cfc0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
cfd0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
cfe0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
cff0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d000: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  SL_NO_TLS1_1) &&
d010: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d020: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
d030: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
d040: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09  _PROTO_TLS1_1:..
d050: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d060: 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76  r ? TLSv1_1_serv
d070: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d080: 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_1_client_met
d090: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
d0a0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
d0b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
d0c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d0d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  L_NO_TLS1_2) && 
d0e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d0f0: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
d100: 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  D).    case TLS_
d110: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d  PROTO_TLS1_2:..m
d120: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
d130: 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65   ? TLSv1_2_serve
d140: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
d150: 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  v1_2_client_meth
d160: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
d170: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
d180: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
d190: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d1a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
d1b0: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
d1c0: 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74  LS1_3:../* Use t
d1d0: 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f  he generic metho
d1e0: 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74  d and constraint
d1f0: 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e   range after con
d200: 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64 20  text is created 
d210: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
d220: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
d230: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d240: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
d250: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d260: 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  f.    default:..
d270: 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67  /* Negotiate hig
d280: 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53  hest available S
d290: 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a  SL/TLS version *
d2a0: 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  /..method = isSe
d2b0: 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65  rver ? TLS_serve
d2c0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53  r_method() : TLS
d2d0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d2e0: 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
d2f0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
d300: 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64  x10100000L && !d
d310: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
d320: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d330: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66  SSL_NO_SSL2)..of
d340: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
d350: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
d360: 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c  SL2)   ? 0 : SSL
d370: 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23  _OP_NO_SSLv2);.#
d380: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
d390: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  ed(NO_SSL3) && !
d3a0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d3b0: 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d  NO_SSL3)..off |=
d3c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d3d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29   TLS_PROTO_SSL3)
d3e0: 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f     ? 0 : SSL_OP_
d3f0: 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69  NO_SSLv3);.#endi
d400: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d410: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
d420: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d430: 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  LS1)..off |= (EN
d440: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d450: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f  _PROTO_TLS1)   ?
d460: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
d470: 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  LSv1);.#endif.#i
d480: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d490: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
d4a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d4b0: 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_1)..off |= (EN
d4c0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d4d0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f  _PROTO_TLS1_1) ?
d4e0: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
d4f0: 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_1);.#endif.
d500: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d510: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
d520: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d530: 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_2)..off |= (
d540: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
d550: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
d560: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
d570: 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69  _TLSv1_2);.#endi
d580: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d590: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
d5a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d5b0: 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d  _TLS1_3)..off |=
d5c0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d5d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
d5e0: 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  3) ? 0 : SSL_OP_
d5f0: 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e  NO_TLSv1_3);.#en
d600: 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  dif..break;.    
d610: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
d620: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
d630: 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77  tx = SSL_CTX_new
d640: 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66  (method);.    if
d650: 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72   (!ctx) {..retur
d660: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
d670: 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53 53     if (getenv(SS
d680: 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a  LKEYLOGFILE)) {.
d690: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79  .SSL_CTX_set_key
d6a0: 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78  log_callback(ctx
d6b0: 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  , KeyLogCallback
d6c0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64  );.    }..#if !d
d6d0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
d6e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d6f0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
d700: 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d  .    if (proto =
d710: 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  = TLS_PROTO_TLS1
d720: 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73  _3) {..SSL_CTX_s
d730: 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72  et_min_proto_ver
d740: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
d750: 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f  _VERSION);..SSL_
d760: 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74  CTX_set_max_prot
d770: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
d780: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
d790: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
d7a0: 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65    /* Force ciphe
d7b0: 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65  r selection orde
d7c0: 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20  r by server */. 
d7d0: 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65 72     if (!isServer
d7e0: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
d7f0: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
d800: 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56  L_OP_CIPHER_SERV
d810: 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a  ER_PREFERENCE);.
d820: 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53      }..#if OPENS
d830: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
d840: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a  R < 0x10100000L.
d850: 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f      OpenSSL_add_
d860: 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29  all_algorithms()
d870: 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72  ; /* Load cipher
d880: 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f  s and digests */
d890: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c  .#endif..    SSL
d8a0: 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74  _CTX_set_app_dat
d8b0: 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e  a(ctx, (void*)in
d8c0: 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62  terp);./* rememb
d8d0: 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65 74  er the interpret
d8e0: 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  er */.    SSL_CT
d8f0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
d900: 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09  x, SSL_OP_ALL);.
d910: 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77  /* all SSL bug w
d920: 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20  orkarounds */.  
d930: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
d940: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
d950: 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  P_NO_COMPRESSION
d960: 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f  );./* disable co
d970: 6d 70 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69  mpression even i
d980: 66 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20  f supported */. 
d990: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f     SSL_CTX_set_o
d9a0: 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29  ptions(ctx, off)
d9b0: 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72  ;../* disable pr
d9c0: 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20  otocol versions 
d9d0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
d9e0: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
d9f0: 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20  0x10101000L.    
da00: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65  SSL_CTX_set_mode
da10: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ctx, SSL_MODE_A
da20: 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68  UTO_RETRY);./* h
da30: 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68  andle new handsh
da40: 61 6b 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75  akes in backgrou
da50: 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c  nd. On by defaul
da60: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31  t in OpenSSL 1.1
da70: 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  .1. */.#endif.  
da80: 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73    SSL_CTX_sess_s
da90: 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74  et_cache_size(ct
daa0: 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a  x, 128);..    /*
dab0: 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e 65   Set user define
dac0: 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65  d ciphers, ciphe
dad0: 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65  r suites, and se
dae0: 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a  curity level */.
daf0: 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73      if ((ciphers
db00: 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53   != NULL) && !SS
db10: 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72  L_CTX_set_cipher
db20: 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68 65  _list(ctx, ciphe
db30: 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  rs)) {..Tcl_Appe
db40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
db50: 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66 61   "Set ciphers fa
db60: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
db70: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
db80: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
db90: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
dba0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
dbb0: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
dbc0: 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20  suites != NULL) 
dbd0: 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  && !SSL_CTX_set_
dbe0: 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74 78  ciphersuites(ctx
dbf0: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 29  , ciphersuites))
dc00: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
dc10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
dc20: 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73 20  t cipher suites 
dc30: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
dc40: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
dc50: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
dc60: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
dc70: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
dc80: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73   }..    /* Set s
dc90: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
dca0: 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e  .    if (level >
dcb0: 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36   -1 && level < 6
dcc0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
dcd0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a  security_level *
dce0: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73  /..SSL_CTX_set_s
dcf0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74  ecurity_level(ct
dd00: 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d  x, level);.    }
dd10: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d  ..    /* set som
dd20: 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20  e callbacks */. 
dd30: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64     SSL_CTX_set_d
dd40: 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62  efault_passwd_cb
dd50: 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61  (ctx, PasswordCa
dd60: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
dd70: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
dd80: 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64  _passwd_cb_userd
dd90: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a  ata(ctx, (void *
dda0: 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20  )statePtr);..   
ddb0: 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66 66 69   /* read a Diffi
ddc0: 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65  e-Hellman parame
ddd0: 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73  ters file, or us
dde0: 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f  e the built-in o
ddf0: 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  ne */.    Tcl_DS
de00: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
de10: 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  #ifdef OPENSSL_N
de20: 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48 70  O_DH.    if (DHp
de30: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
de40: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
de50: 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70  lt(interp, "DH p
de60: 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74  arameter support
de70: 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c   not available",
de80: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
de90: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
dea0: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
deb0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  L;.    }.#else. 
dec0: 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69     {..DH* dh;..i
ded0: 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e  f (DHparams != N
dee0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20  ULL) {..    BIO 
def0: 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20  *bio;...    bio 
df00: 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46  = BIO_new_file(F
df10: 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73  2N(DHparams, &ds
df20: 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66  ), "r");..    if
df30: 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f   (!bio) {...Tcl_
df40: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
df50: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
df60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
df70: 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20  uld not find DH 
df80: 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22  parameters file"
df90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
dfa0: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
dfb0: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
dfc0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  NULL;..    }... 
dfd0: 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64     dh = PEM_read
dfe0: 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69  _bio_DHparams(bi
dff0: 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e  o, NULL, NULL, N
e000: 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66  ULL);..    BIO_f
e010: 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54  ree(bio);..    T
e020: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e030: 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64  ds);..    if (!d
e040: 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  h) {...Tcl_Appen
e050: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e060: 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20  "Could not read 
e070: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 72  DH parameters fr
e080: 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  om file", (char 
e090: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
e0a0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e0b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e0c0: 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54     }..    SSL_CT
e0d0: 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78  X_set_tmp_dh(ctx
e0e0: 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66  , dh);..    DH_f
e0f0: 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73  ree(dh);...} els
e100: 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20  e {..    /* Use 
e110: 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61  well known DH pa
e120: 72 61 6d 65 74 65 72 73 20 74 68 61 74 20 68 61  rameters that ha
e130: 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70  ve built-in supp
e140: 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a  ort in OpenSSL *
e150: 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  /..    if (!SSL_
e160: 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28  CTX_set_dh_auto(
e170: 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c  ctx, 1)) {...Tcl
e180: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e190: 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74  terp, "Could not
e1a0: 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61   enable set DH a
e1b0: 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  uto: ", GET_ERR_
e1c0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
e1d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
e1e0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e1f0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e200: 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65     }..}.    }.#e
e210: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74  ndif..    /* set
e220: 20 6f 75 72 20 63 65 72 74 69 66 69 63 61 74 65   our certificate
e230: 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69   */.    load_pri
e240: 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20  vate_key = 0;.  
e250: 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 21    if (certfile !
e260: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f  = NULL) {..load_
e270: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b  private_key = 1;
e280: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
e290: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
e2a0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72  ile(ctx, F2N(cer
e2b0: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  tfile, &ds), SSL
e2c0: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
e2d0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
e2e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
e2f0: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
e300: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e310: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
e320: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
e330: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
e340: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
e350: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
e360: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
e370: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e380: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
e390: 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  ..}..Tcl_DString
e3a0: 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20 20 20  Free(&ds);..    
e3b0: 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74 20  } else if (cert 
e3c0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64  != NULL) {..load
e3d0: 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 31  _private_key = 1
e3e0: 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ;..if (SSL_CTX_u
e3f0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 41  se_certificate_A
e400: 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 29 20 63  SN1(ctx, (int) c
e410: 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c  ert_len, cert) <
e420: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
e430: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e440: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
e450: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
e460: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45   ",...GET_ERR_RE
e470: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e480: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
e490: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e4a0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
e4b0: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ;..}..    } else
e4c0: 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28   {..certfile = (
e4d0: 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64  char*)X509_get_d
e4e0: 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65  efault_cert_file
e4f0: 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  ();...if (SSL_CT
e500: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
e510: 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74  e_file(ctx, cert
e520: 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59  file, SSL_FILETY
e530: 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a  PE_PEM) <= 0) {.
e540: 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41  #if 0..    Tcl_A
e550: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e560: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75  rp, "unable to u
e570: 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69  se default certi
e580: 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63  ficate file ", c
e590: 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09  ertfile, ": ",..
e5a0: 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28  .GET_ERR_REASON(
e5b0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
e5c0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
e5d0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
e5e0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e  return NULL;.#en
e5f0: 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  dif..}.    }..  
e600: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69    /* set our pri
e610: 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20  vate key */.    
e620: 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65  if (load_private
e630: 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79  _key) {..if (key
e640: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  file == NULL && 
e650: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key == NULL) {..
e660: 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65      keyfile = ce
e670: 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20  rtfile;..}...if 
e680: 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (keyfile != NULL
e690: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20  ) {..    /* get 
e6a0: 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20  the private key 
e6b0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
e6c0: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
e6d0: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79   */..    if (key
e6e0: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  file == NULL) {.
e6f0: 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74  ..keyfile = cert
e700: 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  file;..    }... 
e710: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
e720: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69  se_PrivateKey_fi
e730: 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66  le(ctx, F2N(keyf
e740: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46  ile, &ds), SSL_F
e750: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
e760: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  0) {...Tcl_DStri
e770: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f  ngFree(&ds);.../
e780: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
e790: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
e7a0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
e7b0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
e7c0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
e7d0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
e7e0: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
e7f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e800: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
e810: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65   public key file
e820: 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22   ", keyfile, " "
e830: 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f  ,...    GET_ERR_
e840: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
e850: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
e860: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e870: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e880: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
e890: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e8a0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79  ..} else if (key
e8b0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
e8c0: 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65   if (SSL_CTX_use
e8d0: 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31  _PrivateKey_ASN1
e8e0: 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63  (EVP_PKEY_RSA, c
e8f0: 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 6b  tx, key, (int) k
e900: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
e910: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
e920: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
e930: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
e940: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
e950: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
e960: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
e970: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
e980: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e990: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
e9a0: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20  set public key: 
e9b0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
e9c0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
e9d0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
e9e0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
e9f0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ea00: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
ea10: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
ea20: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
ea30: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
ea40: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
ea50: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
ea60: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
ea70: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
ea80: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ea90: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
eaa0: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
eab0: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
eac0: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
ead0: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
eae0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
eaf0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
eb00: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
eb10: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
eb20: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65     /* Set to use
eb30: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
eb40: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
eb50: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
eb60: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
eb70: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20  icates. The.    
eb80: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61   * verify path a
eb90: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20  nd store can be 
eba0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
ebb0: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
ebc0: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69  nv var. The veri
ebd0: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20  fy file can.    
ebe0: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e   * be overridden
ebf0: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
ec00: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
ec10: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
ec20: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
ec30: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
ec40: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20  ) {..abort++;.  
ec50: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
ec60: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41  rides for the CA
ec70: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
ec80: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23   file */.    {.#
ec90: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
eca0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
ecb0: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70  000000L..if (CAp
ecc0: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43  ath != NULL || C
ecd0: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
ece0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
ecf0: 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f  g ds1;..    Tcl_
ed00: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31  DStringInit(&ds1
ed10: 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53  );...    if (!SS
ed20: 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
ed30: 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c  y_locations(ctx,
ed40: 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73   F2N(CAfile, &ds
ed50: 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26  ), F2N(CApath, &
ed60: 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74  ds1))) {...abort
ed70: 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  ++;..    }..    
ed80: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ed90: 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  &ds);..    Tcl_D
eda0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
edb0: 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
edc0: 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
edd0: 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
ede0: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
edf0: 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
ee00: 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74  e */..    /* htt
ee10: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
ee20: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
ee30: 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58  57/ */..    /* X
ee40: 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65  XX:TODO: Let the
ee50: 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c   user supply val
ee60: 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64  ues here instead
ee70: 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   of something th
ee80: 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  at exists on the
ee90: 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09   filesystem */..
eea0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
eeb0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
eec0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
eed0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
eee0: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
eef0: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
ef00: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
ef10: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
ef20: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
ef30: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
ef40: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
ef50: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
ef60: 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28 43 41 70  ..#else..if (CAp
ef70: 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ath != NULL) {..
ef80: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
ef90: 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72  _load_verify_dir
efa0: 28 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68  (ctx, F2N(CApath
efb0: 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f  , &ds))) {...abo
efc0: 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20  rt++;..    }..  
efd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
efe0: 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69 66 20 28  e(&ds);..}..if (
eff0: 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
f000: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
f010: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
f020: 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41  file(ctx, F2N(CA
f030: 66 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09  file, &ds))) {..
f040: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
f050: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f060: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20  gFree(&ds);...  
f070: 20 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66    /* Set list of
f080: 20 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20   CAs to send to 
f090: 63 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75  client when requ
f0a0: 65 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20  esting a client 
f0b0: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09  certificate */..
f0c0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
f0d0: 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
f0e0: 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
f0f0: 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
f100: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
f110: 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
f120: 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
f130: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
f140: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
f150: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
f160: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
f170: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
f180: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
f190: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d     return ctx;.}
f1a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
f1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
f1f0: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d  * StatusObjCmd -
f200: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69  - return certifi
f210: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74  cate for connect
f220: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52  ed peer.. *. * R
f230: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
f240: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
f250: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
f260: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
f270: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
f2c0: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a  ic int.StatusObj
f2d0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
f2e0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
f2f0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
f300: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
f310: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
f320: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
f330: 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20  tePtr;.    X509 
f340: 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f  *peer;.    Tcl_O
f350: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20  bj *objPtr;.    
f360: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
f370: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e  ;.    char *chan
f380: 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72  nelName, *cipher
f390: 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b  s;.    int mode;
f3a0: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
f3b0: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b  ned char *proto;
f3c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
f3d0: 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  t len;.    int n
f3e0: 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f  id, res;.    (vo
f3f0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
f400: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
f410: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
f420: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a  (objc < 2 || obj
f430: 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d  c > 3 || (objc =
f440: 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54  = 3 && !strcmp(T
f450: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f460: 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29  v[1]), "-local")
f470: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
f480: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
f490: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c  , objv, "?-local
f4a0: 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65  ? channel");..re
f4b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f4c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
f4d0: 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a  t channel Id */.
f4e0: 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20      channelName 
f4f0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
f500: 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20  objv[(objc == 2 
f510: 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20  ? 1 : 2)]);.    
f520: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
f530: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
f540: 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65  annelName, &mode
f550: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
f560: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
f570: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
f580: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
f590: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
f5a0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
f5b0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
f5c0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
f5d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
f5e0: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20  annel(chan);.   
f5f0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
f600: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
f610: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
f620: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
f630: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f640: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
f650: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
f660: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
f670: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
f680: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
f690: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
f6a0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
f6b0: 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22   "TLS", "STATUS"
f6c0: 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
f6d0: 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
f6e0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
f6f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
f700: 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20  .    statePtr = 
f710: 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65  (State *) Tcl_Ge
f720: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
f730: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
f740: 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63   /* Get certific
f750: 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20  ate for peer or 
f760: 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28  self */.    if (
f770: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65  objc == 2) {..pe
f780: 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  er = SSL_get_pee
f790: 72 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74  r_certificate(st
f7a0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
f7b0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72    } else {..peer
f7c0: 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69   = SSL_get_certi
f7d0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
f7e0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  >ssl);.    }..  
f7f0: 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65    /* Get X509 ce
f800: 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a  rtificate info *
f810: 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29 20  /.    if (peer) 
f820: 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f  {..objPtr = Tls_
f830: 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72  NewX509Obj(inter
f840: 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f  p, peer);..if (o
f850: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20  bjc == 2) {..   
f860: 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72 29   X509_free(peer)
f870: 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55  ;..    peer = NU
f880: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
f890: 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63  e {..objPtr = Tc
f8a0: 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20  l_NewListObj(0, 
f8b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  NULL);.    }..  
f8c0: 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a    /* Peer name *
f8d0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  /.    LAPPEND_ST
f8e0: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
f8f0: 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53  , "peername", SS
f900: 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28  L_get0_peername(
f910: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
f920: 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  -1);.    LAPPEND
f930: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
f940: 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53  Ptr, "sbits", SS
f950: 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74  L_get_cipher_bit
f960: 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  s(statePtr->ssl,
f970: 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69   NULL));..    ci
f980: 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53  phers = (char*)S
f990: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74  SL_get_cipher(st
f9a0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
f9b0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
f9c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
f9d0: 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c  ipher", ciphers,
f9e0: 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65   -1);..    /* Ve
f9f0: 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63 65  rify the X509 ce
fa00: 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65 6e  rtificate presen
fa10: 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72 20  ted by the peer 
fa20: 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
fa30: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
fa40: 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c 74  r, "verifyResult
fa50: 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f  ",..X509_verify_
fa60: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
fa70: 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  g(SSL_get_verify
fa80: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
fa90: 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20  ->ssl)), -1);.. 
faa0: 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64     /* Verify mod
fab0: 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20  e */.    mode = 
fac0: 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d  SSL_get_verify_m
fad0: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ode(statePtr->ss
fae0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65  l);.    if (mode
faf0: 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e   && SSL_VERIFY_N
fb00: 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f  ONE) {..LAPPEND_
fb10: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
fb20: 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
fb30: 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  , "none", -1);. 
fb40: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
fb50: 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72  _Obj *listObjPtr
fb60: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
fb70: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  j(0, NULL);..if 
fb80: 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
fb90: 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20  IFY_PEER) {..   
fba0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fbb0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
fbc0: 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
fbd0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
fbe0: 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  peer", -1));..}.
fbf0: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
fc00: 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f  _VERIFY_FAIL_IF_
fc10: 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a  NO_PEER_CERT) {.
fc20: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
fc30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fc40: 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
fc50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fc60: 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70  bj("fail if no p
fc70: 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b  eer cert", -1));
fc80: 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
fc90: 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45   SSL_VERIFY_CLIE
fca0: 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20  NT_ONCE) {..    
fcb0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fcc0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
fcd0: 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c   listObjPtr, Tcl
fce0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
fcf0: 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29  lient once", -1)
fd00: 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  );..}..if (mode 
fd10: 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f  && SSL_VERIFY_PO
fd20: 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a  ST_HANDSHAKE) {.
fd30: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
fd40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
fd50: 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
fd60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fd70: 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61  bj("post handsha
fd80: 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c  ke", -1));..}..L
fd90: 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72  APPEND_OBJ(inter
fda0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
fdb0: 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a  fyMode", listObj
fdc0: 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Ptr).    }..    
fdd0: 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64  /* Verify mode d
fde0: 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50  epth */.    LAPP
fdf0: 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
fe00: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44  objPtr, "verifyD
fe10: 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76  epth", SSL_get_v
fe20: 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61 74  erify_depth(stat
fe30: 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20  ePtr->ssl));..  
fe40: 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20    /* Report the 
fe50: 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
fe60: 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
fe70: 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e   the negotiation
fe80: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30   */.    SSL_get0
fe90: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
fea0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70  tatePtr->ssl, &p
feb0: 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  roto, &len);.   
fec0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
fed0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c  erp, objPtr, "al
fee0: 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f  pn", (char *)pro
fef0: 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  to, (Tcl_Size) l
ff00: 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  en);.    LAPPEND
ff10: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
ff20: 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c  Ptr, "protocol",
ff30: 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e   SSL_get_version
ff40: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
ff50: 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61   -1);..    /* Va
ff60: 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20  lid for non-RSA 
ff70: 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c  signature and TL
ff80: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20  S 1.3 */.    if 
ff90: 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72  (objc == 2) {..r
ffa0: 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65  es = SSL_get_pee
ffb0: 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  r_signature_nid(
ffc0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
ffd0: 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  nid);.    } else
ffe0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
fff0: 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28  t_signature_nid(
10000 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10010 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nid);.    }.    
10020 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d  if (!res) {nid =
10030 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44   0;}.    LAPPEND
10040 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10050 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48  Ptr, "signatureH
10060 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f  ashAlgorithm", O
10070 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20  BJ_nid2ln(nid), 
10080 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64  -1);..    /* Add
10090 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e  ed in OpenSSL 1.
100a0 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  1.1a */.#if OPEN
100b0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
100c0 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c  ER > 0x10101000L
100d0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
100e0 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
100f0 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
10100 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61  ure_type_nid(sta
10110 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
10120 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
10130 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73  .res = SSL_get_s
10140 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
10150 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
10160 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20   &nid);.    }.  
10170 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64    if (!res) {nid
10180 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45   = 0;}.    LAPPE
10190 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
101a0 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72  bjPtr, "signatur
101b0 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32  eType", OBJ_nid2
101c0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65  ln(nid), -1);.#e
101d0 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ndif..    Tcl_Se
101e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
101f0 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
10200 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10210 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
10220 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10230 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
10260 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
10270 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
10280 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10290 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
102a0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
102b0 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
102c0 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
102d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
102e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
102f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10310 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
10320 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
10330 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
10340 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
10350 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10360 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
10370 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
10380 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
10390 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
103a0 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
103b0 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
103c0 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
103d0 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
103e0 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
103f0 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
10400 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
10410 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
10420 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
10430 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
10440 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
10450 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
10460 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
10470 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
10480 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
10490 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20  ntData;..    if 
104a0 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
104b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
104c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
104d0 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
104e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
104f0 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
10500 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
10510 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10520 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10530 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
10540 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
10550 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
10560 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
10580 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
10590 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
105a0 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
105b0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
105c0 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
105d0 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ;.    if (Tcl_Ge
105e0 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61  tChannelType(cha
105f0 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65  n) != Tls_Channe
10600 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f  lType()) {..Tcl_
10610 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10620 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65  erp, "bad channe
10630 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68  l \"", Tcl_GetCh
10640 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c  annelName(chan),
10650 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61  ..    "\": not a
10660 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
10670 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
10680 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
10690 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
106a0 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43  "CONNECTION", "C
106b0 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
106c0 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
106d0 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
106e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
106f0 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
10700 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
10710 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
10720 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
10730 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
10740 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
10750 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
10760 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
10770 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
10780 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
10790 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
107a0 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
107b0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
107c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
107d0 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65  tate", SSL_state
107e0 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
107f0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
10800 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
10810 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c  erver name */..L
10820 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10830 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76  p, objPtr, "serv
10840 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74  ername", SSL_get
10850 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
10860 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
10870 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29  _host_name), -1)
10880 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
10890 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
108a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
108b0 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
108c0 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
108d0 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
108e0 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
108f0 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
10900 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10910 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
10920 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
10930 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
10940 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
10950 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c  port((SSL *) ssl
10960 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63  ));.../* Get sec
10970 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09  urity level */..
10980 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10990 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
109a0 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53  urity_level", SS
109b0 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_get_security_l
109c0 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  evel(ssl));.../*
109d0 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
109e0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
109f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10a00 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c  session_reused",
10a10 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75   SSL_session_reu
10a20 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  sed(ssl));.../* 
10a30 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a  Is server info *
10a40 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
10a50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10a60 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c  "is_server", SSL
10a70 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29  _is_server(ssl))
10a80 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a  ;.../* Is DTLS *
10a90 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
10aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10ab0 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69  "is_dtls", SSL_i
10ac0 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20  s_dtls(ssl));.  
10ad0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68    }..    /* Ciph
10ae0 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63  er info */.    c
10af0 69 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f  ipher = SSL_get_
10b00 63 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73  current_cipher(s
10b10 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70  sl);.    if (cip
10b20 68 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  her != NULL) {..
10b30 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
10b40 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74   = {0};..int bit
10b50 73 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f  s, alg_bits;.../
10b60 2a 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f  * Cipher name */
10b70 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10b80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
10b90 69 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48  ipher", SSL_CIPH
10ba0 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68  ER_get_name(ciph
10bb0 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52  er), -1);.../* R
10bc0 46 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65  FC name of ciphe
10bd0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  r */..LAPPEND_ST
10be0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10bf0 2c 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  , "standard_name
10c00 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74  ", SSL_CIPHER_st
10c10 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68  andard_name(ciph
10c20 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f  er), -1);.../* O
10c30 70 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63  penSSL name of c
10c40 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
10c50 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10c60 6a 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e  jPtr, "openssl_n
10c70 61 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69  ame", OPENSSL_ci
10c80 70 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49  pher_name(SSL_CI
10c90 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
10ca0 6d 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  me(cipher)), -1)
10cb0 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66  ;.../* number of
10cc0 20 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65   secret bits use
10cd0 64 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a  d for cipher */.
10ce0 09 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48  .bits = SSL_CIPH
10cf0 45 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68  ER_get_bits(ciph
10d00 65 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a  er, &alg_bits);.
10d10 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
10d20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
10d30 63 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73  cret_bits", bits
10d40 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  );..LAPPEND_INT(
10d50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10d60 22 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22  "algorithm_bits"
10d70 2c 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a  , alg_bits);../*
10d80 20 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74   alg_bits is act
10d90 75 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62  ual key secret b
10da0 69 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73  its. If use bits
10db0 20 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67   and secret (alg
10dc0 6f 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66  orithm) bits dif
10dd0 66 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73  fer,..   the res
10de0 74 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72  t of the bits ar
10df0 65 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f  e fixed, i.e. fo
10e00 72 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74  r limited export
10e10 20 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c   ciphers (bits <
10e20 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64   56) */.../* Ind
10e30 69 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c  icates which SSL
10e40 2f 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65  /TLS protocol ve
10e50 72 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69  rsion first defi
10e60 6e 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a  ned the cipher *
10e70 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
10e80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10e90 6d 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53  min_version", SS
10ea0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72  L_CIPHER_get_ver
10eb0 73 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31  sion(cipher), -1
10ec0 29 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e  );.../* Cipher N
10ed0 49 44 2c 20 64 69 67 65 73 74 20 4e 49 44 20 28  ID, digest NID (
10ee0 6e 6f 6e 65 20 66 6f 72 20 41 45 41 44 20 63 69  none for AEAD ci
10ef0 70 68 65 72 20 73 75 69 74 65 73 29 2c 20 4b 65  pher suites), Ke
10f00 79 20 45 78 63 68 61 6e 67 65 20 4e 49 44 2c 20  y Exchange NID, 
10f10 61 6e 64 20 61 75 74 68 65 6e 74 69 63 61 74 69  and authenticati
10f20 6f 6e 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45  on NID */..LAPPE
10f30 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10f40 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49  bjPtr, "cipherNI
10f50 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
10f60 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
10f70 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64  R_get_cipher_nid
10f80 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
10f90 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10fa0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69  erp, objPtr, "di
10fb0 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20  gestNID", (char 
10fc0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
10fd0 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65  _CIPHER_get_dige
10fe0 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  st_nid(cipher)),
10ff0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11000 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11010 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e  r, "keyExchangeN
11020 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
11030 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
11040 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69  ER_get_kx_nid(ci
11050 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
11060 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11070 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65  , objPtr, "authe
11080 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28  nticationNID", (
11090 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
110a0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
110b0 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72  _auth_nid(cipher
110c0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65  )), -1);.../* me
110d0 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61  ssage authentica
110e0 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68  tion code - Ciph
110f0 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e  er is AEAD (e.g.
11100 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30   GCM or ChaCha20
11110 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f  /Poly1305) or no
11120 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74  t */../* Authent
11130 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f  icated Encryptio
11140 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65  n with associate
11150 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68  d data (AEAD) ch
11160 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  eck */..LAPPEND_
11170 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
11180 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f  Ptr, "cipher_is_
11190 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45  aead", SSL_CIPHE
111a0 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72  R_is_aead(cipher
111b0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65  ));.../* Get Ope
111c0 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44  nSSL-specific ID
111d0 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f  , not IANA ID */
111e0 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
111f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11200 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29  ipher_id", (int)
11210 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
11220 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
11230 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73  * Two-byte ID us
11240 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72  ed in the TLS pr
11250 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69  otocol of the gi
11260 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  ven cipher */..L
11270 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
11280 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
11290 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20  ocol_id", (int) 
112a0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70  SSL_CIPHER_get_p
112b0 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65  rotocol_id(ciphe
112c0 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61  r));.../* Textua
112d0 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  l description of
112e0 20 74 68 65 20 63 69 70 68 65 72 2e 20 49 6e 63   the cipher. Inc
112f0 6c 75 64 65 73 3a 20 63 69 70 68 65 72 20 6e 61  ludes: cipher na
11300 6d 65 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72  me, protocol ver
11310 73 69 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65 78  sion, key..   ex
11320 63 68 61 6e 67 65 2c 20 61 75 74 68 65 6e 74 69  change, authenti
11330 63 61 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72 69  cation, symmetri
11340 63 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74  c encryption met
11350 68 6f 64 2c 20 6d 65 73 73 61 67 65 20 61 75 74  hod, message aut
11360 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65  hentication code
11370 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50   */..if (SSL_CIP
11380 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28  HER_description(
11390 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a  cipher, buf, siz
113a0 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c  eof(buf)) != NUL
113b0 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e  L) {..    LAPPEN
113c0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
113d0 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69  jPtr, "descripti
113e0 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09  on", buf, -1);..
113f0 7d 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73  }.../* Digest us
11400 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53  ed during the SS
11410 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20  L/TLS handshake 
11420 77 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63  when using the c
11430 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20  ipher. */..md = 
11440 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68  SSL_CIPHER_get_h
11450 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28  andshake_digest(
11460 63 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e  cipher);..LAPPEN
11470 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11480 6a 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65  jPtr, "handshake
11490 5f 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20  _digest", (char 
114a0 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64  *)EVP_MD_name(md
114b0 29 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ), -1);.    }.. 
114c0 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e     /* Session in
114d0 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  fo */.    sessio
114e0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73  n = SSL_get_sess
114f0 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  ion(ssl);.    if
11500 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c   (session != NUL
11510 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
11520 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
11530 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b  t;..size_t len2;
11540 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  ..unsigned int u
11550 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len;..const unsi
11560 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
11570 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09  on_id, *proto;..
11580 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75  unsigned char bu
11590 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53  ffer[SSL_MAX_MAS
115a0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b  TER_KEY_LENGTH];
115b0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
115c0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
115d0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
115e0 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74  f the ALPN negot
115f0 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53  iation */..SSL_S
11600 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e  ESSION_get0_alpn
11610 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f  _selected(sessio
11620 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32  n, &proto, &len2
11630 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11640 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11650 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29  "alpn", (char *)
11660 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
11670 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52  e) len2);.../* R
11680 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
11690 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
116a0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e   result of the N
116b0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
116c0 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
116d0 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f  ..SSL_get0_next_
116e0 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64  proto_negotiated
116f0 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75  (ssl, &proto, &u
11700 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
11710 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11720 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20  r, "npn", (char 
11730 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53  *) proto, (Tcl_S
11740 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64  ize) ulen);.#end
11750 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  if.../* Resumabl
11760 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41  e session */..LA
11770 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11780 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75  p, objPtr, "resu
11790 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53  mable", SSL_SESS
117a0 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
117b0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
117c0 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74   Session start t
117d0 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e  ime (seconds sin
117e0 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41  ce epoch) */..LA
117f0 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
11800 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72  p, objPtr, "star
11810 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53  t_time", SSL_SES
11820 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65  SION_get_time(se
11830 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69  ssion));.../* Ti
11840 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53  meout value - SS
11850 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75  L_CTX_get_timeou
11860 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
11870 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
11880 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11890 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53  "timeout", SSL_S
118a0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
118b0 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  ut(session));...
118c0 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20  /* Session id - 
118d0 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f  TLSv1.2 and belo
118e0 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69  w only */..sessi
118f0 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
11900 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
11910 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
11920 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
11930 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
11940 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
11950 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29  n_id, (Tcl_Size)
11960 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73   ulen);.../* Ses
11970 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sion context */.
11980 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53  .session_id = SS
11990 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69  L_SESSION_get0_i
119a0 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f  d_context(sessio
119b0 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  n, &ulen);..LAPP
119c0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
119d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
119e0 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65  ion_context", se
119f0 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
11a00 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a  ize) ulen);.../*
11a10 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
11a20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f  - client only */
11a30 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
11a40 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f  t0_ticket(sessio
11a50 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
11a60 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  2);..LAPPEND_BAR
11a70 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
11a80 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63  tr, "session_tic
11a90 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54  ket", ticket, (T
11aa0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
11ab0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63  ../* Session tic
11ac0 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e  ket lifetime hin
11ad0 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
11ae0 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
11af0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11b00 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f  "lifetime", SSL_
11b10 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b  SESSION_get_tick
11b20 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74  et_lifetime_hint
11b30 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
11b40 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61   Ticket app data
11b50 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
11b60 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
11b70 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53   0x30000000L..SS
11b80 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74  L_SESSION_get0_t
11b90 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53  icket_appdata((S
11ba0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65  SL_SESSION *) se
11bb0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
11bc0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
11bd0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
11be0 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f  objPtr, "ticket_
11bf0 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65  app_data", ticke
11c00 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
11c10 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  n2);.#endif.../*
11c20 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20   Get master key 
11c30 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53  */..len2 = SSL_S
11c40 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65  ESSION_get_maste
11c50 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62  r_key(session, b
11c60 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d  uffer, SSL_MAX_M
11c70 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
11c80 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
11c90 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
11ca0 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c  r, "master_key",
11cb0 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69   buffer, (Tcl_Si
11cc0 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
11cd0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a  Compression id *
11ce0 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  /..unsigned int 
11cf0 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
11d00 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64  _get_compress_id
11d10 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50  (session);..LAPP
11d20 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11d30 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
11d40 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20  sion_id", id == 
11d50 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f  1 ? "zlib" : "no
11d60 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ne", -1);.    }.
11d70 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73  .    /* Compress
11d80 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
11d90 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
11da0 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53   {.#ifdef HAVE_S
11db0 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09  SL_COMPRESSION..
11dc0 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f  const COMP_METHO
11dd0 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a  D *comp, *expn;.
11de0 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f  .comp = SSL_get_
11df0 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73  current_compress
11e00 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20  ion(ssl);..expn 
11e10 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
11e20 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29  t_expansion(ssl)
11e30 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  ;...LAPPEND_STR(
11e40 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11e50 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63  "compression", c
11e60 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  omp ? SSL_COMP_g
11e70 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20  et_name(comp) : 
11e80 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41  "none", -1);..LA
11e90 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11ea0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e  , objPtr, "expan
11eb0 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53  sion", expn ? SS
11ec0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
11ed0 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  expn) : "none", 
11ee0 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50  -1);.#else..LAPP
11ef0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11f00 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
11f10 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  sion", "none", -
11f20 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
11f30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11f40 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e   "expansion", "n
11f50 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  one", -1);.#endi
11f60 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
11f70 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20  Server info */. 
11f80 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20     {..long mode 
11f90 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65  = SSL_CTX_get_se
11fa0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
11fb0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
11fc0 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69  ..char *msg;...i
11fd0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
11fe0 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a  SS_CACHE_OFF) {.
11ff0 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22  .    msg = "off"
12000 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12010 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12020 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20  CHE_CLIENT) {.. 
12030 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74     msg = "client
12040 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12050 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12060 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09  ACHE_SERVER) {..
12070 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65      msg = "serve
12080 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  r";..} else if (
12090 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
120a0 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20  CACHE_BOTH) {.. 
120b0 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b     msg = "both";
120c0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
120d0 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  msg = "unknown";
120e0 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  ..}..LAPPEND_STR
120f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12100 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f   "session_cache_
12110 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b  mode", msg, -1);
12120 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
12130 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a  A List */.    /*
12140 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72   IF not a server
12150 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65  , same as SSL_ge
12160 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e  t0_peer_CA_list.
12170 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20   If server same 
12180 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63  as SSL_CTX_get_c
12190 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f  lient_CA_list */
121a0 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54  .    listPtr = T
121b0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
121c0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43   NULL);.    STAC
121d0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20  K_OF(X509_NAME) 
121e0 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66  *ca_list;.    if
121f0 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c   ((ca_list = SSL
12200 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _get_client_CA_l
12210 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c  ist(ssl)) != NUL
12220 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65  L) {..char buffe
12230 72 5b 42 55 46 53 49 5a 5d 3b 0a 0a 09 66 6f 72  r[BUFSIZ];...for
12240 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
12250 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
12260 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29  m(ca_list); i++)
12270 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d   {..    X509_NAM
12280 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30  E *name = sk_X50
12290 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f  9_NAME_value(ca_
122a0 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69  list, i);..    i
122b0 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30  f (name) {...X50
122c0 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e  9_NAME_oneline(n
122d0 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46  ame, buffer, BUF
122e0 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  SIZ);...Tcl_List
122f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12300 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
12310 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12320 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
12330 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
12340 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
12350 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12360 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50   "caList", listP
12370 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  tr);.    LAPPEND
12380 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
12390 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e  Ptr, "caListCoun
123a0 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  t", sk_X509_NAME
123b0 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a  _num(ca_list));.
123c0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
123d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
123e0 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
123f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
12400 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12440 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
12450 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
12460 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
12470 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
12480 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
12490 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
124a0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
124b0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
124c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
124f0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
12500 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
12510 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
12520 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
12530 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
12540 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
12550 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
12560 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
12570 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
12580 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
12590 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
125a0 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
125b0 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
125c0 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
125d0 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b     Tcl_Size cmd;
125e0 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a  .    int isStr;.
125f0 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
12600 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69  16384];.    (voi
12610 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
12620 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
12630 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
12640 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
12650 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
12660 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
12670 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
12680 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
12690 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
126a0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
126b0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
126c0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
126d0 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
126e0 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
126f0 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
12700 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
12710 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
12720 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
12730 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
12740 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
12750 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
12760 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
12770 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
12780 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
12790 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
127a0 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
127b0 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
127c0 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
127d0 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
127e0 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63  **listv;..    Tc
127f0 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20  l_Size listc;.. 
12800 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20     int i;...    
12810 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
12820 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
12830 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
12840 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
12850 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
12860 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
12870 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
12880 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
12890 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
128a0 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23  l=0,days=365;..#
128b0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
128c0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
128d0 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
128e0 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
128f0 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
12900 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
12910 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
12920 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
12930 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
12940 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
12950 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
12960 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
12970 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
12980 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
12990 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
129a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
129b0 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
129c0 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
129d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
129e0 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
129f0 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
12a00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12a10 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
12a20 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
12a30 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
12a40 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
12a50 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
12a60 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
12a70 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
12a80 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
12a90 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
12aa0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
12ab0 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
12ac0 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
12ad0 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
12ae0 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
12af0 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26  terp, objv[5], &
12b00 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
12b10 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
12b20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
12b30 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
12b40 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
12b50 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
12b60 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
12b70 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
12b80 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
12b90 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
12ba0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
12bb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12bc0 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
12bd0 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
12be0 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
12bf0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
12c00 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
12c10 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
12c20 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
12c30 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12c40 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
12c50 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
12c60 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
12c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
12c80 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
12c90 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
12ca0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
12cb0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
12cc0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
12cd0 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
12ce0 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
12cf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
12d00 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
12d10 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
12d20 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
12d30 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
12d40 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
12d50 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
12d60 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
12d70 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
12d80 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
12d90 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
12da0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
12db0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
12dc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
12dd0 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
12de0 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
12df0 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
12e00 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
12e10 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12e20 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12e30 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12e40 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
12e50 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
12e60 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
12e70 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12e80 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
12e90 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
12ea0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
12eb0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
12ec0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
12ed0 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
12ee0 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
12ef0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
12f00 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
12f10 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
12f20 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12f30 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
12f40 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
12f50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12f60 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
12f70 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
12f80 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
12f90 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
12fa0 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
12fb0 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
12fc0 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
12fd0 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
12fe0 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
12ff0 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
13000 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
13010 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
13020 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
13030 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
13040 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
13050 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
13060 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
13070 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
13080 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
13090 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
130a0 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
130b0 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
130c0 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
130d0 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
130e0 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
130f0 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
13100 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
13110 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
13120 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
13130 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
13140 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
13150 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
13160 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
13170 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
13180 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
13190 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
131a0 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
131b0 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
131c0 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
131d0 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
131e0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
131f0 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
13200 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
13210 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
13220 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
13230 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
13240 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
13250 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
13260 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
13270 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
13280 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
13290 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
132a0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
132b0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
132c0 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
132d0 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
132e0 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
132f0 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
13300 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
13310 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
13320 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
13330 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
13340 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
13350 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
13360 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
13370 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
13380 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
13390 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
133a0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
133b0 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
133c0 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
133d0 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
133e0 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
133f0 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
13400 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
13410 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
13420 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
13430 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
13440 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
13450 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
13460 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
13470 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
13480 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
13490 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
134a0 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
134b0 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
134c0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
134d0 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
134e0 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
134f0 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
13500 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
13510 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
13520 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13530 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13540 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
13550 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
13560 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13570 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ROR;...}....X509
13580 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
13590 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
135a0 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
135b0 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
135c0 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
135d0 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
135e0 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
135f0 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
13600 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
13610 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
13620 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
13630 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
13640 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
13650 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
13660 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
13670 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
13680 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
13690 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
136a0 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
136b0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
136c0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
136d0 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
136e0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
136f0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
13700 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
13710 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13720 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13730 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
13740 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
13750 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
13760 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
13770 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13780 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13790 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
137a0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
137b0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
137c0 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
137d0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
137e0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
137f0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
13800 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
13810 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
13820 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
13830 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
13840 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
13850 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
13860 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
13870 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
13880 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
13890 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
138a0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
138b0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
138c0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
138d0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
138e0 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
138f0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13900 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13910 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
13920 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
13930 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
13940 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
13950 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
13960 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
13970 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
13980 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
13990 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
139a0 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
139b0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
139c0 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
139d0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
139e0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
139f0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
13a00 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
13a10 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
13a20 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
13a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13a40 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
13a50 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
13a60 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
13a70 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
13a80 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
13a90 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
13aa0 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
13ab0 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
13ac0 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
13ad0 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
13ae0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
13af0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
13b00 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
13b10 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
13b20 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
13b30 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
13b40 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
13b50 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
13b60 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
13b70 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
13b80 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
13b90 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
13ba0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
13bb0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
13bc0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
13bd0 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
13be0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
13bf0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
13c00 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
13c10 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
13c20 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
13c30 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
13c40 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
13c50 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
13c60 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
13c70 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
13c80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  TCL_OK;.}.../***
13c90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13ca0 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
13cb0 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
13cd0 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13d20 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
13d30 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
13d40 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
13d50 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
13d60 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
13d70 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
13d80 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
13d90 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
13da0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
13db0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
13dc0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
13dd0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
13de0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
13df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
13e30 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f  id.Tls_Free(tls_
13e40 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b  free_type *block
13e50 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
13e60 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
13e70 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
13e80 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13e90 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
13ea0 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
13eb0 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
13ec0 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
13ed0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f10 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
13f20 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
13f30 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
13f40 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
13f50 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
13f60 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
13f70 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
13f80 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
13f90 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
13fa0 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
13fb0 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
13fc0 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
13fd0 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
13fe0 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
13ff0 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
14000 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
14010 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
14020 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14030 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
14040 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14080 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
14090 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
140a0 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
140b0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
140c0 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
140d0 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
140e0 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
140f0 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
14100 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
14110 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
14120 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
14130 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
14140 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
14150 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
14160 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
14170 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
14180 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
14190 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
141a0 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
141b0 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
141c0 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
141d0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
141e0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
141f0 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
14200 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
14210 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
14220 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
14230 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
14240 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
14250 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
14260 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
14270 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
14280 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
14290 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
142a0 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
142b0 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
142c0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
142d0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
142e0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
142f0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
14300 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14310 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
14320 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
14330 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
14340 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
14350 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14360 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
14370 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
14380 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
14390 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
143a0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
143b0 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
143c0 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
143d0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
143e0 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
143f0 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
14400 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
14410 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
14420 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14430 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
14440 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
14450 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
14460 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
14470 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
14480 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
14490 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
144a0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
144b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144f0 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66  . *. * Build Inf
14500 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a  o Command --. *.
14510 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e   *.Create comman
14520 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c  d to return buil
14530 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61  d info for packa
14540 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ge.. *. * Result
14550 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
14560 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20   Tcl result. *. 
14570 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14580 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64   *.Created build
14590 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20  -info command.. 
145a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
145f0 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46  #ifndef STRINGIF
14600 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  Y.#  define STRI
14610 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49  NGIFY(x) STRINGI
14620 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65  FY1(x).#  define
14630 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23   STRINGIFY1(x) #
14640 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75  x.#endif..int.Bu
14650 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54  ildInfoCommand(T
14660 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72  cl_Interp* inter
14670 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64  p) {.    Tcl_Cmd
14680 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
14690 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if (Tcl_GetComma
146a0 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22  ndInfo(interp, "
146b0 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66  ::tcl::build-inf
146c0 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54  o", &info)) {..T
146d0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
146e0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
146f0 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c  ls::build-info",
14700 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28   info.objProc, (
14710 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41  void *)(...PACKA
14720 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53  GE_VERSION "+" S
14730 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52  TRINGIFY(TLS_VER
14740 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64  SION_UUID).#if d
14750 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
14760 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) && defined(__c
14770 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09  lang_major__)...
14780 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53  .    ".clang-" S
14790 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
147a0 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f  _major__).#if __
147b0 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20  clang_minor__ < 
147c0 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65  10....    "0".#e
147d0 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49  ndif....    STRI
147e0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69  NGIFY(__clang_mi
147f0 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  nor__).#endif.#i
14800 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
14810 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e  splus) && !defin
14820 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09  ed(__OBJC__)....
14830 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22      ".cplusplus"
14840 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
14850 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e  NDEBUG....    ".
14860 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69  debug".#endif.#i
14870 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  f !defined(__cla
14880 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  ng__) && !define
14890 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  d(__INTEL_COMPIL
148a0 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ER) && defined(_
148b0 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20  _GNUC__)....    
148c0 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".gcc-" STRINGIF
148d0 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20  Y(__GNUC__).#if 
148e0 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c  __GNUC_MINOR__ <
148f0 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
14900 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
14910 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49  INGIFY(__GNUC_MI
14920 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  NOR__).#endif.#i
14930 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  fdef __INTEL_COM
14940 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69  PILER....    ".i
14950 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
14960 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
14970 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
14980 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09  CL_MEM_DEBUG....
14990 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a      ".memdebug".
149a0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
149b0 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09  ed(_MSC_VER)....
149c0 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52      ".msvc-" STR
149d0 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29  INGIFY(_MSC_VER)
149e0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55  .#endif.#ifdef U
149f0 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20  SE_NMAKE....    
14a00 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a  ".nmake".#endif.
14a10 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f  #ifndef TCL_CFG_
14a20 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20  OPTIMIZED....   
14a30 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a   ".no-optimize".
14a40 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
14a50 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e  OBJC__....    ".
14a60 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66  objective-c".#if
14a70 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
14a80 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c  plus)....    "pl
14a90 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23  usplus".#endif.#
14aa0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
14ab0 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09  _CFG_PROFILED...
14ac0 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a  .    ".profile".
14ad0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55  #endif.#ifdef PU
14ae0 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75  RIFY....    ".pu
14af0 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66  rify".#endif.#if
14b00 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44  def STATIC_BUILD
14b10 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63  ....    ".static
14b20 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55  ".#endif...), NU
14b30 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  LL);.    }.    r
14b40 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
14b50 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 70 74  ../* Init script
14b60 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74   */.static const
14b70 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74   char tlsTclInit
14b80 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e  Script[] = {.#in
14b90 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68  clude "tls.tcl.h
14ba0 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ".};../*. *-----
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
14bf0 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d  *. * Tls_Init --
14c00 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61  . *. *.This is a
14c10 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c   package initial
14c20 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72  ization procedur
14c30 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c  e, which is call
14c40 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65  ed. *.by Tcl whe
14c50 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69  n this package i
14c60 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  s to be added to
14c70 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e   an interpreter.
14c80 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20  . *. * Results: 
14c90 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20   Ssl configured 
14ca0 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a  and loaded. *. *
14cb0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14cc0 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73  *. create the ss
14cd0 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69  l command, initi
14ce0 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78  alize ssl contex
14cf0 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  t. *. *---------
14d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
14d40 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  #if TCL_MAJOR_VE
14d50 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69 6e  RSION > 8.#defin
14d60 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 39  e MIN_VERSION "9
14d70 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .0".#else.#defin
14d80 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22 38  e MIN_VERSION "8
14d90 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c 45  .5".#endif..DLLE
14da0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e  XPORT int Tls_In
14db0 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
14dc0 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64 70  nterp) {..    dp
14dd0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
14de0 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43 4c  ..#ifdef USE_TCL
14df0 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28 54  _STUBS.    if (T
14e00 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e 74  cl_InitStubs(int
14e10 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e  erp, MIN_VERSION
14e20 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  , 0) == NULL) {.
14e30 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
14e40 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
14e50 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52      if (Tcl_PkgR
14e60 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22  equire(interp, "
14e70 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  Tcl", MIN_VERSIO
14e80 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  N, 0) == NULL) {
14e90 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
14ea0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
14eb0 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 30 29  f (TlsLibInit(0)
14ec0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   != TCL_OK) {..T
14ed0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
14ee0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e  interp, "could n
14ef0 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53  ot initialize SS
14f00 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61  L library", (cha
14f10 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
14f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14f30 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72     }..    Tcl_Cr
14f40 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
14f50 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63  nterp, "::tls::c
14f60 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f 6e 6e  onnection", Conn
14f70 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
14f80 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
14f90 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
14fa0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
14fb0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
14fc0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
14fd0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e 64 73  p, "::tls::hands
14fe0 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b 65  hake", Handshake
14ff0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15000 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
15010 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15020 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15030 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15040 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
15050 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74  :import", Import
15060 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15070 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
15080 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15090 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
150a0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
150b0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
150c0 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
150d0 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
150e0 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
150f0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
15100 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
15110 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
15120 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69  erp, "::tls::uni
15130 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74  mport", Unimport
15140 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15150 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
15160 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15170 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15180 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15190 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
151a0 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70  :unstack", Unimp
151b0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
151c0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
151d0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
151e0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
151f0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15200 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
15210 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61  ls::status", Sta
15220 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  tusObjCmd, (Clie
15230 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
15240 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15250 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20   *) NULL);..    
15260 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64  BuildInfoCommand
15270 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c  (interp);.    Tl
15280 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73  s_DigestCommands
15290 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c  (interp);.    Tl
152a0 73 5f 45 6e 63 72 79 70 74 43 6f 6d 6d 61 6e 64  s_EncryptCommand
152b0 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  s(interp);.    T
152c0 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73 28  ls_InfoCommands(
152d0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73  interp);.    Tls
152e0 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 69 6e 74  _KDFCommands(int
152f0 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 52 61  erp);.    Tls_Ra
15300 6e 64 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72  ndCommands(inter
15310 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74  p);..    if (int
15320 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28  erp && Tcl_Eval(
15330 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e  interp, tlsTclIn
15340 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c  itScript) != TCL
15350 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
15360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
15370 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
15380 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
15390 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c  p, PACKAGE_NAME,
153a0 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
153b0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
153c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
153f0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66  -*. *. *.Tls_Saf
15400 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  eInit --. *. *.-
15410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15430 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15440 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f  . *.Standard pro
15450 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20  cedure required 
15460 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e  by 'load'.. *.In
15470 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65  itializes this e
15480 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73  xtension for a s
15490 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  afe interpreter.
154a0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
154b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
154d0 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
154e0 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73   effects:. *..As
154f0 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20   of 'Tls_Init'. 
15500 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
15510 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
15520 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20  error code.. *. 
15530 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15560 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 44 4c  -------*. */..DL
15570 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
15580 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
15590 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
155a0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
155b0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
155c0 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70   Tls_Init(interp
155d0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15610 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49  -*. *. *.TlsLibI
15620 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
15660 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  *.Initializes SS
15670 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70  L library once p
15680 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  er application. 
15690 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
156d0 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74  ffects:. *..init
156e0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
156f0 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  ary. *. *.Result
15700 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  :. *..none. *. *
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 0a 73 74 61  ------*. */..sta
15750 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e  tic int TlsLibIn
15760 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c  it(int uninitial
15770 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69  ize) {.    stati
15780 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65  c int initialize
15790 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73  d = 0;.    int s
157a0 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  tatus = TCL_OK;.
157b0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
157c0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
157d0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
157e0 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20  ADS).    size_t 
157f0 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69  num_locks;.#endi
15800 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69  f..    if (unini
15810 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28  tialize) {..if (
15820 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
15830 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73  .    dprintf("As
15840 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15850 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20  ize, but we are 
15860 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22  not initialized"
15870 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20  );...    return 
15880 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72  TCL_OK;..}...dpr
15890 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
158a0 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a  ninitialize");..
158b0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
158c0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
158d0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
158e0 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c  ADS)..Tcl_MutexL
158f0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a  ock(&init_mx);..
15900 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20  .if (locks) {.. 
15910 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a     free(locks);.
15920 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c  .    locks = NUL
15930 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75  L;..    locksCou
15940 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69  nt = 0;..}.#endi
15950 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  f..initialized =
15960 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   0;..#if defined
15970 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
15980 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
15990 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
159a0 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
159b0 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72  _mx);.#endif...r
159c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20  eturn TCL_OK;.  
159d0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69    }..    if (ini
159e0 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72  tialized) {..dpr
159f0 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75  intf("Called, bu
15a00 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76  t using cached v
15a10 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20  alue");..return 
15a20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20  status;.    }.. 
15a30 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
15a40 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ed");..#if defin
15a50 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15a60 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15a70 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
15a80 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
15a90 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
15aa0 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20      initialized 
15ab0 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  = 1;..#if define
15ac0 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15ad0 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15ae0 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e  L_THREADS).    n
15af0 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20  um_locks = 1;.  
15b00 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28    locksCount = (
15b10 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a  int) num_locks;.
15b20 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c      locks = mall
15b30 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73  oc(sizeof(*locks
15b40 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a  ) * num_locks);.
15b50 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73      memset(locks
15b60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63  , 0, sizeof(*loc
15b70 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
15b80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
15b90 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48   Initialize BOTH
15ba0 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c   libcrypto and l
15bb0 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50  ibssl. */.    OP
15bc0 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f  ENSSL_init_ssl(O
15bd0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15be0 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f  _SSL_STRINGS | O
15bf0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
15c00 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a  _CRYPTO_STRINGS.
15c10 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f  .| OPENSSL_INIT_
15c20 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20  ADD_ALL_CIPHERS 
15c30 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
15c40 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20  DD_ALL_DIGESTS, 
15c50 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f  NULL);..    BIO_
15c60 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29  new_tcl(NULL, 0)
15c70 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15c80 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15c90 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15ca0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
15cb0 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69  MutexUnlock(&ini
15cc0 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  t_mx);.#endif.. 
15cd0 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 75 73     return status
15ce0 3b 0a 7d 0a                                      ;.}.