Hex Artifact Content

Artifact 2435fc4bffae94a53437e56082a980cb302599811f3010668c256b4dd7f52a2b:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75  crypto.h>.#inclu
03a0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e  de <openssl/ssl.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03c0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e 63  nssl/evp.h>.#inc
03d0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 62  lude <openssl/ob
03e0: 6a 65 63 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  jects.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 2f 2a 0a 20 2a 20 45 78 74 65 72 6e 61 6c 20 66  /*. * External f
04b0: 75 6e 63 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 2f 2a  unctions. */../*
04c0: 0a 20 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  . * Forward decl
04d0: 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64  arations. */..#d
04e0: 65 66 69 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64  efine F2N(key, d
04f0: 73 70 29 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d  sp) \..(((key) =
0500: 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68 61 72 20  = NULL) ? (char 
0510: 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09 09 54 63  *) NULL : \...Tc
0520: 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69 6c 65 4e  l_TranslateFileN
0530: 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 6b 65 79  ame(interp, (key
0540: 29 2c 20 28 64 73 70 29 29 29 0a 0a 73 74 61 74  ), (dsp)))..stat
0550: 69 63 20 53 53 4c 5f 43 54 58 20 2a 43 54 58 5f  ic SSL_CTX *CTX_
0560: 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74  Init(State *stat
0570: 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76  ePtr, int isServ
0580: 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63  er, int proto, c
0590: 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63 68 61 72  har *key,...char
05a0: 20 2a 63 65 72 74 66 69 6c 65 2c 20 75 6e 73 69   *certfile, unsi
05b0: 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 5f 61  gned char *key_a
05c0: 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  sn1, unsigned ch
05d0: 61 72 20 2a 63 65 72 74 5f 61 73 6e 31 2c 0a 09  ar *cert_asn1,..
05e0: 09 69 6e 74 20 6b 65 79 5f 61 73 6e 31 5f 6c 65  .int key_asn1_le
05f0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 61 73 6e 31  n, int cert_asn1
0600: 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70 61  _len, char *CApa
0610: 74 68 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65  th, char *CAfile
0620: 2c 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65 72  ,...char *cipher
0630: 73 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  s, char *ciphers
0640: 75 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c  uites, int level
0650: 2c 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73  , char *DHparams
0660: 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54  );..static int.T
0670: 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
0680: 69 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64  initialize);..#d
0690: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
06a0: 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69  SSL2..0x01.#defi
06b0: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  ne TLS_PROTO_SSL
06c0: 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20  3..0x02.#define 
06d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09  TLS_PROTO_TLS1..
06e0: 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x04.#define TLS
06f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78  _PROTO_TLS1_1.0x
0700: 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  08.#define TLS_P
0710: 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30  ROTO_TLS1_2.0x10
0720: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0730: 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23  TO_TLS1_3.0x20.#
0740: 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66  define ENABLED(f
0750: 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c  lag, mask).(((fl
0760: 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d  ag) & (mask)) ==
0770: 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e   (mask))..#defin
0780: 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09  e SSLKEYLOGFILE.
0790: 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22  ."SSLKEYLOGFILE"
07a0: 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 2d 53  ../*. * Thread-S
07b0: 61 66 65 20 54 4c 53 20 43 6f 64 65 0a 20 2a 2f  afe TLS Code. */
07c0: 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 54 48 52  ..#ifdef TCL_THR
07d0: 45 41 44 53 0a 23 64 65 66 69 6e 65 20 4f 50 45  EADS.#define OPE
07e0: 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44 45 46 49  NSSL_THREAD_DEFI
07f0: 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  NES.#include <op
0800: 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e  enssl/opensslcon
0810: 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20 4f 50 45  f.h>..#ifdef OPE
0820: 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a 23 69 6e  NSSL_THREADS.#in
0830: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63  clude <openssl/c
0840: 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64  rypto.h>.#includ
0850: 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e 68  e <openssl/ssl.h
0860: 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61 64 65  >../*. * Threade
0870: 64 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 71 75  d operation requ
0880: 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20 63 61 6c  ires locking cal
0890: 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73 65 64 20  lbacks. * Based 
08a0: 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f 63 72 79  from /crypto/cry
08b0: 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70 65 6e 53  ptlib.c of OpenS
08c0: 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e 53 53 4c  SL and NSOpenSSL
08d0: 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 54 63  .. */..static Tc
08e0: 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b 73 20 3d  l_Mutex *locks =
08f0: 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63 20 69 6e   NULL;.static in
0900: 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30  t locksCount = 0
0910: 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75 74  ;.static Tcl_Mut
0920: 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64  ex init_mx;.#end
0930: 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c 5f 54 48  if /* OPENSSL_TH
0940: 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64 69 66 20  READS */.#endif 
0950: 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44 53 20 2a  /* TCL_THREADS *
0960: 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /..../**********
0970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43  **********/./* C
0980: 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20 20  allbacks        
0990: 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
09a0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09f0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20 43  ---. *. * Eval C
0a00: 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64 20  allback Command 
0a10: 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63 61  --. *. *.Eval ca
0a20: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 61  llback command a
0a30: 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72 72  nd catch any err
0a40: 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ors. *. * Result
0a50: 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e  s:. *.0 = Comman
0a60: 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c 20  d returned fail 
0a70: 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64  or eval returned
0a80: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31 20   TCL_ERROR. *.1 
0a90: 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  = Command return
0aa0: 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65 76  ed success or ev
0ab0: 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c 5f  al returned TCL_
0ac0: 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  OK. *. * Side ef
0ad0: 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75 61  fects:. *.Evalua
0ae0: 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  tes callback com
0af0: 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  mand. *. *------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
0b40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76 61  /.static int.Eva
0b50: 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49 6e  lCallback(Tcl_In
0b60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53 74  terp *interp, St
0b70: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54  ate *statePtr, T
0b80: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29 20  cl_Obj *cmdPtr) 
0b90: 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20  {.    int code, 
0ba0: 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ok = 0;..    dpr
0bb0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
0bc0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
0bd0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
0be0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
0bf0: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
0c00: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
0c10: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
0c20: 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63 63  llback with succ
0c30: 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65  ess for ok or re
0c40: 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 61  turn value 1, fa
0c50: 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20  il for error or 
0c60: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20 2a  return value 0 *
0c70: 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  /.    Tcl_ResetR
0c80: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
0c90: 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76     code = Tcl_Ev
0ca0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
0cb0: 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c  cmdPtr, TCL_EVAL
0cc0: 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64 70  _GLOBAL);.    dp
0cd0: 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c 62  rintf("EvalCallb
0ce0: 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29 3b  ack: %d", code);
0cf0: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
0d00: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20 43   TCL_OK) {../* C
0d10: 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72 20  heck result for 
0d20: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  return value */.
0d30: 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74  .Tcl_Obj *result
0d40: 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73   = Tcl_GetObjRes
0d50: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69 66  ult(interp);..if
0d60: 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c 4c   (result == NULL
0d70: 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72   || Tcl_GetIntFr
0d80: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72 65  omObj(interp, re
0d90: 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54 43  sult, &ok) != TC
0da0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b 20  L_OK) {..    ok 
0db0: 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74 66  = 1;..}..dprintf
0dc0: 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20 6f  ("Result: %d", o
0dd0: 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  k);.    } else {
0de0: 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65 6a  ../* Error - rej
0df0: 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69 63  ect the certific
0e00: 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  ate */..dprintf(
0e10: 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  "Tcl_BackgroundE
0e20: 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43 4c  rror");.#if (TCL
0e30: 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d  _MAJOR_VERSION =
0e40: 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e  = 8) && (TCL_MIN
0e50: 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a  OR_VERSION < 6).
0e60: 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45  .Tcl_BackgroundE
0e70: 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65  rror(interp);.#e
0e80: 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f  lse..Tcl_Backgro
0e90: 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74  undException(int
0ea0: 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64  erp, code);.#end
0eb0: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  if.    }..    Tc
0ec0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
0ed0: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
0ee0: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
0ef0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
0f00: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
0f10: 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn ok;.}.../*. *
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43 61  ---. *. * InfoCa
0f70: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
0f80: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f 6e  Monitors SSL con
0f90: 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73 0a  nection process.
0fa0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
0fb0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
0fc0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
0fd0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
0fe0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d   defined). *. *-
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  --. */.static vo
1040: 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 28  id.InfoCallback(
1050: 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20  const SSL *ssl, 
1060: 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20 72  int where, int r
1070: 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  et) {.    State 
1080: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
1090: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
10a0: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29  data((SSL *)ssl)
10b0: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
10c0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
10d0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
10e0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
10f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d 61 6a 6f  ;.    char *majo
1100: 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f 72 3b 0a  r; char *minor;.
1110: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1120: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
1130: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1140: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1150: 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a  )NULL)..return;.
1160: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1170: 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b   SSL_CB_HANDSHAK
1180: 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f  E_START) {..majo
1190: 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65 22 3b  r = "handshake";
11a0: 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74 61 72 74  ..minor = "start
11b0: 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ";.    } else if
11c0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
11d0: 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29  _HANDSHAKE_DONE)
11e0: 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e   {..major = "han
11f0: 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20  dshake";..minor 
1200: 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20  = "done";.    } 
1210: 65 6c 73 65 20 7b 0a 09 69 66 20 28 77 68 65 72  else {..if (wher
1220: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1230: 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72  )..major = "aler
1240: 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68  t";..else if (wh
1250: 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e  ere & SSL_ST_CON
1260: 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63  NECT).major = "c
1270: 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73 65 20 69  onnect";..else i
1280: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53  f (where & SSL_S
1290: 54 5f 41 43 43 45 50 54 29 09 09 6d 61 6a 6f 72  T_ACCEPT)..major
12a0: 20 3d 20 22 61 63 63 65 70 74 22 3b 0a 09 65 6c   = "accept";..el
12b0: 73 65 09 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22  se.....major = "
12c0: 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28  unknown";...if (
12d0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 52  where & SSL_CB_R
12e0: 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72  EAD)..minor = "r
12f0: 65 61 64 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ead";..else if (
1300: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 57  where & SSL_CB_W
1310: 52 49 54 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22  RITE)..minor = "
1320: 77 72 69 74 65 22 3b 0a 09 65 6c 73 65 20 69 66  write";..else if
1330: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1340: 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20  _LOOP)..minor = 
1350: 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66  "loop";..else if
1360: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1370: 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20  _EXIT)..minor = 
1380: 22 65 78 69 74 22 3b 0a 09 65 6c 73 65 09 09 09  "exit";..else...
1390: 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f  ..minor = "unkno
13a0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
13b0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
13c0: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
13d0: 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20  n, chan, major, 
13e0: 6d 69 6e 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20  minor, message, 
13f0: 61 6e 64 20 74 79 70 65 20 61 72 67 73 20 2a 2f  and type args */
1400: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
1410: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
1420: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
1430: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
1440: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1450: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1460: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1470: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a  j("info", -1));.
1480: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1490: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14a0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
14b0: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
14c0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
14d0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
14e0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
14f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1500: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1510: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1520: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72  wStringObj(major
1530: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
1540: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1550: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1560: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1570: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29  ngObj(minor, -1)
1580: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72  );..    if (wher
1590: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
15a0: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
15b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
15c0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
15d0: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
15e0: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65  Obj(SSL_alert_de
15f0: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  sc_string_long(r
1600: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  et), -1));..Tcl_
1610: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1620: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1630: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
1640: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61  wStringObj(SSL_a
1650: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67  lert_type_string
1660: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29  _long(ret), -1))
1670: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
1680: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
1690: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
16a0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
16b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
16c0: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
16d0: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b  long(ssl), -1));
16e0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
16f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1700: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1710: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1720: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  o", -1));.    }.
1730: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
1740: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
1750: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1760: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
1770: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
1780: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
1790: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
17a0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
17b0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
17c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1800: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73  -----. *. * Mess
1810: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  ageCallback --. 
1820: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
1830: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  L protocol messa
1840: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ges. *. * Result
1850: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
1860: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
1870: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
1880: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
1890: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64  ------. */.#ifnd
18e0: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
18f0: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76  L_TRACE.static v
1900: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62  oid.MessageCallb
1910: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c  ack(int write_p,
1920: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e   int version, in
1930: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20  t content_type, 
1940: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c  const void *buf,
1950: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c   size_t len, SSL
1960: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67   *ssl, void *arg
1970: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
1980: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
1990: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
19a0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
19b0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
19c0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
19d0: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20  mdPtr;.    char 
19e0: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20  *ver, *type;.   
19f0: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63   BIO *bio;.    c
1a00: 68 61 72 20 62 75 66 66 65 72 5b 33 30 30 30 30  har buffer[30000
1a10: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d  ];.    buffer[0]
1a20: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
1a30: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
1a40: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
1a50: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
1a60: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65  l_Obj*)NULL)..re
1a70: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63  turn;..    switc
1a80: 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66  h(version) {.#if
1a90: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
1aa0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
1ab0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
1ac0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
1ad0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
1ae0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
1af0: 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09   SSL2_VERSION:..
1b00: 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09  ver = "SSLv2";..
1b10: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
1b20: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
1b30: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
1b40: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
1b50: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56  .    case SSL3_V
1b60: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1b70: 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a  SSLv3";..break;.
1b80: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1b90: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  TLS1_VERSION:..v
1ba0: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62  er = "TLSv1";..b
1bb0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1bc0: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_1_VERSION:..
1bd0: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b  ver = "TLSv1.1";
1be0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1bf0: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e  e TLS1_2_VERSION
1c00: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1c10: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  2";..break;.    
1c20: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53  case TLS1_3_VERS
1c30: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1c40: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.3";..break;. 
1c50: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20     case 0:..ver 
1c60: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b  = "none";..break
1c70: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
1c80: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ver = "unknown";
1c90: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
1ca0: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74      switch (cont
1cb0: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20  ent_type) {.    
1cc0: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41  case SSL3_RT_HEA
1cd0: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65  DER:..type = "He
1ce0: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  ader";..break;. 
1cf0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1d00: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59  INNER_CONTENT_TY
1d10: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e  PE:..type = "Inn
1d20: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22  er Content Type"
1d30: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1d40: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47  se SSL3_RT_CHANG
1d50: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09  E_CIPHER_SPEC:..
1d60: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43  type = "Change C
1d70: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a  ipher";..break;.
1d80: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1d90: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20  _ALERT:..type = 
1da0: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b  "Alert";..break;
1db0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1dc0: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1dd0: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1de0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1df0: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49  se SSL3_RT_APPLI
1e00: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79  CATION_DATA:..ty
1e10: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b  pe = "App Data";
1e20: 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f 50 45  ..break;.#if OPE
1e30: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
1e40: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
1e50: 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53 31  L.    case DTLS1
1e60: 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a 09  _RT_HEARTBEAT:..
1e70: 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65 61  type = "Heartbea
1e80: 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  t";..break;.#end
1e90: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
1ea0: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  .type = "unknown
1eb0: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  ";.    }..    /*
1ec0: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74   Needs compile t
1ed0: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62  ime option "enab
1ee0: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a  le-ssl-trace". *
1ef0: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d  /.    if ((bio =
1f00: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d   BIO_new(BIO_s_m
1f10: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20  em())) != NULL) 
1f20: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74  {..int n;..SSL_t
1f30: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65  race(write_p, ve
1f40: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74  rsion, content_t
1f50: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73  ype, buf, len, s
1f60: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29  sl, (void *)bio)
1f70: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28  ;..n = BIO_read(
1f80: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49 4f  bio, buffer, BIO
1f90: 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20  _pending(bio) < 
1fa0: 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64  15000 ? BIO_pend
1fb0: 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39 39  ing(bio) : 14999
1fc0: 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20  );..n = (n<0) ? 
1fd0: 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e  0 : n;..buffer[n
1fe0: 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49  ] = 0;..(void)BI
1ff0: 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42  O_flush(bio);..B
2000: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20  IO_free(bio);.  
2010: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2020: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
2030: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
2040: 20 64 69 72 65 63 74 69 6f 6e 2c 20 76 65 72 73   direction, vers
2050: 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e 64 20 6d  ion, type, and m
2060: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
2070: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
2080: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
2090: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
20a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
20b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
20c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
20d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
20e0: 22 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b  "message", -1));
20f0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2100: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2110: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
2120: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
2130: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
2140: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
2150: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
2160: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2180: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
2190: 65 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74  ewStringObj(writ
21a0: 65 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22  e_p ? "Sent" : "
21b0: 52 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b  Received", -1));
21c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
21d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
21e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
21f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76  l_NewStringObj(v
2200: 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  er, -1));.    Tc
2210: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2220: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2230: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2240: 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31  ringObj(type, -1
2250: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2260: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2270: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2280: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2290: 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a  j(buffer, -1));.
22a0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
22b0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
22c0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
22d0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
22e0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
22f0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
2300: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
2310: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2320: 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69  cmdPtr);.}.#endi
2330: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  f.../*. *-------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
2380: 20 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63   * VerifyCallbac
2390: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
23a0: 6f 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63  ors SSL certific
23b0: 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70  ate validation p
23c0: 72 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20  rocess. Used to 
23d0: 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62  control the. *.b
23e0: 65 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65  ehavior when the
23f0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
2400: 20 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68   flag is set. Th
2410: 69 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  is is called. *.
2420: 77 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69  whenever a certi
2430: 66 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63  ficate is inspec
2440: 74 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69  ted or decided i
2450: 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66  nvalid. Called f
2460: 6f 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69  or. *.each certi
2470: 66 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65  ficate in the ce
2480: 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20  rt chain.. *. * 
2490: 43 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69  Checks:. *.certi
24a0: 66 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20  ficate chain is 
24b0: 63 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67  checked starting
24c0: 20 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73   with the deepes
24d0: 74 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a  t nesting level.
24e0: 20 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43   *.  (the root C
24f0: 41 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61  A certificate) a
2500: 6e 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64  nd worked upward
2510: 20 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63   to the peer's c
2520: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41  ertificate.. *.A
2530: 6c 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72  ll signatures ar
2540: 65 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74  e valid, current
2550: 20 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20   time is within 
2560: 66 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76  first and last v
2570: 61 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a  alidity time.. *
2580: 09 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20  .Check that the 
2590: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
25a0: 73 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73  ssued by the iss
25b0: 75 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  uer certificate 
25c0: 69 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b  issuer.. *.Check
25d0: 20 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20   the revocation 
25e0: 73 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20  status for each 
25f0: 63 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09  certificate.. *.
2600: 43 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69  Check the validi
2610: 74 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ty of the given 
2620: 43 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74  CRL and the cert
2630: 20 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74   revocation stat
2640: 75 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  us.. *.Check the
2650: 20 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c   policies of all
2660: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
2670: 73 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09  s. *. * Args. *.
2680: 70 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64  preverify_ok ind
2690: 69 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74  icates whether t
26a0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76  he certificate v
26b0: 65 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73  erification pass
26c0: 65 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30  ed (1) or not (0
26d0: 29 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  ). *. * Results:
26e0: 0a 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62  . *.A callback b
26f0: 6f 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b  ound to the sock
2700: 65 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e  et may return on
2710: 65 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09  e of:. *.    0..
2720: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61  .- the certifica
2730: 74 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76  te is deemed inv
2740: 61 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66  alid, send verif
2750: 69 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20  ication. *....  
2760: 66 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f  failure alert to
2770: 20 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69   peer, and termi
2780: 6e 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a  nate handshake..
2790: 20 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65   *.    1...- the
27a0: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
27b0: 64 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f  deemed valid, co
27c0: 6e 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64  ntinue with hand
27d0: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d  shake.. *.    em
27e0: 70 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20  pty string.- no 
27f0: 63 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66  change to certif
2800: 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e  icate validation
2810: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
2820: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20  cts:. *.The err 
2830: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
2840: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65  rently operative
2850: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a   State is set. *
2860: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64  .  to a string d
2870: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53  escribing the SS
2880: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61  L negotiation fa
2890: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a  ilure reason. *.
28a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
28f0: 20 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62   int.VerifyCallb
2900: 61 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39  ack(int ok, X509
2910: 5f 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29  _STORE_CTX *ctx)
2920: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
2930: 63 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20  cmdPtr;.    SSL 
2940: 20 20 2a 73 73 6c 20 3d 20 28 53 53 4c 2a 29 58    *ssl = (SSL*)X
2950: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2960: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53  t_ex_data(ctx, S
2970: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58  SL_get_ex_data_X
2980: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64  509_STORE_CTX_id
2990: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20  x());.    X509  
29a0: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54  *cert..= X509_ST
29b0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72  ORE_CTX_get_curr
29c0: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20  ent_cert(ctx);. 
29d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
29e0: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr.= (State*)SSL
29f0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73  _get_app_data(ss
2a00: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
2a10: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
2a20: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
2a30: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
2a40: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
2a50: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
2a60: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
2a70: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
2a80: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
2a90: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
2aa0: 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64  "Called");.    d
2ab0: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61  printf("VerifyCa
2ac0: 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29  llback: %d", ok)
2ad0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
2ae0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
2af0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
2b00: 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 65 20  /* Use ok value 
2b10: 69 66 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  if verification 
2b20: 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 09  is required */..
2b30: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66  if (statePtr->vf
2b40: 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46  lags & SSL_VERIF
2b50: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
2b60: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72  R_CERT) {..    r
2b70: 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73  eturn ok;..} els
2b80: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
2b90: 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  1;..}.    } else
2ba0: 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c   if (cert == NUL
2bb0: 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c  L || ssl == NULL
2bc0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
2bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
2be0: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2bf0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b  k: eval callback
2c00: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  ");..    /* Crea
2c10: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2c20: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
2c30: 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e  , depth, cert in
2c40: 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c  fo list, status,
2c50: 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20   and error args 
2c60: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
2c70: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
2c80: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
2c90: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2ca0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2cb0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
2cc0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2cd0: 22 76 65 72 69 66 79 22 2c 20 2d 31 29 29 3b 0a  "verify", -1));.
2ce0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2cf0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2d00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63  erp, cmdPtr,..Tc
2d10: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
2d20: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
2d30: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
2d40: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
2d50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2d60: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2d70: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
2d80: 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a 20 20 20  Obj(depth));.   
2d90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2da0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2db0: 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73 5f 4e 65  , cmdPtr, Tls_Ne
2dc0: 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
2dd0: 20 63 65 72 74 29 29 3b 0a 20 20 20 20 54 63 6c   cert));.    Tcl
2de0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2df0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2e00: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
2e10: 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20 20 54 63  Obj(ok));.    Tc
2e20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2e30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2e40: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2e50: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
2e60: 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
2e70: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72  _error_string(er
2e80: 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  r), -1));..    /
2e90: 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f 20 77 68  * Prevent I/O wh
2ea0: 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ile callback is 
2eb0: 69 6e 20 70 72 6f 67 72 65 73 73 20 2a 2f 0a 20  in progress */. 
2ec0: 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e     /* statePtr->
2ed0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
2ee0: 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f 0a 0a 20  _CALLBACK; */.. 
2ef0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
2f00: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
2f10: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2f20: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
2f30: 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61   ok = EvalCallba
2f40: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
2f50: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
2f60: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2f70: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20  nt(cmdPtr);..   
2f80: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2f90: 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d 6d 61 6e  Callback: comman
2fa0: 64 20 72 65 73 75 6c 74 20 3d 20 25 64 22 2c 20  d result = %d", 
2fb0: 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 61  ok);..    /* sta
2fc0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20  tePtr->flags &= 
2fd0: 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41  ~(TLS_TCL_CALLBA
2fe0: 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
2ff0: 72 6e 20 6f 6b 3b 09 2f 2a 20 42 79 20 64 65 66  rn ok;./* By def
3000: 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72 69  ault, leave veri
3010: 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e 67  fication unchang
3020: 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  ed. */.}.../*. *
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45 72  ---. *. * Tls_Er
3080: 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c  ror --. *. *.Cal
3090: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ls callback with
30a0: 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 73 2e   list of errors.
30b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
30c0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20  cts:. *.The err 
30d0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
30e0: 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65  rently operative
30f0: 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a   State is set. *
3100: 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64  .  to a string d
3110: 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53  escribing the SS
3120: 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61  L negotiation fa
3130: 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a  ilure reason. *.
3140: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3180: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
3190: 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20 2a  ls_Error(State *
31a0: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a  statePtr, char *
31b0: 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49  msg) {.    Tcl_I
31c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
31d0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
31e0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
31f0: 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b  mdPtr, *listPtr;
3200: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .    unsigned lo
3210: 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74  ng err;.    stat
3220: 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b  ePtr->err = msg;
3230: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
3240: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
3250: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
3260: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
3270: 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b  *)NULL)..return;
3280: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
3290: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
32a0: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61  with fn, chan, a
32b0: 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20  nd message args 
32c0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
32d0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
32e0: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
32f0: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
3300: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3310: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3320: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3330: 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31 29  Obj("error", -1)
3340: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3350: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3360: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
3370: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
3380: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
3390: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
33a0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
33b0: 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d 20 4e      if (msg != N
33c0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  ULL) {..Tcl_List
33d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
33e0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
33f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3400: 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20  j(msg, -1));..  
3410: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 6d 73    } else if ((ms
3420: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
3430: 67 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75  g(Tcl_GetObjResu
3440: 6c 74 28 69 6e 74 65 72 70 29 29 29 20 21 3d 20  lt(interp))) != 
3450: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  NULL) {..Tcl_Lis
3460: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3470: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3480: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3490: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20  bj(msg, -1));.. 
34a0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73     } else {..lis
34b0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
34c0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
34d0: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45  .while ((err = E
34e0: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20  RR_get_error()) 
34f0: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  != 0) {..    Tcl
3500: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3510: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
3520: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  stPtr, Tcl_NewSt
3530: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73  ringObj(ERR_reas
3540: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
3550: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  err), -1));..}..
3560: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3570: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3580: 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72   cmdPtr, listPtr
3590: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
35a0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
35b0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
35c0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
35d0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
35e0: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
35f0: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
3600: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
3610: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3620: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3670: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  *. * KeyLogCallb
3680: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69  ack --. *. *.Wri
3690: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20  te received key 
36a0: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65  data to log file
36b0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
36c0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ects:. *.none. *
36d0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
3720: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63  KeyLogCallback(c
3730: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
3740: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29  onst char *line)
3750: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72   {.    char *str
3760: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59   = getenv(SSLKEY
3770: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49  LOGFILE);.    FI
3780: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72  LE *fd;..    dpr
3790: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
37a0: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a  .    if (str) {.
37b0: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c  .fd = fopen(str,
37c0: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28   "a");..fprintf(
37d0: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29  fd, "%s\n",line)
37e0: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20  ;..fclose(fd);. 
37f0: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3840: 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64  -. *. * Password
3850: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a   Callback --. *.
3860: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.Called when a
3870: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20   password for a 
3880: 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64  private key load
3890: 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45  ing/storing a PE
38a0: 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65  M. *.certificate
38b0: 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e   with encryption
38c0: 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b  . Evals callback
38d0: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75   script and retu
38e0: 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c  rns. *.the resul
38f0: 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72  t as the passwor
3900: 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e  d string in buf.
3910: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3920: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
3930: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
3940: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
3950: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
3960: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73   Returns:. *.Pas
3970: 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79  sword size in by
3980: 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e  tes or -1 for an
3990: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d   error.. *. *---
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39e0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
39f0: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
3a00: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20  (char *buf, int 
3a10: 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67  size, int rwflag
3a20: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b  , void *udata) {
3a30: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3a40: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29  ePtr.= (State *)
3a50: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f   udata;.    Tcl_
3a60: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
3a70: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
3a80: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
3a90: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
3aa0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e  code;..    dprin
3ab0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3ac0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
3ad0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
3ae0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
3af0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3b00: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
3b10: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
3b20: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3b30: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3b40: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3b50: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3b60: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3b70: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3b80: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
3b90: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63  erp);..    strnc
3ba0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
3bb0: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20  ze_t) size);..  
3bc0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74    return (int)st
3bd0: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c  rlen(ret);..} el
3be0: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
3bf0: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20   -1;..}.    }.. 
3c00: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3c10: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
3c20: 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e  h fn, rwflag, an
3c30: 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20  d size args */. 
3c40: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3c50: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3c60: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29  tePtr->password)
3c70: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3c80: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3c90: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3ca0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3cb0: 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29  "password", -1))
3cc0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3cd0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3ce0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3cf0: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66  cl_NewIntObj(rwf
3d00: 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  lag));.    Tcl_L
3d10: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3d20: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3d30: 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  tr, Tcl_NewIntOb
3d40: 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54  j(size));..    T
3d50: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
3d60: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
3d70: 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ;.    Tcl_Preser
3d80: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3d90: 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20  statePtr);..    
3da0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
3db0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
3dc0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
3dd0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f  (cmdPtr);.    co
3de0: 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  de = Tcl_EvalObj
3df0: 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  Ex(interp, cmdPt
3e00: 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  r, TCL_EVAL_GLOB
3e10: 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  AL);.    if (cod
3e20: 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23  e != TCL_OK) {.#
3e30: 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45  if (TCL_MAJOR_VE
3e40: 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28  RSION == 8) && (
3e50: 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f  TCL_MINOR_VERSIO
3e60: 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b  N < 6)..Tcl_Back
3e70: 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65  groundError(inte
3e80: 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f  rp);.#else..Tcl_
3e90: 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74  BackgroundExcept
3ea0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  ion(interp, code
3eb0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
3ec0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
3ed0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20  ount(cmdPtr);.. 
3ee0: 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28     Tcl_Release((
3ef0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
3f00: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ePtr);..    /* I
3f10: 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61  f successful, pa
3f20: 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64  ss back password
3f30: 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e   string and trun
3f40: 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67  cate if too long
3f50: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65   */.    if (code
3f60: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   == TCL_OK) {..T
3f70: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63 68  cl_Size len;..ch
3f80: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3f90: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3fa0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
3fb0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3fc0: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
3fd0: 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  n > (Tcl_Size) s
3fe0: 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65  ize-1) {..    le
3ff0: 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  n = (Tcl_Size) s
4000: 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63  ize-1;..}..strnc
4010: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
4020: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66  ze_t) len);..buf
4030: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54  [len] = '\0';..T
4040: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
4050: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
4060: 0a 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c  ..return (int) l
4070: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  en;.    }.    Tc
4080: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
4090: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
40a0: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d      return -1;.}
40b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
40c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
4100: 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61  * Session Callba
4110: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d  ck for Clients -
4120: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
4130: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  hen a new sessio
4140: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  n is added to th
4150: 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20  e cache. In TLS 
4160: 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20  1.3. *.this may 
4170: 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74  be received mult
4180: 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72  iple times after
4190: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20   the handshake. 
41a0: 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76  For. *.earlier v
41b0: 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69  ersions, this wi
41c0: 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64  ll be received d
41d0: 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68  uring the handsh
41e0: 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20  ake.. *.This is 
41f0: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61  the preferred wa
4200: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65  y to obtain a re
4210: 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e  sumable session.
4220: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
4230: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
4240: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
4250: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
4260: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
4270: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
4280: 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72  *.0 = error wher
4290: 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  e session will b
42a0: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  e immediately re
42b0: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69  moved from the i
42c0: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20  nternal cache.. 
42d0: 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68  *.1 = success wh
42e0: 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20  ere app retains 
42f0: 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69  session in sessi
4300: 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75  on cache, and mu
4310: 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53  st call SSL_SESS
4320: 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20  ION_free() when 
4330: 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  done.. *. *-----
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4380: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65  */.static int.Se
4390: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53  ssionCallback(SS
43a0: 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53  L *ssl, SSL_SESS
43b0: 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a  ION *session) {.
43c0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
43d0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr = (State*)SS
43e0: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28  L_get_app_data((
43f0: 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20  SSL *)ssl);.    
4400: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4410: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
4420: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
4430: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
4440: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4450: 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20  har *ticket;.   
4460: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4470: 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64  char *session_id
4480: 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e  ;.    size_t len
4490: 32 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  2;.    unsigned 
44a0: 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64  int ulen;..    d
44b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
44c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
44d0: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
44e0: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
44f0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4500: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4510: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c    } else if (ssl
4520: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
4530: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4540: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4550: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4560: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
4570: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65  ith fn, chan, se
4580: 73 73 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f  ssion id, sessio
4590: 6e 20 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69  n ticket, and li
45a0: 66 65 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20  fetime args */. 
45b0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
45c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
45d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
45e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
45f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4600: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4610: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4620: 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b  "session", -1));
4630: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4640: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4650: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
4660: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
4670: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
4680: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
4690: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20  >self), -1));.. 
46a0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64     /* Session id
46b0: 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f   */.    session_
46c0: 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
46d0: 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c  _get_id(session,
46e0: 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c   &ulen);.    Tcl
46f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4700: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4710: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  dPtr, Tcl_NewByt
4720: 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f  eArrayObj(sessio
4730: 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29  n_id, (Tcl_Size)
4740: 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a   ulen));..    /*
4750: 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
4760: 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49  */.    SSL_SESSI
4770: 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
4780: 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
4790: 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c   &len2);.    Tcl
47a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
47b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
47c0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74  dPtr, Tcl_NewByt
47d0: 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74  eArrayObj(ticket
47e0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
47f0: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66  2));..    /* Lif
4800: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f  etime - number o
4810: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20  f seconds */.   
4820: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4830: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4840: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
4850: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29  ewLongObj((long)
4860: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
4870: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
4880: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29  _hint(session)))
4890: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
48a0: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
48b0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
48c0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
48d0: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63  .    EvalCallbac
48e0: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
48f0: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20  tr, cmdPtr);.   
4900: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
4910: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
4920: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a  eturn 0;.}.../*.
4930: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4970: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e  -----. *. * ALPN
4980: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
4990: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61  rvers and NPN Ca
49a0: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
49b0: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  ts --. *. *.Perf
49c0: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74  orm protocol (ht
49d0: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
49e0: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20  etc.) selection 
49f0: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d  for the. *.incom
4a00: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ing connection. 
4a10: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c  Called after Hel
4a20: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61  lo and server ca
4a30: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72  llbacks.. *.Wher
4a40: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63  e 'out' is selec
4a50: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64  ted protocol and
4a60: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65   'in' is the pee
4a70: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73  r advertised lis
4a80: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
4a90: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
4aa0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4ab0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
4ac0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
4ad0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
4ae0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4af0: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74  RR_OK: ALPN prot
4b00: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54  ocol selected. T
4b10: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
4b20: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
4b30: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
4b40: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61  _FATAL: There wa
4b50: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74  s no overlap bet
4b60: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27  ween the client'
4b70: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65  s. *.    supplie
4b80: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73  d list and the s
4b90: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74  erver configurat
4ba0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ion. The connect
4bb0: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72  ion will be abor
4bc0: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ted.. *.SSL_TLSE
4bd0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c  XT_ERR_NOACK: AL
4be0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
4bf0: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20  selected, e.g., 
4c00: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a  because no ALPN.
4c10: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73   *.    protocols
4c20: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20   are configured 
4c30: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
4c40: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ion. The connect
4c50: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
4c60: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4cb0: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62  ic int.ALPNCallb
4cc0: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f  ack(SSL *ssl, co
4cd0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4ce0: 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65  r **out, unsigne
4cf0: 64 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a  d char *outlen,.
4d00: 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  .const unsigned 
4d10: 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e  char *in, unsign
4d20: 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f  ed int inlen, vo
4d30: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
4d40: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
4d50: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
4d60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d70: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
4d80: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
4d90: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
4da0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
4db0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4dc0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4dd0: 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c   (ssl == NULL ||
4de0: 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   arg == NULL) {.
4df0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4e00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4e10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65    }..    /* Sele
4e20: 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20  ct protocol */. 
4e30: 20 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63     if (SSL_selec
4e40: 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e  t_next_proto((un
4e50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 29 20  signed char **) 
4e60: 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61  out, outlen, sta
4e70: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73  tePtr->protos, s
4e80: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
4e90: 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29  len,..in, inlen)
4ea0: 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f   == OPENSSL_NPN_
4eb0: 4e 45 47 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f  NEGOTIATED) {../
4ec0: 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f  * Match found */
4ed0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
4ee0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
4ef0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e   else {../* OPEN
4f00: 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c  SSL_NPN_NO_OVERL
4f10: 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c  AP = No overlap,
4f20: 20 73 6f 20 75 73 65 20 66 69 72 73 74 20 69 74   so use first it
4f30: 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70  em from client p
4f40: 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a  rotocol list */.
4f50: 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58  .res = SSL_TLSEX
4f60: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
4f70: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
4f80: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
4f90: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
4fa0: 09 72 65 74 75 72 6e 20 72 65 73 3b 0a 20 20 20  .return res;.   
4fb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
4fc0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
4fd0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
4fe0: 20 64 65 70 74 68 2c 20 63 65 72 74 20 69 6e 66   depth, cert inf
4ff0: 6f 20 6c 69 73 74 2c 20 73 74 61 74 75 73 2c 20  o list, status, 
5000: 61 6e 64 20 65 72 72 6f 72 20 61 72 67 73 20 2a  and error args *
5010: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
5020: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5030: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
5040: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5050: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5060: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
5070: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5080: 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  alpn", -1));.   
5090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
50a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
50b0: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
50c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
50d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
50e0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
50f0: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
5100: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5110: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5120: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
5130: 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63  ringObj((const c
5140: 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29  har *) *out, -1)
5150: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5160: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5170: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
5180: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
5190: 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53  j(res == SSL_TLS
51a0: 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20  EXT_ERR_OK));.. 
51b0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
51c0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
51d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
51e0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
51f0: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
5200: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
5210: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
5220: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
5230: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5240: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65  R_NOACK;.    } e
5250: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
5260: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5270: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5280: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
5290: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
52a0: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20  R_ALERT_FATAL;. 
52b0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
52c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
52d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
52e0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 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 0a  ---------------.
5330: 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20   *. * Advertise 
5340: 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61  Protocols Callba
5350: 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74  ck for Next Prot
5360: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e  ocol Negotiation
5370: 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72   (NPN) in Server
5380: 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63  Hello --. *. *.c
5390: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53  alled when a TLS
53a0: 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20   server needs a 
53b0: 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65  list of supporte
53c0: 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20  d protocols for 
53d0: 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c  Next. *.Protocol
53e0: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a   Negotiation.. *
53f0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
5400: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5410: 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52  effects:. *. * R
5420: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
5430: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5440: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  K: NPN protocol 
5450: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
5460: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5470: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5480: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e  T_ERR_NOACK: NPN
5490: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65   protocol not se
54a0: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
54b0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
54c0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
54d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
54f0: 2d 2d 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 0a 20 2a 2f 0a 23  ----------. */.#
5510: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74  ifdef USE_NPN.st
5520: 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c  atic int.NPNCall
5530: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
5540: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ssl, const unsig
5550: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20  ned char **out, 
5560: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75  unsigned int *ou
5570: 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29  tlen, void *arg)
5580: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5590: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
55a0: 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e  )arg;..    dprin
55b0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
55c0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
55d0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
55e0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
55f0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5600: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5610: 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c   Set protocols l
5620: 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ist */.    if (s
5630: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
5640: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74  != NULL) {..*out
5650: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
5660: 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20  tos;..*outlen = 
5670: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
5680: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
5690: 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b   {..*out = NULL;
56a0: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09  ..*outlen = 0;..
56b0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
56c0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
56d0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53   }.    return SS
56e0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
56f0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
5700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5740: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43  ----. *. * SNI C
5750: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
5760: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72  ers --. *. *.Per
5770: 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65  form server-side
5780: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65   SNI hostname se
5790: 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65  lection after re
57a0: 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65  ceiving SNI exte
57b0: 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65  nsion. *.in Clie
57c0: 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64  nt Hello. Called
57d0: 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c   after hello cal
57e0: 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65  lback but before
57f0: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a   ALPN callback..
5800: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5810: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
5820: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
5830: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
5840: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
5850: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
5860: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
5870: 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  OK: SNI hostname
5880: 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68   is accepted. Th
5890: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
58a0: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
58b0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
58c0: 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e  FATAL: SNI hostn
58d0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70  ame is not accep
58e0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
58f0: 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62  ion. *.    is ab
5900: 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66  orted. Default f
5910: 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f  or alert is SSL_
5920: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5930: 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  NAME.. *.SSL_TLS
5940: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41  EXT_ERR_ALERT_WA
5950: 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e  RNING: SNI hostn
5960: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70  ame is not accep
5970: 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65  ted, warning ale
5980: 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28  rt. *.    sent (
5990: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
59a0: 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63   TLSv1.3). The c
59b0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
59c0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
59d0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e  XT_ERR_NOACK: SN
59e0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
59f0: 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e  t accepted and n
5a00: 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c  ot acknowledged,
5a10: 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20  . *.    e.g. if 
5a20: 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  SNI has not been
5a30: 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65   configured. The
5a40: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
5a50: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
5a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a80: 2d 2d 2d 2d 2d 2d 2d 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 0a  ---------------.
5aa0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
5ab0: 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  NICallback(const
5ac0: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a   SSL *ssl, int *
5ad0: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67  alert, void *arg
5ae0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
5af0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
5b00: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
5b10: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
5b20: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
5b30: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
5b40: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
5b50: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f  ode, res;.    co
5b60: 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65 72  nst char *server
5b70: 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  name = NULL;..  
5b80: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
5b90: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5ba0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5bb0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
5bc0: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5bd0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5be0: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72  .    /* Only wor
5bf0: 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20 61  ks for TLS 1.2 a
5c00: 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20  nd earlier */.  
5c10: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 53    servername = S
5c20: 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
5c30: 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
5c40: 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
5c50: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72 76  );.    if (!serv
5c60: 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65 72  ername || server
5c70: 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29  name[0] == '\0')
5c80: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5c90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5ca0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
5cb0: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
5cc0: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
5cd0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
5ce0: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5cf0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
5d00: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
5d10: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
5d20: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61  n, and server na
5d30: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  me args */.    c
5d40: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
5d50: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
5d60: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
5d70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5d80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5d90: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
5da0: 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d  ringObj("sni", -
5db0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5dc0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5dd0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5de0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
5df0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
5e00: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
5e10: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
5e20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5e30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5e40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
5e50: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
5e60: 73 65 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29  servername , -1)
5e70: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
5e80: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
5e90: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
5ea0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
5eb0: 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65 20  ;.    if ((code 
5ec0: 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69  = EvalCallback(i
5ed0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
5ee0: 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b   cmdPtr)) > 1) {
5ef0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5f00: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52  XT_ERR_ALERT_WAR
5f10: 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  NING;..*alert = 
5f20: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
5f30: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74  ZED_NAME; /* Not
5f40: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c   supported by TL
5f50: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65  S 1.3 */.    } e
5f60: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
5f70: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5f80: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5f90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
5fa0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5fb0: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09  R_ALERT_FATAL;..
5fc0: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f  *alert = SSL_AD_
5fd0: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5fe0: 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72  E; /* Not suppor
5ff0: 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a  ted by TLS 1.3 *
6000: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  /.    }.    Tcl_
6010: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
6020: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
6030: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
6040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48  --. *. * ClientH
6090: 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43  ello Handshake C
60a0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
60b0: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65  ers --. *. *.Use
60c0: 64 20 62 79 20 73 65 72 76 65 72 20 74 6f 20 65  d by server to e
60d0: 78 61 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65  xamine the serve
60e0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
60f0: 6e 20 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f  n (SNI) extensio
6100: 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79  n. *.provided by
6110: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f   the client in o
6120: 72 64 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61  rder to select a
6130: 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 65  n appropriate ce
6140: 72 74 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09  rtificate to. *.
6150: 70 72 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b  present, and mak
6160: 65 20 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72  e other configur
6170: 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74  ation adjustment
6180: 73 20 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68  s relevant to th
6190: 61 74 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d  at server. *.nam
61a0: 65 20 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67  e and its config
61b0: 75 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e  uration. This in
61c0: 63 6c 75 64 65 73 20 73 77 61 70 70 69 6e 67 20  cludes swapping 
61d0: 6f 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74  out the associat
61e0: 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f  ed. *.SSL_CTX po
61f0: 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67  inter, modifying
6200: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 6c 69   the server's li
6210: 73 74 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20  st of permitted 
6220: 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a  TLS versions,. *
6230: 09 63 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65  .changing the se
6240: 72 76 65 72 27 73 20 63 69 70 68 65 72 20 6c 69  rver's cipher li
6250: 73 74 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74  st in response t
6260: 6f 20 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63  o the client's c
6270: 69 70 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e  ipher list, etc.
6280: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72  . *.Called befor
6290: 65 20 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63  e SNI and ALPN c
62a0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20  allbacks.. *. * 
62b0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
62c0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
62d0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
62e0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
62f0: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
6300: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43   codes:. *.SSL_C
6310: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52  LIENT_HELLO_RETR
6320: 59 3a 20 73 75 73 70 65 6e 64 20 74 68 65 20 68  Y: suspend the h
6330: 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68  andshake, and th
6340: 65 20 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63  e handshake func
6350: 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e  tion will return
6360: 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09   immediately. *.
6370: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6380: 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c  _ERROR: failure,
6390: 20 74 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65   terminate conne
63a0: 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74  ction. Set alert
63b0: 20 74 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   to error code..
63c0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
63d0: 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63  LLO_SUCCESS: suc
63e0: 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  cess. *. *------
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6410: 2d 2d 2d 2d 2d 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 0a 20 2a  -------------. *
6430: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c  /.static int.Hel
6440: 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a  loCallback(SSL *
6450: 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c  ssl, int *alert,
6460: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
6470: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
6480: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
6490: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
64a0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
64b0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
64c0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
64d0: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
64e0: 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  es;.    const ch
64f0: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a  ar *servername;.
6500: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
6510: 65 64 20 63 68 61 72 20 2a 70 3b 0a 20 20 20 20  ed char *p;.    
6520: 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61  size_t len, rema
6530: 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69  ining;..    dpri
6540: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
6550: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
6560: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
6570: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
6580: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6590: 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20  ELLO_SUCCESS;.  
65a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c    } else if (ssl
65b0: 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a   == (const SSL *
65c0: 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20  )NULL || arg == 
65d0: 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a  (void *)NULL) {.
65e0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
65f0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6600: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
6610: 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69  t names */.    i
6620: 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68  f (!SSL_client_h
6630: 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74 28 73 73  ello_get0_ext(ss
6640: 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50 45 5f 73  l, TLSEXT_TYPE_s
6650: 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20  erver_name, &p, 
6660: 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72  &remaining) || r
6670: 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b  emaining <= 2) {
6680: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6690: 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c  _SSLV3_ALERT_ILL
66a0: 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a  EGAL_PARAMETER;.
66b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
66c0: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
66d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78      }..    /* Ex
66e0: 74 72 61 63 74 20 74 68 65 20 6c 65 6e 67 74 68  tract the length
66f0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
6700: 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20   list of names. 
6710: 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28  */.    len = (*(
6720: 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20  p++) << 8);.    
6730: 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20  len += *(p++);. 
6740: 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 21     if (len + 2 !
6750: 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09  = remaining) {..
6760: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53  *alert = SSL_R_S
6770: 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47  SLV3_ALERT_ILLEG
6780: 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72  AL_PARAMETER;..r
6790: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
67a0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
67b0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
67c0: 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a  g = len;..    /*
67d0: 20 54 68 65 20 6c 69 73 74 20 69 6e 20 70 72 61   The list in pra
67e0: 63 74 69 63 65 20 6f 6e 6c 79 20 68 61 73 20 61  ctice only has a
67f0: 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c   single element,
6800: 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73   so we only cons
6810: 69 64 65 72 20 74 68 65 20 66 69 72 73 74 20 6f  ider the first o
6820: 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72  ne. */.    if (r
6830: 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c  emaining == 0 ||
6840: 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f   *p++ != TLSEXT_
6850: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
6860: 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20  me) {..*alert = 
6870: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6880: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6890: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
68a0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
68b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
68c0: 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a  ining--;..    /*
68d0: 20 4e 6f 77 20 77 65 20 63 61 6e 20 66 69 6e 61   Now we can fina
68e0: 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20 74 68 65  lly pull out the
68f0: 20 62 79 74 65 20 61 72 72 61 79 20 77 69 74 68   byte array with
6900: 20 74 68 65 20 61 63 74 75 61 6c 20 68 6f 73 74   the actual host
6910: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20  name. */.    if 
6920: 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29  (remaining <= 2)
6930: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6940: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6950: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6960: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6970: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6980: 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28     }.    len = (
6990: 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20  *(p++) << 8);.  
69a0: 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b    len += *(p++);
69b0: 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20 32  .    if (len + 2
69c0: 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a   > remaining) {.
69d0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
69e0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
69f0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
6a00: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6a10: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6a20: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20  }.    remaining 
6a30: 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65 72 76 65  = len;.    serve
6a40: 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  rname = (const c
6a50: 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a  har *)p;..    /*
6a60: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
6a70: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
6a80: 20 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65   chan, and serve
6a90: 72 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20  r name args */. 
6aa0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
6ab0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
6ac0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
6ad0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6ae0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6af0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
6b00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c  ewStringObj("hel
6b10: 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lo", -1));.    T
6b20: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6b30: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6b40: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
6b50: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
6b60: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6b70: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
6b80: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6b90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6ba0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6bb0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
6bc0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
6bd0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
6be0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
6bf0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
6c00: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
6c10: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6c20: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
6c30: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
6c40: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
6c50: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
6c60: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49  {..res = SSL_CLI
6c70: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b  ENT_HELLO_RETRY;
6c80: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
6c90: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45  _TLSV1_ALERT_USE
6ca0: 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20  R_CANCELLED;.   
6cb0: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
6cc0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
6cd0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6ce0: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
6cf0: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
6d00: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6d10: 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  RROR;..*alert = 
6d20: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6d30: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6d40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
6d50: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
6d60: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
6d70: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a   res;.}.../*****
6d80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6d90: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20  ./* Commands    
6da0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
6db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
6dc0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 48  --------. *. * H
6e10: 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d  andshakeObjCmd -
6e20: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d  -. *. *.This com
6e30: 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20  mand is used to 
6e40: 76 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74  verify whether t
6e50: 68 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20  he handshake is 
6e60: 63 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e  complete. *.or n
6e70: 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ot.. *. * Result
6e80: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
6e90: 20 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d   Tcl result. 1 m
6ea0: 65 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63  eans handshake c
6eb0: 6f 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73  omplete, 0 means
6ec0: 20 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20   pending.. *. * 
6ed0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6ee0: 09 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e  .May force SSL n
6ef0: 65 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61  egotiation to ta
6f00: 6b 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d  ke place.. *. *-
6f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f50: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
6f60: 74 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d  t HandshakeObjCm
6f70: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
6f80: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
6f90: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
6fa0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
6fb0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
6fc0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
6fd0: 63 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20  chan;        /* 
6fe0: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
6ff0: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
7000: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
7010: 65 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ePtr;        /* 
7020: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
7030: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
7040: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65     const char *e
7050: 72 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrStr = NULL;.  
7060: 20 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20    int ret = 1;. 
7070: 20 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a     int err = 0;.
7080: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
7090: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
70a0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
70b0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
70c0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
70d0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
70e0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
70f0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
7100: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7110: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
7120: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
7130: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
7140: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
7150: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
7160: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
7170: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
7180: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
7190: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
71a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
71b0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
71c0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
71d0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
71e0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
71f0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
7200: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
7210: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
7220: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
7230: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
7240: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7250: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
7260: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
7270: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
7280: 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20  .    "\": not a 
7290: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
72a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  har *) NULL);..T
72b0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
72c0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
72d0: 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41  HANDSHAKE", "CHA
72e0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
72f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
7300: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7310: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
7320: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
7330: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
7340: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
7350: 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  an);..    dprint
7360: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
7370: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
7380: 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57  .    ret = Tls_W
7390: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
73a0: 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29  atePtr, &err, 1)
73b0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ;.    dprintf("T
73c0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
73d0: 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c  t returned: %i",
73e0: 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28   ret);..    if (
73f0: 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61  ret < 0 && ((sta
7400: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
7410: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26  LS_TCL_ASYNC) &&
7420: 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29   (err == EAGAIN)
7430: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  )) {..dprintf("A
7440: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72  sync set and err
7450: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65   = EAGAIN");..re
7460: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  t = 0;.    } els
7470: 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b  e if (ret < 0) {
7480: 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09  ..long result;..
7490: 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74  errStr = statePt
74a0: 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73  r->err;..Tcl_Res
74b0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
74c0: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28  ;..Tcl_SetErrno(
74d0: 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72  err);...if (!err
74e0: 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20  Str || (*errStr 
74f0: 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72  == 0)) {..    er
7500: 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78  rStr = Tcl_Posix
7510: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09  Error(interp);..
7520: 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  }...Tcl_AppendRe
7530: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61  sult(interp, "ha
7540: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
7550: 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72  ", errStr, (char
7560: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28   *) NULL);..if (
7570: 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65  (result = SSL_ge
7580: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
7590: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20  statePtr->ssl)) 
75a0: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
75b0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
75c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20  esult(interp, " 
75d0: 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39  due to \"", X509
75e0: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
75f0: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74  or_string(result
7600: 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a  ), "\"", (char *
7610: 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  ) NULL);..}..Tcl
7620: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
7630: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
7640: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
7650: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
7660: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
7670: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
7680: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
7690: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
76a0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  rStr);..return T
76b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20  CL_ERROR;.    } 
76c0: 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72 20  else {..if (err 
76d0: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70 72  != 0) {..    dpr
76e0: 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72 72  intf("Got an err
76f0: 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c 65  or with a comple
7700: 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20 65  ted handshake: e
7710: 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b 0a  rr = %i", err);.
7720: 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20 20  .}..ret = 1;.   
7730: 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
7740: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 4f  "Returning TCL_O
7750: 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25 69  K with data \"%i
7760: 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20 54  \"", ret);.    T
7770: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
7780: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
7790: 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 20  ntObj(ret));.   
77a0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
77b0: 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  }..static const 
77c0: 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70  char *command_op
77d0: 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 2d  ts [] = {.    "-
77e0: 61 6c 70 6e 22 2c 20 22 2d 63 61 64 69 72 22 2c  alpn", "-cadir",
77f0: 20 22 2d 63 61 66 69 6c 65 22 2c 20 22 2d 63 65   "-cafile", "-ce
7800: 72 74 22 2c 20 22 2d 63 65 72 74 66 69 6c 65 22  rt", "-certfile"
7810: 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 22 2d 63  , "-cipher", "-c
7820: 69 70 68 65 72 73 22 2c 20 22 2d 63 69 70 68 65  iphers", "-ciphe
7830: 72 73 75 69 74 65 73 22 2c 0a 20 20 20 20 22 2d  rsuites",.    "-
7840: 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 68 70 61  command", "-dhpa
7850: 72 61 6d 73 22 2c 20 22 2d 6b 65 79 22 2c 20 22  rams", "-key", "
7860: 2d 6b 65 79 66 69 6c 65 22 2c 20 22 2d 6d 6f 64  -keyfile", "-mod
7870: 65 6c 22 2c 20 22 2d 70 61 73 73 77 6f 72 64 22  el", "-password"
7880: 2c 20 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  , "-post_handsha
7890: 6b 65 22 2c 0a 20 20 20 20 22 2d 72 65 71 75 65  ke",.    "-reque
78a0: 73 74 22 2c 20 22 2d 72 65 71 75 69 72 65 22 2c  st", "-require",
78b0: 20 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65   "-security_leve
78c0: 6c 22 2c 20 22 2d 73 65 72 76 65 72 22 2c 20 22  l", "-server", "
78d0: 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 22 2d  -servername", "-
78e0: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 22 2d 73  session_id", "-s
78f0: 73 6c 32 22 2c 0a 20 20 20 20 22 2d 73 73 6c 33  sl2",.    "-ssl3
7900: 22 2c 20 22 2d 74 6c 73 31 22 2c 20 22 2d 74 6c  ", "-tls1", "-tl
7910: 73 31 2e 31 22 2c 20 22 2d 74 6c 73 31 2e 32 22  s1.1", "-tls1.2"
7920: 2c 20 22 2d 74 6c 73 31 2e 33 22 2c 20 22 2d 76  , "-tls1.3", "-v
7930: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c  alidatecommand",
7940: 20 22 2d 76 63 6d 64 22 2c 20 4e 55 4c 4c 7d 3b   "-vcmd", NULL};
7950: 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f  ..enum _command_
7960: 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70 74 5f  opts {.    _opt_
7970: 61 6c 70 6e 2c 20 5f 6f 70 74 5f 63 61 64 69 72  alpn, _opt_cadir
7980: 2c 20 5f 6f 70 74 5f 63 61 66 69 6c 65 2c 20 5f  , _opt_cafile, _
7990: 6f 70 74 5f 63 65 72 74 2c 20 5f 6f 70 74 5f 63  opt_cert, _opt_c
79a0: 65 72 74 66 69 6c 65 2c 20 5f 6f 70 74 5f 63 69  ertfile, _opt_ci
79b0: 70 68 65 72 2c 20 5f 6f 70 74 5f 63 69 70 68 65  pher, _opt_ciphe
79c0: 72 73 2c 0a 20 20 20 20 5f 6f 70 74 5f 63 69 70  rs,.    _opt_cip
79d0: 68 65 72 73 75 69 74 65 2c 20 5f 6f 70 74 5f 63  hersuite, _opt_c
79e0: 6d 64 2c 20 5f 6f 70 74 5f 64 68 70 61 72 61 6d  md, _opt_dhparam
79f0: 73 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70  s, _opt_key, _op
7a00: 74 5f 6b 65 79 66 69 6c 65 2c 20 5f 6f 70 74 5f  t_keyfile, _opt_
7a10: 6d 6f 64 65 6c 2c 20 5f 6f 70 74 5f 70 61 73 73  model, _opt_pass
7a20: 77 6f 72 64 2c 0a 20 20 20 20 5f 6f 70 74 5f 68  word,.    _opt_h
7a30: 61 6e 64 73 68 61 6b 65 2c 20 5f 6f 70 74 5f 72  andshake, _opt_r
7a40: 65 71 75 65 73 74 2c 20 5f 6f 70 74 5f 72 65 71  equest, _opt_req
7a50: 75 69 72 65 2c 20 5f 6f 70 74 5f 73 65 63 75 72  uire, _opt_secur
7a60: 69 74 79 5f 6c 65 76 65 6c 2c 20 5f 6f 70 74 5f  ity_level, _opt_
7a70: 73 65 72 76 65 72 2c 20 5f 6f 70 74 5f 73 65 72  server, _opt_ser
7a80: 76 65 72 6e 61 6d 65 2c 0a 20 20 20 20 5f 6f 70  vername,.    _op
7a90: 74 5f 73 65 73 73 69 6f 6e 5f 69 64 2c 20 5f 6f  t_session_id, _o
7aa0: 70 74 5f 73 73 6c 32 2c 20 5f 6f 70 74 5f 73 73  pt_ssl2, _opt_ss
7ab0: 6c 33 2c 20 5f 6f 70 74 5f 74 6c 73 31 2c 20 5f  l3, _opt_tls1, _
7ac0: 6f 70 74 5f 74 6c 73 31 31 2c 20 5f 6f 70 74 5f  opt_tls11, _opt_
7ad0: 74 6c 73 31 32 2c 20 5f 6f 70 74 5f 74 6c 73 31  tls12, _opt_tls1
7ae0: 33 2c 0a 20 20 20 20 5f 6f 70 74 5f 76 61 6c 69  3,.    _opt_vali
7af0: 64 61 74 65 2c 20 5f 6f 70 74 5f 76 63 6d 64 0a  date, _opt_vcmd.
7b00: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  };../*. *-------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b30: 2d 2d 2d 2d 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 0a 20 2a 0a  ------------. *.
7b50: 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   * ImportObjCmd 
7b60: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
7b70: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
7b80: 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
7b90: 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a  e "ssl" command.
7ba0: 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f   *. *.The ssl co
7bb0: 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c  mmand pushes SSL
7bc0: 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63   over a (newly c
7bd0: 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f  onnected) tcp so
7be0: 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  cket. *. * Resul
7bf0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
7c00: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
7c10: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
7c20: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
7c30: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
7c40: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
7c50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7c90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
7ca0: 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a  ic int.ImportObj
7cb0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
7cc0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
7cd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
7ce0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
7cf0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
7d00: 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
7d10: 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
7d20: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
7d30: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
7d40: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
7d50: 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61  ;../* client sta
7d60: 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65  te for ssl socke
7d70: 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  t */.    SSL_CTX
7d80: 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c 3b 0a 20   *ctx..= NULL;. 
7d90: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f     Tcl_Obj *cmdO
7da0: 62 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bj..= NULL;.    
7db0: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 64 4f  Tcl_Obj *passwdO
7dc0: 62 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  bj..= NULL;.    
7dd0: 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09 09 3d  Tcl_Obj *vcmd..=
7de0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
7df0: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e  String upperChan
7e00: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  nelTranslation, 
7e10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
7e20: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  king, upperChann
7e30: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65  elEncoding, uppe
7e40: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b  rChannelEOFChar;
7e50: 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  .    int idx;.  
7e60: 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 2c 20 6c    Tcl_Size fn, l
7e70: 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  en;.    int flag
7e80: 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e  s...= TLS_TCL_IN
7e90: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76  IT;.    int serv
7ea0: 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20  er...= 0;./* is 
7eb0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d  connection incom
7ec0: 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f  ing or outgoing?
7ed0: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65   */.    char *ke
7ee0: 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20  yfile..= NULL;. 
7ef0: 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c     char *certfil
7f00: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75  e..= NULL;.    u
7f10: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
7f20: 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  y..= NULL;.    T
7f30: 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09  cl_Size key_len.
7f40: 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e  .= 0;.    unsign
7f50: 65 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d  ed char *cert..=
7f60: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53   NULL;.    Tcl_S
7f70: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20  ize cert_len..= 
7f80: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  0;.    char *cip
7f90: 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  hers..= NULL;.  
7fa0: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75    char *ciphersu
7fb0: 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  ites..= NULL;.  
7fc0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09    char *CAfile..
7fd0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
7fe0: 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c   *CApath..= NULL
7ff0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61  ;.    char *DHpa
8000: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  rams..= NULL;.  
8010: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09    char *model...
8020: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
8030: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20   *servername..= 
8040: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
8050: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
8060: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
8070: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
8080: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
8090: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  _id = NULL;.    
80a0: 54 63 6c 5f 53 69 7a 65 20 73 65 73 73 5f 6c 65  Tcl_Size sess_le
80b0: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f  n..= 0;.    Tcl_
80c0: 4f 62 6a 20 2a 61 6c 70 6e 4f 62 6a 09 09 3d 20  Obj *alpnObj..= 
80d0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73  NULL;.    int ss
80e0: 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30  l2 = 0, ssl3 = 0
80f0: 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d  ;.    int tls1 =
8100: 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20   1, tls1_1 = 1, 
8110: 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31  tls1_2 = 1, tls1
8120: 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20  _3 = 1;.    int 
8130: 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c  proto = 0, level
8140: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76   = -1;.    int v
8150: 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69  erify = 0, requi
8160: 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20  re = 0, request 
8170: 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68  = 1, post_handsh
8180: 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f  ake = 0;.    (vo
8190: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
81a0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
81b0: 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66  lled");..#if def
81c0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
81d0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
81e0: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c  _NO_TLS1).    tl
81f0: 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  s1 = 0;.#endif.#
8200: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
8210: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
8220: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8230: 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d  _1).    tls1_1 =
8240: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
8250: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
8260: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
8270: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a  NSSL_NO_TLS1_2).
8280: 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a      tls1_2 = 0;.
8290: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
82a0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
82b0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
82c0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
82d0: 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64  tls1_3 = 0;.#end
82e0: 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  if..    if (objc
82f0: 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
8300: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
8310: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
8320: 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b  nel ?options?");
8330: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8340: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
8350: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
8360: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  ;..    chan = Tc
8370: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
8380: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
8390: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
83a0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
83b0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
83c0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
83d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
83e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
83f0: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
8400: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
8410: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
8420: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
8430: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20  hannel(chan);.. 
8440: 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32 3b     for (idx = 2;
8450: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78   idx < objc; idx
8460: 2b 2b 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 47  ++) {..if (Tcl_G
8470: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
8480: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d  nterp, objv[idx]
8490: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20  , command_opts, 
84a0: 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e  "option", 0, &fn
84b0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
84c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
84d0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61  RROR;..}.../* Va
84e0: 6c 69 64 61 74 65 20 61 72 67 20 68 61 73 20 76  lidate arg has v
84f0: 61 6c 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b 69  alue */..if (++i
8500: 64 78 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09 20  dx >= objc) {.. 
8510: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8520: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20  ult(interp, "No 
8530: 76 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f 6e  value for option
8540: 20 5c 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70   \"", command_op
8550: 74 73 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 28 63  ts[fn], "\"", (c
8560: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
8570: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8580: 52 4f 52 3b 0a 09 7d 0a 0a 09 73 77 69 74 63 68  ROR;..}...switch
8590: 28 66 6e 29 20 7b 0a 09 63 61 73 65 20 5f 6f 70  (fn) {..case _op
85a0: 74 5f 61 6c 70 6e 3a 0a 09 20 20 20 20 61 6c 70  t_alpn:..    alp
85b0: 6e 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  nObj = objv[idx]
85c0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
85d0: 61 73 65 20 5f 6f 70 74 5f 63 61 64 69 72 3a 0a  ase _opt_cadir:.
85e0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52  .    GET_OPT_STR
85f0: 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 43  ING(objv[idx], C
8600: 41 70 61 74 68 2c 20 4e 55 4c 4c 29 3b 0a 09 20  Apath, NULL);.. 
8610: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8620: 5f 6f 70 74 5f 63 61 66 69 6c 65 3a 0a 09 20 20  _opt_cafile:..  
8630: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
8640: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 66 69  (objv[idx], CAfi
8650: 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  le, NULL);..    
8660: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8670: 74 5f 63 65 72 74 3a 0a 09 20 20 20 20 47 45 54  t_cert:..    GET
8680: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28  _OPT_BYTE_ARRAY(
8690: 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 65 72 74 2c  objv[idx], cert,
86a0: 20 26 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 20 20   &cert_len);..  
86b0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
86c0: 6f 70 74 5f 63 65 72 74 66 69 6c 65 3a 0a 09 20  opt_certfile:.. 
86d0: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
86e0: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 65 72  G(objv[idx], cer
86f0: 74 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20  tfile, NULL);.. 
8700: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8710: 5f 6f 70 74 5f 63 69 70 68 65 72 3a 0a 09 63 61  _opt_cipher:..ca
8720: 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 3a  se _opt_ciphers:
8730: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
8740: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
8750: 63 69 70 68 65 72 73 2c 20 4e 55 4c 4c 29 3b 0a  ciphers, NULL);.
8760: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8770: 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 73 75 69  e _opt_ciphersui
8780: 74 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  te:..    GET_OPT
8790: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
87a0: 5d 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 2c  ], ciphersuites,
87b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
87c0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  ak;..case _opt_c
87d0: 6d 64 3a 0a 09 20 20 20 20 63 6d 64 4f 62 6a 20  md:..    cmdObj 
87e0: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20  = objv[idx];..  
87f0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8800: 6f 70 74 5f 64 68 70 61 72 61 6d 73 3a 0a 09 20  opt_dhparams:.. 
8810: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
8820: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 44 48 70  G(objv[idx], DHp
8830: 61 72 61 6d 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20  arams, NULL);.. 
8840: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8850: 5f 6f 70 74 5f 6b 65 79 3a 0a 09 20 20 20 20 47  _opt_key:..    G
8860: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
8870: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79  Y(objv[idx], key
8880: 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 20 20  , &key_len);..  
8890: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
88a0: 6f 70 74 5f 6b 65 79 66 69 6c 65 3a 0a 09 20 20  opt_keyfile:..  
88b0: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
88c0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 66  (objv[idx], keyf
88d0: 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ile, NULL);..   
88e0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
88f0: 70 74 5f 6d 6f 64 65 6c 3a 0a 09 20 20 20 20 47  pt_model:..    G
8900: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8910: 6a 76 5b 69 64 78 5d 2c 20 6d 6f 64 65 6c 2c 20  jv[idx], model, 
8920: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
8930: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61  k;..case _opt_pa
8940: 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 70 61 73  ssword:..    pas
8950: 73 77 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64  swdObj = objv[id
8960: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  x];..    break;.
8970: 09 63 61 73 65 20 5f 6f 70 74 5f 68 61 6e 64 73  .case _opt_hands
8980: 68 61 6b 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f  hake:..    GET_O
8990: 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78  PT_BOOL(objv[idx
89a0: 5d 2c 20 26 70 6f 73 74 5f 68 61 6e 64 73 68 61  ], &post_handsha
89b0: 6b 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ke);..    break;
89c0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 72 65 71 75  ..case _opt_requ
89d0: 65 73 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  est:..    GET_OP
89e0: 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d  T_BOOL(objv[idx]
89f0: 2c 20 26 72 65 71 75 65 73 74 29 3b 0a 09 20 20  , &request);..  
8a00: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8a10: 6f 70 74 5f 72 65 71 75 69 72 65 3a 0a 09 20 20  opt_require:..  
8a20: 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f    GET_OPT_BOOL(o
8a30: 62 6a 76 5b 69 64 78 5d 2c 20 26 72 65 71 75 69  bjv[idx], &requi
8a40: 72 65 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  re);..    break;
8a50: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 63 75  ..case _opt_secu
8a60: 72 69 74 79 5f 6c 65 76 65 6c 3a 0a 09 20 20 20  rity_level:..   
8a70: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a   GET_OPT_INT(obj
8a80: 76 5b 69 64 78 5d 2c 20 26 6c 65 76 65 6c 29 3b  v[idx], &level);
8a90: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8aa0: 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72 3a 0a  se _opt_server:.
8ab0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f  .    GET_OPT_BOO
8ac0: 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73 65  L(objv[idx], &se
8ad0: 72 76 65 72 29 3b 0a 09 20 20 20 20 62 72 65 61  rver);..    brea
8ae0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65  k;..case _opt_se
8af0: 72 76 65 72 6e 61 6d 65 3a 0a 09 20 20 20 20 47  rvername:..    G
8b00: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8b10: 6a 76 5b 69 64 78 5d 2c 20 73 65 72 76 65 72 6e  jv[idx], servern
8b20: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ame, NULL);..   
8b30: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8b40: 70 74 5f 73 65 73 73 69 6f 6e 5f 69 64 3a 0a 09  pt_session_id:..
8b50: 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45      GET_OPT_BYTE
8b60: 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d  _ARRAY(objv[idx]
8b70: 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 26 73  , session_id, &s
8b80: 65 73 73 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62  ess_len);..    b
8b90: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8ba0: 5f 73 73 6c 32 3a 0a 09 20 20 20 20 47 45 54 5f  _ssl2:..    GET_
8bb0: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8bc0: 5d 2c 20 26 73 73 6c 32 29 3b 0a 09 20 20 20 20  ], &ssl2);..    
8bd0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8be0: 74 5f 73 73 6c 33 3a 0a 09 20 20 20 20 47 45 54  t_ssl3:..    GET
8bf0: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
8c00: 78 5d 2c 20 26 73 73 6c 33 29 3b 0a 09 20 20 20  x], &ssl3);..   
8c10: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8c20: 70 74 5f 74 6c 73 31 3a 0a 09 20 20 20 20 47 45  pt_tls1:..    GE
8c30: 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69  T_OPT_INT(objv[i
8c40: 64 78 5d 2c 20 26 74 6c 73 31 29 3b 0a 09 20 20  dx], &tls1);..  
8c50: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8c60: 6f 70 74 5f 74 6c 73 31 31 3a 0a 09 20 20 20 20  opt_tls11:..    
8c70: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76  GET_OPT_INT(objv
8c80: 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f 31 29 3b  [idx], &tls1_1);
8c90: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8ca0: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 32 3a 0a 09  se _opt_tls12:..
8cb0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
8cc0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8cd0: 5f 32 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  _2);..    break;
8ce0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31  ..case _opt_tls1
8cf0: 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  3:..    GET_OPT_
8d00: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8d10: 74 6c 73 31 5f 33 29 3b 0a 09 20 20 20 20 62 72  tls1_3);..    br
8d20: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8d30: 76 61 6c 69 64 61 74 65 3a 0a 09 63 61 73 65 20  validate:..case 
8d40: 5f 6f 70 74 5f 76 63 6d 64 3a 0a 09 20 20 20 20  _opt_vcmd:..    
8d50: 76 63 6d 64 20 3d 20 6f 62 6a 76 5b 69 64 78 5d  vcmd = objv[idx]
8d60: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d  ;..    break;..}
8d70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
8d80: 72 65 71 75 65 73 74 29 09 09 76 65 72 69 66 79  request)..verify
8d90: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43   |= SSL_VERIFY_C
8da0: 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c  LIENT_ONCE | SSL
8db0: 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20  _VERIFY_PEER;.  
8dc0: 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26 26    if (request &&
8dd0: 20 72 65 71 75 69 72 65 29 09 76 65 72 69 66 79   require).verify
8de0: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46   |= SSL_VERIFY_F
8df0: 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
8e00: 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71  ERT;.    if (req
8e10: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
8e20: 64 73 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c  dshake).verify |
8e30: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53  = SSL_VERIFY_POS
8e40: 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20  T_HANDSHAKE;.   
8e50: 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30   if (verify == 0
8e60: 29 09 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f  )..verify = SSL_
8e70: 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20  VERIFY_NONE;..  
8e80: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32    proto |= (ssl2
8e90: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
8ea0: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8eb0: 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53  o |= (ssl3 ? TLS
8ec0: 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29  _PROTO_SSL3 : 0)
8ed0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8ee0: 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  tls1 ? TLS_PROTO
8ef0: 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20  _TLS1 : 0);.    
8f00: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31  proto |= (tls1_1
8f10: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8f20: 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_1 : 0);.    pr
8f30: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f  oto |= (tls1_2 ?
8f40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
8f50: 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  2 : 0);.    prot
8f60: 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54  o |= (tls1_3 ? T
8f70: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20  LS_PROTO_TLS1_3 
8f80: 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  : 0);..    /* re
8f90: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62  set to NULL if b
8fa0: 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76  lank string prov
8fb0: 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  ided */.    if (
8fc0: 63 65 72 74 20 26 26 20 21 2a 63 65 72 74 29 09  cert && !*cert).
8fd0: 09 20 20 20 20 20 20 20 20 63 65 72 74 09 20 20  .        cert.  
8fe0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8ff0: 20 20 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b    if (key && !*k
9000: 65 79 29 09 09 20 20 20 20 20 20 20 20 6b 65 79  ey)..        key
9010: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9020: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
9030: 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29  e && !*certfile)
9040: 20 20 20 20 20 20 20 20 20 63 65 72 74 66 69 6c           certfil
9050: 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66  e.= NULL;.    if
9060: 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b   (keyfile && !*k
9070: 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65  eyfile)..keyfile
9080: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9090: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
90a0: 20 26 26 20 21 2a 63 69 70 68 65 72 73 29 09 20   && !*ciphers). 
90b0: 20 20 20 20 20 20 20 63 69 70 68 65 72 73 09 20         ciphers. 
90c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
90d0: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 75 69     if (ciphersui
90e0: 74 65 73 20 26 26 20 21 2a 63 69 70 68 65 72 73  tes && !*ciphers
90f0: 75 69 74 65 73 29 20 63 69 70 68 65 72 73 75 69  uites) ciphersui
9100: 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20  tes    = NULL;. 
9110: 20 20 20 69 66 20 28 43 41 66 69 6c 65 20 26 26     if (CAfile &&
9120: 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20   !*CAfile).     
9130: 20 20 20 43 41 66 69 6c 65 09 20 20 20 20 20 20     CAfile.      
9140: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9150: 20 28 43 41 70 61 74 68 20 26 26 20 21 2a 43 41   (CApath && !*CA
9160: 70 61 74 68 29 09 20 20 20 20 20 20 20 20 43 41  path).        CA
9170: 70 61 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e  path.        = N
9180: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70  ULL;.    if (DHp
9190: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72  arams && !*DHpar
91a0: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70  ams).        DHp
91b0: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e  arams        = N
91c0: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77  ULL;..    /* new
91d0: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20   SSL state */.  
91e0: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53    statePtr..= (S
91f0: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28  tate *) ckalloc(
9200: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f  (unsigned) sizeo
9210: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d  f(State));.    m
9220: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20  emset(statePtr, 
9230: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29  0, sizeof(State)
9240: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
9250: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b  ->flags.= flags;
9260: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69  .    statePtr->i
9270: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a  nterp.= interp;.
9280: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 66      statePtr->vf
9290: 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a 20  lags.= verify;. 
92a0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72     statePtr->err
92b0: 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20 61  .= "";..    /* a
92c0: 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20 2a  llocate script *
92d0: 2f 0a 20 20 20 20 69 66 20 28 63 6d 64 4f 62 6a  /.    if (cmdObj
92e0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f   != NULL) {..(vo
92f0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
9300: 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c  gFromObj(cmdObj,
9310: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
9320: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
9330: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 63 6d  r->callback = cm
9340: 64 4f 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49  dObj;..    Tcl_I
9350: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
9360: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
9370: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
9380: 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77  * allocate passw
9390: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ord */.    if (p
93a0: 61 73 73 77 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c  asswdObj != NULL
93b0: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
93c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
93d0: 28 70 61 73 73 77 64 4f 62 6a 2c 20 26 6c 65 6e  (passwdObj, &len
93e0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
93f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61      statePtr->pa
9400: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 64 4f  ssword = passwdO
9410: 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  bj;..    Tcl_Inc
9420: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
9430: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
9440: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9450: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74  allocate validat
9460: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
9470: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76   if (vcmd) {..(v
9480: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
9490: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20  ngFromObj(vcmd, 
94a0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
94b0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
94c0: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09  ->vcmd = vcmd;..
94d0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
94e0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
94f0: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  cmd);..}.    }..
9500: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
9510: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
9520: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
9530: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
9540: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
9550: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
9560: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b  , model, &mode);
9570: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54  ..if (chan == (T
9580: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
9590: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
95a0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
95b0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
95c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
95d0: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
95e0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
95f0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
9600: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
9610: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
9620: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28  nel(chan);..if (
9630: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
9640: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
9650: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
9660: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
9670: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9680: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
9690: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
96a0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
96b0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
96c0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
96d0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
96e0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
96f0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
9700: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  RT", "CHANNEL", 
9710: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
9720: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
9730: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
9740: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
9750: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9760: 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28  OR;..}..ctx = ((
9770: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
9780: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
9790: 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a  ta(chan))->ctx;.
97a0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66      } else {..if
97b0: 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69   ((ctx = CTX_Ini
97c0: 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76  t(statePtr, serv
97d0: 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69  er, proto, keyfi
97e0: 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65  le, certfile, ke
97f0: 79 2c 20 63 65 72 74 2c 20 28 69 6e 74 29 20 6b  y, cert, (int) k
9800: 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 28 69 6e  ey_len,..    (in
9810: 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70  t) cert_len, CAp
9820: 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70  ath, CAfile, cip
9830: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74  hers, ciphersuit
9840: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72  es, level, DHpar
9850: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ams)) == NULL) {
9860: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
9870: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
9880: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
9890: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
98a0: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72   }..    statePtr
98b0: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20  ->ctx = ctx;..  
98c0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e    /*.     * We n
98d0: 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eed to make sure
98e0: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65   that the channe
98f0: 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72  l works in binar
9900: 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20  y (for the.     
9910: 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74  * encryption not
9920: 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75   to get goofed u
9930: 70 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e  p)..     * We on
9940: 6c 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73  ly want to adjus
9950: 74 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20  t the buffering 
9960: 69 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65  in pre-v2 channe
9970: 6c 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a  ls, where.     *
9980: 20 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e   each channel in
9990: 20 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74   the stack maint
99a0: 61 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75  ained its own bu
99b0: 66 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20  ffers..     */. 
99c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
99d0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
99e0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
99f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
9a00: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  t(&upperChannelB
9a10: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
9a20: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
9a30: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9a40: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
9a50: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
9a60: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
9a70: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
9a80: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9a90: 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61  , chan, "-eofcha
9aa0: 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  r", &upperChanne
9ab0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
9ac0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
9ad0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
9ae0: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
9af0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
9b00: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
9b10: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9b20: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
9b30: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75  translation", &u
9b40: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
9b50: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
9b60: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
9b70: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
9b80: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70  "-blocking", &up
9b90: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
9ba0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ng);.    Tcl_Set
9bb0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9bc0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
9bd0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e  anslation", "bin
9be0: 61 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ary");.    Tcl_S
9bf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9c00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
9c10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65  blocking", "true
9c20: 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  ");.    dprintf(
9c30: 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63  "Consuming Tcl c
9c40: 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f  hannel %s", Tcl_
9c50: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
9c60: 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65  han));.    state
9c70: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f  Ptr->self = Tcl_
9c80: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  StackChannel(int
9c90: 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  erp, Tls_Channel
9ca0: 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44  Type(), (ClientD
9cb0: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09  ata) statePtr,..
9cc0: 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20  (TCL_READABLE | 
9cd0: 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63  TCL_WRITABLE), c
9ce0: 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74  han);.    dprint
9cf0: 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e  f("Created chann
9d00: 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63  el named %s", Tc
9d10: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
9d20: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
9d30: 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  );.    if (state
9d40: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63  Ptr->self == (Tc
9d50: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
9d60: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73   {../*.. * No us
9d70: 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61  e of Tcl_Eventua
9d80: 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65 20  llyFree because 
9d90: 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f  no possible Tcl_
9da0: 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09  Preserve... */..
9db0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
9dc0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
9dd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9de0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
9df0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9e00: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
9e10: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c  ->self, "-transl
9e20: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72  ation", Tcl_DStr
9e30: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
9e40: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
9e50: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  n));.    Tcl_Set
9e60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
9e70: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
9e80: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  self, "-encoding
9e90: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
9ea0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
9eb0: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20  lEncoding));.   
9ec0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9ed0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
9ee0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
9ef0: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53  eofchar", Tcl_DS
9f00: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
9f10: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
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 62 6c 6f 63 6b 69 6e 67 22 2c  lf, "-blocking",
9f60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
9f70: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
9f80: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54  locking));.    T
9f90: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
9fa0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
9fb0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
9fc0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
9fd0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9fe0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
9ff0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
a000: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
a010: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a020: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
a030: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20  elBlocking);..  
a040: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
a050: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  Initialization. 
a060: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65      */.    state
a070: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e  Ptr->ssl = SSL_n
a080: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ew(statePtr->ctx
a090: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74  );.    if (!stat
a0a0: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a  ePtr->ssl) {../*
a0b0: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72   SSL library err
a0c0: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e  or */..Tcl_Appen
a0d0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a0e0: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72  "couldn't constr
a0f0: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a  uct ssl session:
a100: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
a110: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
a120: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
a130: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
a140: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
a150: 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41  RT", "INIT", "FA
a160: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
a170: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65  NULL);..Tls_Free
a180: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a190: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
a1a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
a1b0: 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73     /* Set host s
a1c0: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20  erver name */.  
a1d0: 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65    if (servername
a1e0: 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65  ) {../* Sets the
a1f0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64   server name ind
a200: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e  ication (SNI) in
a210: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74   ClientHello ext
a220: 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65  ension */../* Pe
a230: 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74  r RFC 6066, host
a240: 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20  name is a ASCII 
a250: 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20  encoded string, 
a260: 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20  though RFC 4366 
a270: 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09  says UTF-8. */..
a280: 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73  if (!SSL_set_tls
a290: 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74  ext_host_name(st
a2a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72  atePtr->ssl, ser
a2b0: 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75  vername) && requ
a2c0: 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ire) {..    Tcl_
a2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a2e0: 65 72 70 2c 20 22 53 65 74 20 53 4e 49 20 65 78  erp, "Set SNI ex
a2f0: 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20  tension failed: 
a300: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
a310: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
a320: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
a330: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
a340: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
a350: 54 22 2c 20 22 53 4e 49 22 2c 20 22 46 41 49 4c  T", "SNI", "FAIL
a360: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
a370: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
a380: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
a390: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a3a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a3b0: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61  .../* Set hostna
a3c0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
a3d0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65  ificate hostname
a3e0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e   verification in
a3f0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f   clients...   Do
a400: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31  n't use SSL_set1
a410: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68  _host since it h
a420: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20  as limitations. 
a430: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64  */..if (!SSL_add
a440: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d  1_host(statePtr-
a450: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
a460: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a470: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a480: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74  p, "Set DNS host
a490: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  name failed: ", 
a4a0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
a4b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a4c0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
a4d0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
a4e0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
a4f0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41   "HOSTNAME", "FA
a500: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
a510: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
a520: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a530: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a540: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a550: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a560: 20 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20   Resume session 
a570: 69 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  id */.    if (se
a580: 73 73 69 6f 6e 5f 69 64 20 26 26 20 73 65 73 73  ssion_id && sess
a590: 5f 6c 65 6e 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f  _len <= SSL_MAX_
a5a0: 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20  SID_CTX_LENGTH) 
a5b0: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
a5c0: 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28  ssion() */..if (
a5d0: 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74  !SSL_SESSION_set
a5e0: 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c  1_id_context(SSL
a5f0: 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61  _get_session(sta
a600: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73  tePtr->ssl), ses
a610: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
a620: 65 64 20 69 6e 74 29 20 73 65 73 73 5f 6c 65 6e  ed int) sess_len
a630: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a640: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a650: 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73 69  p, "Resume sessi
a660: 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45  on failed: ", GE
a670: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
a680: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
a690: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
a6a0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
a6b0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
a6c0: 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45  SESSION", "FAILE
a6d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
a6e0: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
a6f0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a700: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a710: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
a730: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e  able Application
a740: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20  -Layer Protocol 
a750: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61  Negotiation. Exa
a760: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f  mples are: http/
a770: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20  1.0,..http/1.1, 
a780: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61  h2, h3, ftp, ima
a790: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c  p, pop3, xmpp-cl
a7a0: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65  ient, xmpp-serve
a7b0: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74  r, mqtt, irc, et
a7c0: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c  c. */.    if (al
a7d0: 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b  pnObj != NULL) {
a7e0: 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54  ../* Convert a T
a7f0: 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70  CL list into a p
a800: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20  rotocol-list in 
a810: 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09  wire-format */..
a820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
a830: 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69  rotos, *p;..unsi
a840: 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f  gned int protos_
a850: 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69  len = 0;..Tcl_Si
a860: 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20  ze cnt, i;..int 
a870: 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69  j;..Tcl_Obj **li
a880: 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69  st;...if (Tcl_Li
a890: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
a8a0: 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 4f 62 6a  (interp, alpnObj
a8b0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21  , &cnt, &list) !
a8c0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
a8d0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
a8e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a8f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a900: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74  ROR;..}.../* Det
a910: 65 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72  ermine the memor
a920: 79 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74  y required for t
a930: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  he protocol-list
a940: 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b   */..for (i = 0;
a950: 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b   i < cnt; i++) {
a960: 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72  ..    Tcl_GetStr
a970: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b  ingFromObj(list[
a980: 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20  i], &len);..    
a990: 69 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b  if (len > 255) {
a9a0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
a9b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50  ult(interp, "ALP
a9c0: 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73  N protocol names
a9d0: 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61   too long", (cha
a9e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63  r *) NULL);...Tc
a9f0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
aa00: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
aa10: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
aa20: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
aa30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f  *) NULL);...Tls_
aa40: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
aa50: 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72  atePtr);...retur
aa60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
aa70: 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f    }..    protos_
aa80: 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29  len += 1 + (int)
aa90: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75   len;..}.../* Bu
aaa0: 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  ild the complete
aab0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
aac0: 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c  /..protos = ckal
aad0: 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b  loc(protos_len);
aae0: 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  ../* protocol-li
aaf0: 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38  sts consist of 8
ab00: 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66  -bit length-pref
ab10: 69 78 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e  ixed, byte strin
ab20: 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20  gs */..for (j = 
ab30: 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a  0, p = protos; j
ab40: 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09   < cnt; j++) {..
ab50: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20      char *str = 
ab60: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
ab70: 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c  mObj(list[j], &l
ab80: 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d  en);..    *p++ =
ab90: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29   (unsigned char)
aba0: 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70   len;..    memcp
abb0: 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f  y(p, str, (size_
abc0: 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20  t) len);..    p 
abd0: 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  += len;..}.../* 
abe0: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
abf0: 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79  tos makes a copy
ac00: 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c   of the protocol
ac10: 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74  -list */../* Not
ac20: 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e: This function
ac30: 73 20 72 65 76 65 72 73 65 73 20 74 68 65 20 72  s reverses the r
ac40: 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76  eturn value conv
ac50: 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53  ention */..if (S
ac60: 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74  SL_set_alpn_prot
ac70: 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  os(statePtr->ssl
ac80: 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73  , protos, protos
ac90: 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63  _len)) {..    Tc
aca0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
acb0: 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e  nterp, "Set ALPN
acc0: 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65   protocols faile
acd0: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
ace0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
acf0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
ad00: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
ad10: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
ad20: 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22  PORT", "ALPN", "
ad30: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
ad40: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
ad50: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
ad60: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
ad70: 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a  ckfree(protos);.
ad80: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ad90: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  ERROR;..}.../* S
ada0: 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c  tore protocols l
adb0: 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72  ist */..statePtr
adc0: 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f  ->protos = proto
add0: 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  s;..statePtr->pr
ade0: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f  otos_len = proto
adf0: 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73  s_len;.    } els
ae00: 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  e {..statePtr->p
ae10: 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73  rotos = NULL;..s
ae20: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
ae30: 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  len = 0;.    }..
ae40: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53      /*.     * SS
ae50: 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20  L Callbacks.    
ae60: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f   */.    SSL_set_
ae70: 61 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74  app_data(statePt
ae80: 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29  r->ssl, (void *)
ae90: 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f  statePtr);./* po
aea0: 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a  int back to us *
aeb0: 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76  /..    SSL_set_v
aec0: 65 72 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e  erify(statePtr->
aed0: 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72  ssl, verify, Ver
aee0: 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  ifyCallback);.  
aef0: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63    SSL_set_info_c
af00: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
af10: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62  ->ssl, InfoCallb
af20: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  ack);..    /* Ca
af30: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72  llback for obser
af40: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65  ving protocol me
af50: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65  ssages */.#ifnde
af60: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  f OPENSSL_NO_SSL
af70: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f  _TRACE.    /* vo
af80: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  id SSL_CTX_set_m
af90: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
afa0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28  statePtr->ctx, (
afb0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
afc0: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43  ;.    void SSL_C
afd0: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  TX_set_msg_callb
afe0: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
aff0: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61  x, MessageCallba
b000: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  ck); */.    SSL_
b010: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
b020: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73  _arg(statePtr->s
b030: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
b040: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73  ePtr);.    SSL_s
b050: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28  et_msg_callback(
b060: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d  statePtr->ssl, M
b070: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b  essageCallback);
b080: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
b090: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e  Create Tcl_Chann
b0a0: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a  el BIO Handler *
b0b0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
b0c0: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f  p_bio.= BIO_new_
b0d0: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49  tcl(statePtr, BI
b0e0: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20  O_NOCLOSE);.    
b0f0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20  statePtr->bio.= 
b100: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73  BIO_new(BIO_f_ss
b110: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  l());..    if (s
b120: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72  erver) {../* Ser
b130: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ver callbacks */
b140: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
b150: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
b160: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74  arg(statePtr->ct
b170: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
b180: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  Ptr);..SSL_CTX_s
b190: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
b1a0: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74  name_callback(st
b1b0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49  atePtr->ctx, SNI
b1c0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f  Callback);..SSL_
b1d0: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68  CTX_set_client_h
b1e0: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72  ello_cb(statePtr
b1f0: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c  ->ctx, HelloCall
b200: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
b210: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74  atePtr);..if (st
b220: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
b230: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
b240: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f  SL_CTX_set_alpn_
b250: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50  select_cb(stateP
b260: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c  tr->ctx, ALPNCal
b270: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
b280: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66  tatePtr);.#ifdef
b290: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66   USE_NPN..    if
b2a0: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26   (tls1_2 == 0 &&
b2b0: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
b2c0: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65  ..SSL_CTX_set_ne
b2d0: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74  xt_protos_advert
b2e0: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72  ised_cb(statePtr
b2f0: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61  ->ctx, NPNCallba
b300: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
b310: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65  ePtr);..    }.#e
b320: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61  ndif..}.../* Ena
b330: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65  ble server to se
b340: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20  nd cert request 
b350: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20  after handshake 
b360: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a  (TLS 1.3 only) *
b370: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70  /../* A write op
b380: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b  eration must tak
b390: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20  e place for the 
b3a0: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75  Certificate Requ
b3b0: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65  est to be..   se
b3c0: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  nt to the client
b3d0: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f  , this can be do
b3e0: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68  ne with SSL_do_h
b3f0: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09  andshake(). */..
b400: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
b410: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26  ost_handshake &&
b420: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20   tls1_3) {..    
b430: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e  SSL_verify_clien
b440: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
b450: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
b460: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74  ..}.../* set aut
b470: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c  omatic curve sel
b480: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73  ection */..SSL_s
b490: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61  et_ecdh_auto(sta
b4a0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a  tePtr->ssl, 1);.
b4b0: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20  ../* Set server 
b4c0: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74  mode */..statePt
b4d0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
b4e0: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c  TCL_SERVER;..SSL
b4f0: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74  _set_accept_stat
b500: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
b510: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
b520: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61  /* Client callba
b530: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  cks */.#ifdef US
b540: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65  E_NPN..if (state
b550: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
b560: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d  ULL && tls1_2 ==
b570: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
b580: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  0) {..    SSL_CT
b590: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  X_set_next_proto
b5a0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
b5b0: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
b5c0: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
b5d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65  statePtr);..}.#e
b5e0: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  ndif.../* Sessio
b5f0: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53  n caching */..SS
b600: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f  L_CTX_set_sessio
b610: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
b620: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f  tePtr->ctx, SSL_
b630: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
b640: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  T | SSL_SESS_CAC
b650: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53  HE_NO_INTERNAL_S
b660: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  TORE);..SSL_CTX_
b670: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28  sess_set_new_cb(
b680: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
b690: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b  essionCallback);
b6a0: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73  .../* Enable pos
b6b0: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68  t handshake Auth
b6c0: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e  entication exten
b6d0: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e  sion. TLS 1.3 on
b6e0: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20  ly, not http/2. 
b6f0: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20  */..if (request 
b700: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
b710: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65  e) {..    SSL_se
b720: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
b730: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e  _auth(statePtr->
b740: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  ssl, 1);..}.../*
b750: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65   Set client mode
b760: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e   */..SSL_set_con
b770: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65  nect_state(state
b780: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
b790: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f  .    SSL_set_bio
b7a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
b7b0: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c  statePtr->p_bio,
b7c0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
b7d0: 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73  );.    BIO_set_s
b7e0: 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  sl(statePtr->bio
b7f0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  , statePtr->ssl,
b800: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a   BIO_NOCLOSE);..
b810: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e      /*.     * En
b820: 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20  d of SSL Init.  
b830: 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74     */.    dprint
b840: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22  f("Returning %s"
b850: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
b860: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
b870: 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  elf));.    Tcl_S
b880: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
b890: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
b8a0: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
b8b0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43  tePtr->self), TC
b8c0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20  L_VOLATILE);..  
b8d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
b8e0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
b8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
b930: 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  . * UnimportObjC
b940: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  md --. *. *.This
b950: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
b960: 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20  voked to remove 
b970: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
b980: 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20  nel filter.. *. 
b990: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
b9a0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
b9b0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
b9c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
b9d0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76  modify the behav
b9e0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61  ior of an IO cha
b9f0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
ba00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
ba40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e  */.static int.Un
ba50: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69  importObjCmd(Cli
ba60: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
ba70: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
ba80: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
ba90: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
baa0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
bab0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
bac0: 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c  ../* The channel
bad0: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
bae0: 6e 2e 20 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29  n. */.    (void)
baf0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
bb00: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
bb10: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
bb20: 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
bb30: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
bb40: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
bb50: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
bb60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
bb70: 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
bb80: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
bb90: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
bba0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
bbb0: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
bbc0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
bbd0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
bbe0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bbf0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
bc00: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
bc10: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
bc20: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
bc30: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
bc40: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
bc50: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
bc60: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
bc70: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
bc80: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
bc90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
bca0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
bcb0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
bcc0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
bcd0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
bce0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
bcf0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
bd00: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bd10: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bd20: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e  UNIMPORT", "CHAN
bd30: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
bd40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
bd50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
bd60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
bd70: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68  f (Tcl_UnstackCh
bd80: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
bd90: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
bda0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
bdb0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
bdc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
bdd0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
bde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
be20: 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20  . * CTX_Init -- 
be30: 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f  construct a SSL_
be40: 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a  CTX instance. *.
be50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
be60: 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69   valid SSL_CTX i
be70: 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e  nstance or NULL.
be80: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
be90: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63  cts:. *.construc
bea0: 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ts SSL context (
beb0: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
bec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
bf00: 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58  /.static SSL_CTX
bf10: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74   *.CTX_Init(Stat
bf20: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74  e *statePtr, int
bf30: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70   isServer, int p
bf40: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66  roto, char *keyf
bf50: 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66  ile, char *certf
bf60: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65  ile,.    unsigne
bf70: 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73  d char *key, uns
bf80: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
bf90: 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69  , int key_len, i
bfa0: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61  nt cert_len, cha
bfb0: 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20 63  r *CApath,.    c
bfc0: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61  har *CAfile, cha
bfd0: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
bfe0: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
bff0: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
c000: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
c010: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c020: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
c030: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
c040: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
c050: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
c060: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66   ds;.    int off
c070: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b   = 0, abort = 0;
c080: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72  .    int load_pr
c090: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63  ivate_key;.    c
c0a0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
c0b0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
c0c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
c0d0: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f  ..    if (!proto
c0e0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
c0f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
c100: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  o valid protocol
c110: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61   selected", (cha
c120: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
c130: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
c140: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53  .    /* create S
c150: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69  SL context */.#i
c160: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
c170: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
c180: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
c190: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
c1a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c1b0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28  O_SSL2).    if (
c1c0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
c1d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20  LS_PROTO_SSL2)) 
c1e0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c1f0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
c200: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
c210: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
c220: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
c230: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
c240: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
c250: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  d(NO_SSL3) || de
c260: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c270: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45  _SSL3).    if (E
c280: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
c290: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b  S_PROTO_SSL3)) {
c2a0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c2b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33  lt(interp, "SSL3
c2c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c2d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c2e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c2f0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c300: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c310: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
c320: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c330: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e  TLS1).    if (EN
c340: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
c350: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a  _PROTO_TLS1)) {.
c360: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
c370: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
c380: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .0 protocol not 
c390: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
c3a0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
c3b0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
c3c0: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
c3d0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
c3e0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
c3f0: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
c400: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
c410: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c420: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_1)) {..Tcl_App
c430: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c440: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f  , "TLS 1.1 proto
c450: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
c460: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
c470: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
c480: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
c490: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
c4a0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
c4b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c4c0: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
c4d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
c4e0: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
c4f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
c500: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
c510: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
c520: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
c530: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
c540: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
c550: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
c560: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
c570: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
c580: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
c590: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
c5a0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c5b0: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_3)) {..Tcl_App
c5c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c5d0: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f  , "TLS 1.3 proto
c5e0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
c5f0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
c600: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
c610: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c620: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
c630: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c  0) {../* Use ful
c640: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f  l range */..SSL_
c650: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
c660: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30  o_version(ctx, 0
c670: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c680: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
c690: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d  n(ctx, 0);.    }
c6a0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72  ..    switch (pr
c6b0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53  oto) {.#if OPENS
c6c0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
c6d0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
c6e0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
c6f0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
c700: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
c710: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
c720: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68  ROTO_SSL2:..meth
c730: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
c740: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv2_server_met
c750: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c  hod() : SSLv2_cl
c760: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
c770: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
c780: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
c790: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
c7a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
c7b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c7c0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
c7d0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
c7e0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d  S_PROTO_SSL3:..m
c7f0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
c800: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f   ? SSLv3_server_
c810: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33  method() : SSLv3
c820: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
c830: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
c840: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c850: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
c860: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c870: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
c880: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
c890: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
c8a0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
c8b0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
c8c0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76  ver ? TLSv1_serv
c8d0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
c8e0: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Sv1_client_metho
c8f0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
c900: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
c910: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
c920: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c930: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
c940: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c950: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
c960: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
c970: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
c980: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c990: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f   TLSv1_1_server_
c9a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
c9b0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _1_client_method
c9c0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
c9d0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
c9e0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
c9f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
ca00: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
ca10: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
ca20: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
ca30: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
ca40: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68  TO_TLS1_2:..meth
ca50: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
ca60: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d  TLSv1_2_server_m
ca70: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
ca80: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
ca90: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
caa0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
cab0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
cac0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
cad0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
cae0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
caf0: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20  _3:../* Use the 
cb00: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61  generic method a
cb10: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61  nd constraint ra
cb20: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78  nge after contex
cb30: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  t is created */.
cb40: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
cb50: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
cb60: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
cb70: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
cb80: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
cb90: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20     default:../* 
cba0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73  Negotiate highes
cbb0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f  t available SSL/
cbc0: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09  TLS version */..
cbd0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
cbe0: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
cbf0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
cc00: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23  ient_method();.#
cc10: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
cc20: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
cc30: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
cc40: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
cc50: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
cc60: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c  _NO_SSL2)..off |
cc70: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
cc80: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
cc90: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
cca0: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64  _NO_SSLv2);.#end
ccb0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
ccc0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
ccd0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
cce0: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL3)..off |= (E
ccf0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cd00: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20  S_PROTO_SSL3)   
cd10: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
cd20: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv3);.#endif.#
cd30: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
cd40: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
cd50: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
cd60: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
cd70: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
cd80: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20  OTO_TLS1)   ? 0 
cd90: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
cda0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
cdb0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
cdc0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
cdd0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
cde0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
cdf0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
ce00: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20  OTO_TLS1_1) ? 0 
ce10: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
ce20: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_1);.#endif.#if
ce30: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ce40: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
ce50: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ce60: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _2)..off |= (ENA
ce70: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
ce80: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
ce90: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
cea0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
ceb0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
cec0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
ced0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
cee0: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_3)..off |= (E
cef0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cf00: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
cf10: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
cf20: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66  TLSv1_3);.#endif
cf30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
cf40: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
cf50: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20  ror();..    ctx 
cf60: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
cf70: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21  thod);.    if (!
cf80: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ctx) {..return N
cf90: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
cfa0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
cfb0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
cfc0: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
cfd0: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
cfe0: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
cff0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
d000: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
d010: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d020: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
d030: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
d040: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
d050: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
d060: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
d070: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
d080: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
d090: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
d0a0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
d0b0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
d0c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
d0d0: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73  * Force cipher s
d0e0: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62  election order b
d0f0: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20  y server */.    
d100: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b  if (!isServer) {
d110: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70  ..SSL_CTX_set_op
d120: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
d130: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f  P_CIPHER_SERVER_
d140: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20  PREFERENCE);.   
d150: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
d160: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
d170: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
d180: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c   OpenSSL_add_all
d190: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f  _algorithms(); /
d1a0: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61  * Load ciphers a
d1b0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65  nd digests */.#e
d1c0: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54  ndif..    SSL_CT
d1d0: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
d1e0: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
d1f0: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
d200: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
d210: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
d220: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
d230: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
d240: 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b  all SSL bug work
d250: 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53  arounds */.    S
d260: 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f  SL_CTX_set_optio
d270: 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e  ns(ctx, SSL_OP_N
d280: 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09  O_COMPRESSION);.
d290: 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72  /* disable compr
d2a0: 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73  ession even if s
d2b0: 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20  upported */.    
d2c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
d2d0: 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09  ons(ctx, off);..
d2e0: 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f  /* disable proto
d2f0: 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a  col versions */.
d300: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
d310: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
d320: 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c  0101000L.    SSL
d330: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74  _CTX_set_mode(ct
d340: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
d350: 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64  _RETRY);./* hand
d360: 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65  le new handshake
d370: 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e  s in background.
d380: 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69   On by default i
d390: 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e  n OpenSSL 1.1.1.
d3a0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53   */.#endif.    S
d3b0: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
d3c0: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20  cache_size(ctx, 
d3d0: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  128);..    /* Se
d3e0: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  t user defined c
d3f0: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73  iphers, cipher s
d400: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72  uites, and secur
d410: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
d420: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
d430: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
d440: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
d450: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
d460: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d470: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
d480: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65  et ciphers faile
d490: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
d4a0: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
d4b0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
d4c0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
d4d0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
d4e0: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69    if ((ciphersui
d4f0: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  tes != NULL) && 
d500: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
d510: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63  hersuites(ctx, c
d520: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a  iphersuites)) {.
d530: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d540: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
d550: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69  ipher suites fai
d560: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
d570: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
d580: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
d590: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
d5a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d5b0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
d5c0: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
d5d0: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
d5e0: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
d5f0: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
d600: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
d610: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
d620: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
d630: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
d640: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
d650: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
d660: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
d670: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
d680: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
d690: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
d6a0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
d6b0: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
d6c0: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
d6d0: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
d6e0: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
d6f0: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
d700: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
d710: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
d720: 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  */.#ifdef OPENSS
d730: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
d740: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
d750: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d760: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
d770: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
d780: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
d790: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
d7a0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
d7b0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
d7c0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
d7d0: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
d7e0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
d7f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
d800: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 54  IO *bio;...    T
d810: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d820: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20  ds);..    bio = 
d830: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e  BIO_new_file(F2N
d840: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c  (DHparams, &ds),
d850: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28   "r");..    if (
d860: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53  !bio) {...Tcl_DS
d870: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
d880: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
d8a0: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61  d not find DH pa
d8b0: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20  rameters file", 
d8c0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d8d0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
d8e0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
d8f0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  LL;..    }...   
d900: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62   dh = PEM_read_b
d910: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c  io_DHparams(bio,
d920: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
d930: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65  L);..    BIO_fre
d940: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c  e(bio);..    Tcl
d950: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
d960: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29  );..    if (!dh)
d970: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
d980: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
d990: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48  ould not read DH
d9a0: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d   parameters from
d9b0: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
d9c0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
d9d0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
d9e0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
d9f0: 20 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   }..    SSL_CTX_
da00: 73 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20  set_tmp_dh(ctx, 
da10: 64 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65  dh);..    DH_fre
da20: 65 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  e(dh);...} else 
da30: 7b 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65  {..    /* Use we
da40: 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61  ll known DH para
da50: 6d 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65  meters that have
da60: 20 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72   built-in suppor
da70: 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a  t in OpenSSL */.
da80: 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54  .    if (!SSL_CT
da90: 58 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74  X_set_dh_auto(ct
daa0: 78 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41  x, 1)) {...Tcl_A
dab0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dac0: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65  rp, "Could not e
dad0: 6e 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74  nable set DH aut
dae0: 6f 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  o: ", GET_ERR_RE
daf0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
db00: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
db10: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
db20: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
db30: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64   }..}.    }.#end
db40: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f  if..    /* set o
db50: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  ur certificate *
db60: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61  /.    load_priva
db70: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  te_key = 0;.    
db80: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20  if (certfile != 
db90: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
dba0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a  ivate_key = 1;..
dbb0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74  .Tcl_DStringInit
dbc0: 28 26 64 73 29 3b 0a 09 69 66 20 28 53 53 4c 5f  (&ds);..if (SSL_
dbd0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
dbe0: 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  ate_file(ctx, F2
dbf0: 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29  N(certfile, &ds)
dc00: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
dc10: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  EM) <= 0) {..   
dc20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
dc30: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
dc40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
dc50: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
dc60: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20  set certificate 
dc70: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
dc80: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52  , ": ",...GET_ER
dc90: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
dca0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
dcb0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
dcc0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
dcd0: 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53  NULL;..}..Tcl_DS
dce0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
dcf0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
dd00: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  cert != NULL) {.
dd10: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
dd20: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f  y = 1;..if (SSL_
dd30: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
dd40: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65  ate_ASN1(ctx, ce
dd50: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d  rt_len, cert) <=
dd60: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41   0) {..    Tcl_A
dd70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
dd80: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
dd90: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
dda0: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
ddb0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
ddc0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
ddd0: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
dde0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
ddf0: 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ..}..    } else 
de00: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63  {..certfile = (c
de10: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65  har*)X509_get_de
de20: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28  fault_cert_file(
de30: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
de40: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
de50: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66  _file(ctx, certf
de60: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ile, SSL_FILETYP
de70: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23  E_PEM) <= 0) {.#
de80: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70  if 0..    Tcl_Ap
de90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dea0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73  p, "unable to us
deb0: 65 20 64 65 66 61 75 6c 74 20 63 65 72 74 69 66  e default certif
dec0: 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65  icate file ", ce
ded0: 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09  rtfile, ": ",...
dee0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
def0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
df00: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
df10: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
df20: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64  eturn NULL;.#end
df30: 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  if..}.    }..   
df40: 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76   /* set our priv
df50: 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69  ate key */.    i
df60: 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  f (load_private_
df70: 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66  key) {..if (keyf
df80: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b  ile == NULL && k
df90: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  ey == NULL) {.. 
dfa0: 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72     keyfile = cer
dfb0: 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28  tfile;..}...if (
dfc0: 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29  keyfile != NULL)
dfd0: 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74   {..    /* get t
dfe0: 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20 61  he private key a
dff0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
e000: 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65 20  his certificate 
e010: 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66  */..    if (keyf
e020: 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile == NULL) {..
e030: 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66  .keyfile = certf
e040: 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ile;..    }...  
e050: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
e060: 74 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  t(&ds);..    if 
e070: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
e080: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
e090: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
e0a0: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
e0b0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
e0c0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
e0d0: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
e0e0: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
e0f0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
e100: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
e110: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
e120: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
e130: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
e140: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
e150: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
e160: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
e170: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
e180: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20  yfile, " ",...  
e190: 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e    GET_ERR_REASON
e1a0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
e1b0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
e1c0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
e1d0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
e1e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
e1f0: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c  ree(&ds);...} el
e200: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55  se if (key != NU
e210: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53  LL) {..    if (S
e220: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
e230: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50  teKey_ASN1(EVP_P
e240: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65  KEY_RSA, ctx, ke
e250: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29  y,key_len) <= 0)
e260: 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68   {.../* flush th
e270: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
e280: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
e290: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
e2a0: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
e2b0: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
e2c0: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
e2d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e2e0: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
e2f0: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
e300: 79 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  y: ", GET_ERR_RE
e310: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
e320: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
e330: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
e340: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
e350: 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65   }..}../* Now we
e360: 20 6b 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79   know that a key
e370: 20 61 6e 64 20 63 65 72 74 20 68 61 76 65 20 62   and cert have b
e380: 65 65 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a  een set against.
e390: 09 20 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74  . * the SSL cont
e3a0: 65 78 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  ext */..if (!SSL
e3b0: 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61  _CTX_check_priva
e3c0: 74 65 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09  te_key(ctx)) {..
e3d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
e3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72  sult(interp, "pr
e3f0: 69 76 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e  ivate key does n
e400: 6f 74 20 6d 61 74 63 68 20 74 68 65 20 63 65 72  ot match the cer
e410: 74 69 66 69 63 61 74 65 20 70 75 62 6c 69 63 20  tificate public 
e420: 6b 65 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63  key",....     (c
e430: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
e440: 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28     SSL_CTX_free(
e450: 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ctx);..    retur
e460: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
e470: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20  ..    /* Set to 
e480: 75 73 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 61  use default loca
e490: 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f  tion and file fo
e4a0: 72 20 43 65 72 74 69 66 69 63 61 74 65 20 41 75  r Certificate Au
e4b0: 74 68 6f 72 69 74 79 20 28 43 41 29 20 63 65 72  thority (CA) cer
e4c0: 74 69 66 69 63 61 74 65 73 2e 20 54 68 65 0a 20  tificates. The. 
e4d0: 20 20 20 20 2a 20 76 65 72 69 66 79 20 70 61 74      * verify pat
e4e0: 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20  h and store can 
e4f0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
e500: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49   the SSL_CERT_DI
e510: 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 20 76  R env var. The v
e520: 65 72 69 66 79 20 66 69 6c 65 20 63 61 6e 0a 20  erify file can. 
e530: 20 20 20 20 2a 20 62 65 20 6f 76 65 72 72 69 64      * be overrid
e540: 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43  den by the SSL_C
e550: 45 52 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72  ERT_FILE env var
e560: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53  . */.    if (!SS
e570: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e580: 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63  t_verify_paths(c
e590: 74 78 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b  tx)) {..abort++;
e5a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
e5b0: 76 65 72 72 69 64 65 73 20 66 6f 72 20 74 68 65  verrides for the
e5c0: 20 43 41 20 76 65 72 69 66 79 20 70 61 74 68 20   CA verify path 
e5d0: 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  and file */.    
e5e0: 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  {.#if OPENSSL_VE
e5f0: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
e600: 78 33 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28  x30000000L..if (
e610: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c  CApath != NULL |
e620: 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  | CAfile != NULL
e630: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
e640: 72 69 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54  ring ds1;..    T
e650: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
e660: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  ds);..    Tcl_DS
e670: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
e680: 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  ...    if (!SSL_
e690: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
e6a0: 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46  locations(ctx, F
e6b0: 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c  2N(CAfile, &ds),
e6c0: 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73   F2N(CApath, &ds
e6d0: 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  1))) {...abort++
e6e0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
e6f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e700: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  s);..    Tcl_DSt
e710: 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a  ringFree(&ds1);.
e720: 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73  ..    /* Set lis
e730: 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64  t of CAs to send
e740: 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20   to client when 
e750: 72 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69  requesting a cli
e760: 65 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ent certificate 
e770: 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73  */..    /* https
e780: 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e  ://sourceforge.n
e790: 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37  et/p/tls/bugs/57
e7a0: 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58  / */..    /* XXX
e7b0: 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75  :TODO: Let the u
e7c0: 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65  ser supply value
e7d0: 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f  s here instead o
e7e0: 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74  f something that
e7f0: 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66   exists on the f
e800: 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20  ilesystem */..  
e810: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
e820: 74 28 26 64 73 29 3b 0a 09 20 20 20 20 53 54 41  t(&ds);..    STA
e830: 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
e840: 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53   *certNames = SS
e850: 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41  L_load_client_CA
e860: 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65  _file(F2N(CAfile
e870: 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66  , &ds));..    if
e880: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e   (certNames != N
e890: 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58  ULL) {...SSL_CTX
e8a0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _set_client_CA_l
e8b0: 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d  ist(ctx, certNam
e8c0: 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  es);..    }..   
e8d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
e8e0: 28 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65  (&ds);..}..#else
e8f0: 0a 09 69 66 20 28 43 41 70 61 74 68 20 21 3d 20  ..if (CApath != 
e900: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c  NULL) {..    Tcl
e910: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
e920: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c  );..    if (!SSL
e930: 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
e940: 5f 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41  _dir(ctx, F2N(CA
e950: 70 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09  path, &ds))) {..
e960: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
e970: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e980: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09  gFree(&ds);..}..
e990: 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55  if (CAfile != NU
e9a0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44  LL) {..    Tcl_D
e9b0: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
e9c0: 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  ..    if (!SSL_C
e9d0: 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66  TX_load_verify_f
e9e0: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66  ile(ctx, F2N(CAf
e9f0: 69 6c 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09  ile, &ds))) {...
ea00: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
ea10: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
ea20: 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20  Free(&ds);...   
ea30: 20 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20   /* Set list of 
ea40: 43 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63  CAs to send to c
ea50: 6c 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65  lient when reque
ea60: 73 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63  sting a client c
ea70: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
ea80: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ea90: 69 74 28 26 64 73 29 3b 0a 09 20 20 20 20 53 54  it(&ds);..    ST
eaa0: 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
eab0: 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
eac0: 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
ead0: 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
eae0: 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69  e, &ds));..    i
eaf0: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
eb00: 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54  NULL) {...SSL_CT
eb10: 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
eb20: 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
eb30: 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  mes);..    }..  
eb40: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
eb50: 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69  e(&ds);..}.#endi
eb60: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  f.    }..    ret
eb70: 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn ctx;.}.../*.
eb80: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
eb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74  -----. *. * Stat
ebd0: 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  usObjCmd -- retu
ebe0: 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66  rn certificate f
ebf0: 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65  or connected pee
ec00: 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  r.. *. * Results
ec10: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
ec20: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
ec30: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
ec40: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec90: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
eca0: 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c  .StatusObjCmd(Cl
ecb0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
ecc0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
ecd0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
ece0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
ecf0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
ed00: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
ed10: 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
ed20: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
ed30: 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
ed40: 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
ed50: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
ed60: 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
ed70: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63   int mode;.    c
ed80: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
ed90: 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75  ar *proto;.    u
eda0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b  nsigned int len;
edb0: 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65  .    int nid, re
edc0: 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  s;.    (void) cl
edd0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
ede0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
edf0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
ee00: 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20  < 2 || objc > 3 
ee10: 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26  || (objc == 3 &&
ee20: 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   !strcmp(Tcl_Get
ee30: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
ee40: 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09   "-local"))) {..
ee50: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
ee60: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
ee70: 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
ee80: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
ee90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
eea0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
eeb0: 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
eec0: 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
eed0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28  GetString(objv[(
eee0: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20  objc == 2 ? 1 : 
eef0: 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d  2)]);.    chan =
ef00: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
ef10: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
ef20: 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
ef30: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
ef40: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
ef50: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
ef60: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
ef70: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
ef80: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
ef90: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
efa0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
efb0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
efc0: 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
efd0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
efe0: 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
eff0: 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
f000: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f010: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
f020: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
f030: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
f040: 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
f050: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
f060: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f070: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
f080: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
f090: 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41  , "STATUS", "CHA
f0a0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
f0b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f0c0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
f0d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
f0e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
f0f0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
f100: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
f110: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  han);..    /* Ge
f120: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
f130: 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a  r peer or self *
f140: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
f150: 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53  = 2) {..peer = S
f160: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74  SL_get_peer_cert
f170: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
f180: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
f190: 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  se {..peer = SSL
f1a0: 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65  _get_certificate
f1b0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
f1c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47  .    }..    /* G
f1d0: 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63  et X509 certific
f1e0: 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ate info */.    
f1f0: 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a  if (peer) {..obj
f200: 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30  Ptr = Tls_NewX50
f210: 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65  9Obj(interp, pee
f220: 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d  r);..if (objc ==
f230: 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f   2) {..    X509_
f240: 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20  free(peer);..   
f250: 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d   peer = NULL;..}
f260: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f  .    } else {..o
f270: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
f280: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
f290: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
f2a0: 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  eer name */.    
f2b0: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
f2c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65  rp, objPtr, "pee
f2d0: 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30  rname", SSL_get0
f2e0: 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50  _peername(stateP
f2f0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20  tr->ssl), -1);. 
f300: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
f310: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f320: 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f  sbits", SSL_get_
f330: 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74  cipher_bits(stat
f340: 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29  ePtr->ssl, NULL)
f350: 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20  );..    ciphers 
f360: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74  = (char*)SSL_get
f370: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
f380: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50  ->ssl);.    LAPP
f390: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
f3a0: 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
f3b0: 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a  , ciphers, -1);.
f3c0: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
f3d0: 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63  he X509 certific
f3e0: 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79  ate presented by
f3f0: 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20   the peer */.   
f400: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
f410: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
f420: 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35  rifyResult",..X5
f430: 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65  09_verify_cert_e
f440: 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f  rror_string(SSL_
f450: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
f460: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
f470: 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
f480: 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20  Verify mode */. 
f490: 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65     mode = SSL_ge
f4a0: 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74  t_verify_mode(st
f4b0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
f4c0: 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53    if (mode && SS
f4d0: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b  L_VERIFY_NONE) {
f4e0: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
f4f0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76  terp, objPtr, "v
f500: 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e  erifyMode", "non
f510: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65  e", -1);.    } e
f520: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
f530: 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c  listObjPtr = Tcl
f540: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
f550: 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20  ULL);..if (mode 
f560: 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45  && SSL_VERIFY_PE
f570: 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  ER) {..    Tcl_L
f580: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f590: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
f5a0: 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
f5b0: 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c  tringObj("peer",
f5c0: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
f5d0: 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
f5e0: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
f5f0: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54  R_CERT) {..    T
f600: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f610: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f620: 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
f630: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61  NewStringObj("fa
f640: 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65  il if no peer ce
f650: 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  rt", -1));..}..i
f660: 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
f670: 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
f680: 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
f690: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f6a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
f6b0: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
f6c0: 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20  ringObj("client 
f6d0: 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  once", -1));..}.
f6e0: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
f6f0: 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
f700: 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54  DSHAKE) {..    T
f710: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f720: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
f730: 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
f740: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f  NewStringObj("po
f750: 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d  st handshake", -
f760: 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44  1));..}..LAPPEND
f770: 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
f780: 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
f790: 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20  ", listObjPtr). 
f7a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
f7b0: 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a  ify mode depth *
f7c0: 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  /.    LAPPEND_IN
f7d0: 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
f7e0: 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c  , "verifyDepth",
f7f0: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
f800: 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e  depth(statePtr->
f810: 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  ssl));..    /* R
f820: 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
f830: 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
f840: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e   result of the n
f850: 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20  egotiation */.  
f860: 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f    SSL_get0_alpn_
f870: 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74  selected(statePt
f880: 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  r->ssl, &proto, 
f890: 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45  &len);.    LAPPE
f8a0: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
f8b0: 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28  bjPtr, "alpn", (
f8c0: 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54  char *)proto, (T
f8d0: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20  cl_Size) len);. 
f8e0: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
f8f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f900: 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67  protocol", SSL_g
f910: 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65  et_version(state
f920: 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a  Ptr->ssl), -1);.
f930: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f  .    /* Valid fo
f940: 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74  r non-RSA signat
f950: 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20  ure and TLS 1.3 
f960: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
f970: 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 2) {..res = S
f980: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e  SL_get_peer_sign
f990: 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
f9a0: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
f9b0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
f9c0: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
f9d0: 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
f9e0: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
f9f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
fa00: 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20  es) {nid = 0;}. 
fa10: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
fa20: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
fa30: 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67  signatureHashAlg
fa40: 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64  orithm", OBJ_nid
fa50: 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
fa60: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
fa70: 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  2) {..res = SSL_
fa80: 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
fa90: 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
faa0: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
fab0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
fac0: 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
fad0: 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
fae0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
faf0: 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
fb00: 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
fb10: 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
fb20: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
fb30: 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
fb40: 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  Type", OBJ_nid2l
fb50: 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
fb60: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
fb70: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
fb80: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
fb90: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbe0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63  ---. *. * Connec
fbf0: 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d  tionInfoObjCmd -
fc00: 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74  - return connect
fc10: 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70  ion info from Op
fc20: 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73  enSSL.. *. * Res
fc30: 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20  ults:. *.A list 
fc40: 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  of connection in
fc50: 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  fo.  *. *-------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
fca0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e  ..static int Con
fcb0: 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d  nectionInfoObjCm
fcc0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
fcd0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
fce0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
fcf0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
fd00: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
fd10: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
fd20: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
fd30: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
fd40: 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74  ode on */.    St
fd50: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09  ate *statePtr;..
fd60: 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20  /* client state 
fd70: 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a  for ssl socket *
fd80: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  /.    Tcl_Obj *o
fd90: 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b  bjPtr, *listPtr;
fda0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a  .    const SSL *
fdb0: 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  ssl;.    const S
fdc0: 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65  SL_CIPHER *ciphe
fdd0: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
fde0: 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f  _SESSION *sessio
fdf0: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50  n;.    const EVP
fe00: 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f  _MD *md;.    (vo
fe10: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
fe20: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
fe30: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
fe40: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
fe50: 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65  1, objv, "channe
fe60: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
fe70: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
fe80: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
fe90: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
fea0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
feb0: 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a  bjv[1]), NULL);.
fec0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
fed0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
fee0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
fef0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
ff00: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
ff10: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
ff20: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
ff30: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
ff40: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
ff50: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
ff60: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
ff70: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
ff80: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
ff90: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
ffa0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
ffb0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
ffc0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ffd0: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c  e(chan),..    "\
ffe0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
fff0: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
10000 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
10010 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
10020 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
10030 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
10040 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
10050 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
10060 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10070 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72     }..    objPtr
10080 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
10090 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  j(0, NULL);..   
100a0 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
100b0 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  nfo */.    state
100c0 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54  Ptr = (State *)T
100d0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
100e0 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b  tanceData(chan);
100f0 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65  .    ssl = state
10100 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66  Ptr->ssl;.    if
10110 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
10120 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ../* connection 
10130 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e  state */..LAPPEN
10140 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10150 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53  jPtr, "state", S
10160 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
10170 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a  long(ssl), -1);.
10180 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71  ../* Get SNI req
10190 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61  uested server na
101a0 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  me */..LAPPEND_S
101b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
101c0 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c  r, "servername",
101d0 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
101e0 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
101f0 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
10200 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47  me), -1);.../* G
10210 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09  et protocol */..
10220 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10230 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f  rp, objPtr, "pro
10240 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  tocol", SSL_get_
10250 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31  version(ssl), -1
10260 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69  );.../* Renegoti
10270 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f  ation allowed */
10280 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
10290 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
102a0 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c  renegotiation_al
102b0 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f  lowed", SSL_get_
102c0 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61  secure_renegotia
102d0 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53  tion_support((SS
102e0 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a  L *) ssl));.../*
102f0 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65   Get security le
10300 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  vel */..LAPPEND_
10310 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10320 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65  tr, "security_le
10330 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  vel", SSL_get_se
10340 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c  curity_level(ssl
10350 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
10360 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
10370 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10380 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
10390 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73  reused", SSL_ses
103a0 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29  sion_reused(ssl)
103b0 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65  );.../* Is serve
103c0 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45  r info */..LAPPE
103d0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
103e0 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76  objPtr, "is_serv
103f0 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76  er", SSL_is_serv
10400 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49  er(ssl));.../* I
10410 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45  s DTLS */..LAPPE
10420 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
10430 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73  objPtr, "is_dtls
10440 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73  ", SSL_is_dtls(s
10450 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  sl));.    }..   
10460 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20   /* Cipher info 
10470 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20  */.    cipher = 
10480 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
10490 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20  cipher(ssl);.   
104a0 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e   if (cipher != N
104b0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
104c0 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a  [BUFSIZ] = {0};.
104d0 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62  .int bits, alg_b
104e0 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72  its;.../* Cipher
104f0 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e   name */..LAPPEN
10500 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10510 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20  jPtr, "cipher", 
10520 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e  SSL_CIPHER_get_n
10530 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ame(cipher), -1)
10540 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20  ;.../* RFC name 
10550 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  of cipher */..LA
10560 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10570 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64  , objPtr, "stand
10580 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43  ard_name", SSL_C
10590 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e  IPHER_standard_n
105a0 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ame(cipher), -1)
105b0 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e  ;.../* OpenSSL n
105c0 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f  ame of cipher */
105d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
105e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f  terp, objPtr, "o
105f0 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50  penssl_name", OP
10600 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d  ENSSL_cipher_nam
10610 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61  e(SSL_CIPHER_sta
10620 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65  ndard_name(ciphe
10630 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e  r)), -1);.../* n
10640 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20  umber of secret 
10650 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69  bits used for ci
10660 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20  pher */..bits = 
10670 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62  SSL_CIPHER_get_b
10680 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67  its(cipher, &alg
10690 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44  _bits);..LAPPEND
106a0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
106b0 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74  Ptr, "secret_bit
106c0 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50  s", bits);..LAPP
106d0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
106e0 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74  objPtr, "algorit
106f0 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69  hm_bits", alg_bi
10700 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74  ts);../* alg_bit
10710 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20  s is actual key 
10720 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20  secret bits. If 
10730 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63  use bits and sec
10740 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20  ret (algorithm) 
10750 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20  bits differ,..  
10760 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
10770 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c   bits are fixed,
10780 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65   i.e. for limite
10790 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73  d export ciphers
107a0 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a   (bits < 56) */.
107b0 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77  ../* Indicates w
107c0 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f  hich SSL/TLS pro
107d0 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69  tocol version fi
107e0 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20  rst defined the 
107f0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
10800 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10810 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73  bjPtr, "min_vers
10820 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  ion", SSL_CIPHER
10830 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70  _get_version(cip
10840 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  her), -1);.../* 
10850 43 69 70 68 65 72 20 4e 49 44 2c 20 64 69 67 65  Cipher NID, dige
10860 73 74 20 4e 49 44 20 28 6e 6f 6e 65 20 66 6f 72  st NID (none for
10870 20 41 45 41 44 20 63 69 70 68 65 72 20 73 75 69   AEAD cipher sui
10880 74 65 73 29 2c 20 4b 65 79 20 45 78 63 68 61 6e  tes), Key Exchan
10890 67 65 20 4e 49 44 2c 20 61 6e 64 20 61 75 74 68  ge NID, and auth
108a0 65 6e 74 69 63 61 74 69 6f 6e 20 4e 49 44 20 2a  entication NID *
108b0 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
108c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
108d0 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61  cipherNID", (cha
108e0 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
108f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69  SL_CIPHER_get_ci
10900 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29  pher_nid(cipher)
10910 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ), -1);..LAPPEND
10920 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10930 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22  Ptr, "digestNID"
10940 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
10950 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
10960 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63  get_digest_nid(c
10970 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
10980 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10990 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45  p, objPtr, "keyE
109a0 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68  xchangeNID", (ch
109b0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
109c0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b  SSL_CIPHER_get_k
109d0 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  x_nid(cipher)), 
109e0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
109f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10a00 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f  , "authenticatio
10a10 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  nNID", (char *)O
10a20 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
10a30 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69  PHER_get_auth_ni
10a40 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
10a50 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75  .../* message au
10a60 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64  thentication cod
10a70 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45  e - Cipher is AE
10a80 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20  AD (e.g. GCM or 
10a90 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30  ChaCha20/Poly130
10aa0 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a  5) or not */../*
10ab0 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45   Authenticated E
10ac0 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61  ncryption with a
10ad0 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28  ssociated data (
10ae0 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09  AEAD) check */..
10af0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
10b00 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
10b10 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53  pher_is_aead", S
10b20 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61  SL_CIPHER_is_aea
10b30 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
10b40 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65   Get OpenSSL-spe
10b50 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41  cific ID, not IA
10b60 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e  NA ID */..LAPPEN
10b70 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10b80 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64  jPtr, "cipher_id
10b90 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
10ba0 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65  HER_get_id(ciphe
10bb0 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79  r));.../* Two-by
10bc0 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68  te ID used in th
10bd0 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f  e TLS protocol o
10be0 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68  f the given ciph
10bf0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49  er */..LAPPEND_I
10c00 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
10c10 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22  r, "protocol_id"
10c20 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48  , (int) SSL_CIPH
10c30 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f  ER_get_protocol_
10c40 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
10c50 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69  * Textual descri
10c60 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70  ption of the cip
10c70 68 65 72 2e 20 49 6e 63 6c 75 64 65 73 3a 20 63  her. Includes: c
10c80 69 70 68 65 72 20 6e 61 6d 65 2c 20 70 72 6f 74  ipher name, prot
10c90 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 2c 20 6b 65  ocol version, ke
10ca0 79 0a 09 20 20 20 65 78 63 68 61 6e 67 65 2c 20  y..   exchange, 
10cb0 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 2c 20  authentication, 
10cc0 73 79 6d 6d 65 74 72 69 63 20 65 6e 63 72 79 70  symmetric encryp
10cd0 74 69 6f 6e 20 6d 65 74 68 6f 64 2c 20 6d 65 73  tion method, mes
10ce0 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74  sage authenticat
10cf0 69 6f 6e 20 63 6f 64 65 20 2a 2f 0a 09 69 66 20  ion code */..if 
10d00 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
10d10 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20  ription(cipher, 
10d20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
10d30 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) != NULL) {..  
10d40 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10d50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
10d60 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66  escription", buf
10d70 2c 20 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44  , -1);..}.../* D
10d80 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e  igest used durin
10d90 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61  g the SSL/TLS ha
10da0 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69  ndshake when usi
10db0 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a  ng the cipher. *
10dc0 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48  /..md = SSL_CIPH
10dd0 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65  ER_get_handshake
10de0 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b  _digest(cipher);
10df0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10e00 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68  terp, objPtr, "h
10e10 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22  andshake_digest"
10e20 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44  , (char *)EVP_MD
10e30 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a  _name(md), -1);.
10e40 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
10e50 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
10e60 20 20 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f    session = SSL_
10e70 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29  get_session(ssl)
10e80 3b 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  ;.    if (sessio
10e90 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  n != NULL) {..co
10ea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10eb0 72 20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65  r *ticket;..size
10ec0 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e  _t len2;..unsign
10ed0 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f  ed int ulen;..co
10ee0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
10ef0 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a  r *session_id, *
10f00 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
10f10 20 63 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c   char buffer[SSL
10f20 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
10f30 4c 45 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65  LENGTH];.../* Re
10f40 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
10f50 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
10f60 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c  result of the AL
10f70 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
10f80 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
10f90 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65  et0_alpn_selecte
10fa0 64 28 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74  d(session, &prot
10fb0 6f 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  o, &len2);..LAPP
10fc0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10fd0 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20  objPtr, "alpn", 
10fe0 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
10ff0 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
11000 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
11010 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
11020 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
11030 6f 66 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74  of the NPN negot
11040 69 61 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66  iation */.#ifdef
11050 20 55 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65   USE_NPN..SSL_ge
11060 74 30 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65  t0_next_proto_ne
11070 67 6f 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70  gotiated(ssl, &p
11080 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
11090 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
110a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22  p, objPtr, "npn"
110b0 2c 20 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f  , (char *) proto
110c0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
110d0 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  n);.#endif.../* 
110e0 52 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f  Resumable sessio
110f0 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  n */..LAPPEND_BO
11100 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
11110 72 2c 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20  r, "resumable", 
11120 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72  SSL_SESSION_is_r
11130 65 73 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e  esumable(session
11140 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
11150 20 73 74 61 72 74 20 74 69 6d 65 20 28 73 65 63   start time (sec
11160 6f 6e 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68  onds since epoch
11170 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
11180 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
11190 72 2c 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c  r, "start_time",
111a0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
111b0 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b  _time(session));
111c0 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61  .../* Timeout va
111d0 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65  lue - SSL_CTX_ge
111e0 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65  t_timeout (in se
111f0 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
11200 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
11210 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74  objPtr, "timeout
11220 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  ", SSL_SESSION_g
11230 65 74 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69  et_timeout(sessi
11240 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  on));.../* Sessi
11250 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20  on id - TLSv1.2 
11260 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a  and below only *
11270 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
11280 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
11290 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
112a0 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  n);..LAPPEND_BAR
112b0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
112c0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22  tr, "session_id"
112d0 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
112e0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
112f0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e  ../* Session con
11300 74 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  text */..session
11310 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
11320 4e 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78  N_get0_id_contex
11330 74 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  t(session, &ulen
11340 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
11350 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
11360 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74  r, "session_cont
11370 65 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  ext", session_id
11380 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
11390 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  n);.../* Session
113a0 20 74 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74   ticket - client
113b0 20 6f 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45   only */..SSL_SE
113c0 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65  SSION_get0_ticke
113d0 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  t(session, &tick
113e0 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
113f0 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
11400 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
11410 73 69 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69  sion_ticket", ti
11420 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
11430 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73   len2);.../* Ses
11440 73 69 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65  sion ticket life
11450 74 69 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65  time hint (in se
11460 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45  conds) */..LAPPE
11470 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20  ND_LONG(interp, 
11480 6f 62 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d  objPtr, "lifetim
11490 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
114a0 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74  get_ticket_lifet
114b0 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e  ime_hint(session
114c0 29 29 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20  ));.../* Ticket 
114d0 61 70 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20  app data */.#if 
114e0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
114f0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
11500 30 30 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f  000L..SSL_SESSIO
11510 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70  N_get0_ticket_ap
11520 70 64 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49  pdata((SSL_SESSI
11530 4f 4e 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26  ON *) session, &
11540 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a  ticket, &len2);.
11550 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
11560 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11570 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61  "ticket_app_data
11580 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  ", ticket, (Tcl_
11590 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e  Size) len2);.#en
115a0 64 69 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  dif.../* Get mas
115b0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
115c0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
115d0 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
115e0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
115f0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
11600 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
11610 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
11620 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
11630 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
11640 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
11650 29 3b 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73  );.../* Compress
11660 69 6f 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67  ion id */..unsig
11670 6e 65 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c  ned int id = SSL
11680 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d  _SESSION_get_com
11690 70 72 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e  press_id(session
116a0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
116b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
116c0 22 63 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22  "compression_id"
116d0 2c 20 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69  , id == 1 ? "zli
116e0 62 22 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  b" : "none", -1)
116f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11700 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f  Compression info
11710 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20   */.    if (ssl 
11720 21 3d 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65  != NULL) {.#ifde
11730 66 20 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52  f HAVE_SSL_COMPR
11740 45 53 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f  ESSION..const CO
11750 4d 50 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c  MP_METHOD *comp,
11760 20 2a 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20   *expn;..comp = 
11770 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
11780 63 6f 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29  compression(ssl)
11790 3b 0a 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65  ;..expn = SSL_ge
117a0 74 5f 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73  t_current_expans
117b0 69 6f 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50  ion(ssl);...LAPP
117c0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
117d0 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
117e0 73 69 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53  sion", comp ? SS
117f0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
11800 63 6f 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  comp) : "none", 
11810 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
11820 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11830 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65  , "expansion", e
11840 78 70 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  xpn ? SSL_COMP_g
11850 65 74 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20  et_name(expn) : 
11860 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c  "none", -1);.#el
11870 73 65 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  se..LAPPEND_STR(
11880 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11890 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22  "compression", "
118a0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50  none", -1);..LAP
118b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
118c0 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73   objPtr, "expans
118d0 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ion", "none", -1
118e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
118f0 0a 20 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69  .    /* Server i
11900 6e 66 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f  nfo */.    {..lo
11910 6e 67 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54  ng mode = SSL_CT
11920 58 5f 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61  X_get_session_ca
11930 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  che_mode(statePt
11940 72 2d 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a  r->ctx);..char *
11950 6d 73 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20  msg;...if (mode 
11960 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  & SSL_SESS_CACHE
11970 5f 4f 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67  _OFF) {..    msg
11980 20 3d 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73   = "off";..} els
11990 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
119a0 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
119b0 4e 54 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  NT) {..    msg =
119c0 20 22 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c   "client";..} el
119d0 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53  se if (mode & SS
119e0 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52  L_SESS_CACHE_SER
119f0 56 45 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20  VER) {..    msg 
11a00 3d 20 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65  = "server";..} e
11a10 6c 73 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53  lse if (mode & S
11a20 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f  SL_SESS_CACHE_BO
11a30 54 48 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  TH) {..    msg =
11a40 20 22 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65   "both";..} else
11a50 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75   {..    msg = "u
11a60 6e 6b 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50  nknown";..}..LAP
11a70 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11a80 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
11a90 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d  n_cache_mode", m
11aa0 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a  sg, -1);.    }..
11ab0 20 20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a      /* CA List *
11ac0 2f 0a 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20  /.    /* IF not 
11ad0 61 20 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61  a server, same a
11ae0 73 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f  s SSL_get0_peer_
11af0 43 41 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76  CA_list. If serv
11b00 65 72 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43  er same as SSL_C
11b10 54 58 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_get_client_CA
11b20 5f 6c 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73  _list */.    lis
11b30 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
11b40 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
11b50 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
11b60 39 5f 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74  9_NAME) *ca_list
11b70 3b 0a 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69  ;.    if ((ca_li
11b80 73 74 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69  st = SSL_get_cli
11b90 65 6e 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29  ent_CA_list(ssl)
11ba0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  ) != NULL) {..ch
11bb0 61 72 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a  ar buffer[BUFSIZ
11bc0 5d 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 20  ];...for (int i 
11bd0 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39  = 0; i < sk_X509
11be0 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73  _NAME_num(ca_lis
11bf0 74 29 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  t); i++) {..    
11c00 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20  X509_NAME *name 
11c10 3d 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76  = sk_X509_NAME_v
11c20 61 6c 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29  alue(ca_list, i)
11c30 3b 0a 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29  ;..    if (name)
11c40 20 7b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f   {...X509_NAME_o
11c50 6e 65 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66  neline(name, buf
11c60 66 65 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09  fer, BUFSIZ);...
11c70 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11c80 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
11c90 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65   listPtr, Tcl_Ne
11ca0 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65  wStringObj(buffe
11cb0 72 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a  r, -1));..    }.
11cc0 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50  .}.    }.    LAP
11cd0 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
11ce0 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
11cf0 22 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  ", listPtr);.   
11d00 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
11d10 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61  erp, objPtr, "ca
11d20 4c 69 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58  ListCount", sk_X
11d30 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f  509_NAME_num(ca_
11d40 6c 69 73 74 29 29 3b 0a 0a 0a 20 20 20 20 54 63  list));...    Tc
11d50 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11d60 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
11d70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
11d80 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
11d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
11dd0 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64   *. * MiscObjCmd
11de0 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64   -- misc command
11df0 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
11e00 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
11e10 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
11e20 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
11e30 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
11e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e80 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
11e90 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  MiscObjCmd(Clien
11ea0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
11eb0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
11ec0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
11ed0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
11ee0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61  bjv[]) {.    sta
11ef0 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
11f00 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20  commands [] = { 
11f10 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c  "req", "strreq",
11f20 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75   NULL };.    enu
11f30 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45  m command { C_RE
11f40 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44  Q, C_STRREQ, C_D
11f50 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f  UMMY };.    Tcl_
11f60 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e  Size cmd;.    in
11f70 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  t isStr;.    cha
11f80 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
11f90 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
11fa0 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
11fb0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
11fc0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
11fd0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
11fe0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11ff0 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
12000 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
12010 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12020 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
12030 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
12040 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
12050 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
12060 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
12070 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
12080 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12090 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
120a0 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
120b0 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
120c0 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
120d0 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
120e0 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
120f0 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
12100 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
12110 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
12120 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
12130 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
12140 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
12150 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
12160 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
12170 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  ;..    Tcl_Size 
12180 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20  listc;..    int 
12190 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
121a0 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68  t=NULL;...    ch
121b0 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54  ar *k_C="",*k_ST
121c0 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f  ="",*k_L="",*k_O
121d0 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f  ="",*k_OU="",*k_
121e0 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22  CN="",*k_Email="
121f0 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65  ";..    char *ke
12200 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74  yout,*pemout,*st
12210 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73  r;..    int keys
12220 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79  ize,serial=0,day
12230 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e  s=365;..#if OPEN
12240 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
12250 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
12260 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e  ..    BIGNUM *bn
12270 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52  e = NULL;..    R
12280 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a  SA *rsa = NULL;.
12290 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50  #else..    EVP_P
122a0 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  KEY_CTX *ctx = N
122b0 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20  ULL;.#endif...  
122c0 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c    if ((objc<5) |
122d0 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09  | (objc>6)) {...
122e0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
122f0 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
12300 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69  , "keysize keyfi
12310 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66  le certfile ?inf
12320 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  o?");...return T
12330 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
12340 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ...    if (Tcl_G
12350 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
12360 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b  erp, objv[2], &k
12370 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f  eysize) != TCL_O
12380 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
12390 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
123a0 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f  .    keyout=Tcl_
123b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
123c0 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d  ]);..    pemout=
123d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
123e0 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20  jv[4]);..    if 
123f0 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f  (isStr) {...Tcl_
12400 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
12410 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63  yout,"",0);...Tc
12420 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
12430 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20  pemout,"",0);.. 
12440 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f     }...    if (o
12450 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28  bjc>=6) {...if (
12460 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
12470 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
12480 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20  bjv[5], &listc, 
12490 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
124a0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
124b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
124c0 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
124d0 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
124e0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
124f0 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
12500 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
12510 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
12520 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
12530 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
12540 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
12550 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
12560 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
12570 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
12580 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
12590 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
125a0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
125b0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
125c0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
125d0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
125e0 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
125f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12600 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
12610 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
12620 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
12630 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
12640 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
12650 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
12660 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
12670 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12680 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
12690 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
126a0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
126b0 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
126c0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
126d0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
126e0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
126f0 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
12700 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
12710 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
12720 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
12730 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
12740 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
12750 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12760 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
12770 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12780 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
12790 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
127a0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
127b0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
127c0 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
127d0 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
127e0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
127f0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
12800 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
12810 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
12820 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
12830 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
12840 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
12850 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
12860 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
12870 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
12880 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
12890 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
128a0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
128b0 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
128c0 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
128d0 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
128e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
128f0 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
12900 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
12910 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
12920 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
12930 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
12940 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
12950 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
12960 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
12970 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
12980 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
12990 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
129a0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
129b0 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
129c0 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
129d0 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
129e0 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
129f0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
12a00 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
12a10 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
12a20 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
12a30 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
12a40 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
12a50 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
12a60 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
12a70 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
12a80 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
12a90 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
12aa0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
12ab0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
12ac0 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
12ad0 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
12ae0 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
12af0 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
12b00 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
12b10 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
12b20 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
12b30 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
12b40 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
12b50 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
12b60 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
12b70 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
12b80 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
12b90 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
12ba0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
12bb0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
12bc0 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
12bd0 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
12be0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12bf0 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
12c00 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
12c10 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
12c20 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
12c30 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
12c40 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
12c50 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
12c60 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
12c70 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
12c80 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
12c90 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
12ca0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
12cb0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
12cc0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
12cd0 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
12ce0 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
12cf0 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
12d00 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
12d10 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
12d20 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
12d30 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
12d40 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
12d50 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
12d60 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
12d70 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
12d80 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
12d90 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
12da0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
12db0 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
12dc0 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
12dd0 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
12de0 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
12df0 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
12e00 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
12e10 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
12e20 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
12e30 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
12e40 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
12e50 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
12e60 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
12e70 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
12e80 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
12e90 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
12ea0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
12eb0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
12ec0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
12ed0 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
12ee0 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
12ef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
12f00 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65  }....X509_set_ve
12f10 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09  rsion(cert,2);..
12f20 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65  .ASN1_INTEGER_se
12f30 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61  t(X509_get_seria
12f40 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65  lNumber(cert),se
12f50 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d  rial);...X509_gm
12f60 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
12f70 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72  tm_notBefore(cer
12f80 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d  t),0);...X509_gm
12f90 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
12fa0 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74  tm_notAfter(cert
12fb0 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34  ),(long)60*60*24
12fc0 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73  *days);...X509_s
12fd0 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70  et_pubkey(cert,p
12fe0 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35  key);....name=X5
12ff0 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_get_subject_n
13000 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35  ame(cert);....X5
13010 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
13020 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
13030 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
13040 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
13050 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31   char *) k_C, -1
13060 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
13070 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
13080 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22  by_txt(name,"ST"
13090 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
130a0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
130b0 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31  char *) k_ST, -1
130c0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
130d0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
130e0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c  by_txt(name,"L",
130f0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
13100 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13110 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20  har *) k_L, -1, 
13120 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
13130 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13140 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d  _txt(name,"O", M
13150 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
13160 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13170 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31  r *) k_O, -1, -1
13180 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
13190 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
131a0 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42  xt(name,"OU", MB
131b0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
131c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
131d0 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31   *) k_OU, -1, -1
131e0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
131f0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13200 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42  xt(name,"CN", MB
13210 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
13220 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
13230 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31   *) k_CN, -1, -1
13240 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
13250 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13260 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c  xt(name,"Email",
13270 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
13280 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13290 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20  har *) k_Email, 
132a0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58  -1, -1, 0);....X
132b0 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f  509_set_subject_
132c0 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b  name(cert,name);
132d0 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69  ....if (!X509_si
132e0 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50  gn(cert,pkey,EVP
132f0 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09  _sha256())) {...
13300 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65      X509_free(ce
13310 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  rt);...    EVP_P
13320 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
13330 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
13340 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
13350 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
13360 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
13370 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  dif...    Tcl_Se
13380 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
13390 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65  Error signing ce
133a0 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29  rtificate",NULL)
133b0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
133c0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
133d0 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09  .if (isStr) {...
133e0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
133f0 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09  BIO_s_mem());...
13400 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
13410 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
13420 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
13430 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
13440 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
13450 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
13460 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
13470 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
13480 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
13490 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66  nterp,pemout,buf
134a0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
134b0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
134c0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
134d0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
134e0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
134f0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
13500 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
13510 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f  ilename(out,pemo
13520 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
13530 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
13540 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42  t,cert);...    B
13550 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
13560 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72  ;...}....X509_fr
13570 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f  ee(cert);...EVP_
13580 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13590 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
135a0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
135b0 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66  30000000L...BN_f
135c0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
135d0 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
135e0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
135f0 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20  .break;.    }.  
13600 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13610 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
13620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
13630 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
13640 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
13650 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136a0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
136b0 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
136c0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
136d0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
136e0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
136f0 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
13700 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
13710 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
13720 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
13730 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
13740 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13750 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
13760 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
13770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137b0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
137c0 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b  Free(char *block
137d0 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
137e0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
137f0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
13800 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13810 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
13820 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
13830 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
13840 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
13850 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13890 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
138a0 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
138b0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
138c0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
138d0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
138e0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
138f0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
13900 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
13910 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
13920 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
13930 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
13940 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
13950 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
13960 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
13970 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
13980 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
13990 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
139a0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
139b0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
139c0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
139d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13a00 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
13a10 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
13a20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
13a30 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13a40 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
13a50 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
13a60 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
13a70 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
13a80 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
13a90 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
13aa0 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
13ab0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
13ac0 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
13ad0 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
13ae0 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
13af0 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
13b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
13b10 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
13b20 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
13b30 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
13b40 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
13b50 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
13b60 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
13b70 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
13b80 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
13b90 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
13ba0 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
13bb0 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
13bc0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
13bd0 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
13be0 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
13bf0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
13c00 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
13c10 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
13c20 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
13c30 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
13c40 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
13c50 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
13c60 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
13c70 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
13c80 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
13c90 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
13ca0 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
13cb0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
13cc0 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
13cd0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
13ce0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
13cf0 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
13d00 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
13d10 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
13d20 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
13d30 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
13d40 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
13d50 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
13d60 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
13d70 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
13d80 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
13d90 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
13da0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
13db0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
13dc0 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
13dd0 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
13de0 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
13df0 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
13e00 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
13e10 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
13e20 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f 4d 41 4a  .}...#if TCL_MAJ
13e30 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23  OR_VERSION > 8.#
13e40 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49  define MIN_VERSI
13e50 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23  ON "9.0".#else.#
13e60 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49  define MIN_VERSI
13e70 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a  ON "8.5".#endif.
13e80 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
13e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
13ed0 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  Tls_Init --. *. 
13ee0 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b  *.This is a pack
13ef0 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  age initializati
13f00 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68  on procedure, wh
13f10 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a  ich is called. *
13f20 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69  .by Tcl when thi
13f30 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20  s package is to 
13f40 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69  be added to an i
13f50 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20  nterpreter.. *. 
13f60 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20  * Results:  Ssl 
13f70 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c  configured and l
13f80 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65  oaded. *. * Side
13f90 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72   effects:. *. cr
13fa0 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d  eate the ssl com
13fb0 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65  mand, initialize
13fc0 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a   ssl context. *.
13fd0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50  -----. */.DLLEXP
14020 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74  ORT int Tls_Init
14030 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
14040 65 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74  erp) {.    const
14050 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74   char tlsTclInit
14060 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e  Script[] = {.#in
14070 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68  clude "tls.tcl.h
14080 22 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a  "..0x00.    };..
14090 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
140a0 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55  led");..#ifdef U
140b0 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
140c0 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
140d0 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56  bs(interp, MIN_V
140e0 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
140f0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
14100 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
14110 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63  endif.    if (Tc
14120 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
14130 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f  erp, "Tcl", MIN_
14140 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e  VERSION, 0) == N
14150 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
14160 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
14170 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
14180 6e 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b  nit(0) != TCL_OK
14190 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
141a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
141b0 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c  ould not initial
141c0 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22  ize SSL library"
141d0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
141e0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
141f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
14200 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
14210 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
14220 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20  s::connection", 
14230 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62  ConnectionInfoOb
14240 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
14250 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
14260 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
14270 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
14280 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
14290 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
142a0 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
142b0 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
142c0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
142d0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
142e0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
142f0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
14300 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
14310 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74  :import", Import
14320 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
14330 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
14340 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
14350 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
14360 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
14370 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d  (interp, "tls::m
14380 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64  isc", MiscObjCmd
14390 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
143a0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
143b0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
143c0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
143d0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
143e0 70 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72  p, "tls::unimpor
143f0 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  t", UnimportObjC
14400 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
14410 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
14420 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
14430 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
14440 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
14450 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75  erp, "tls::statu
14460 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  s", StatusObjCmd
14470 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
14480 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
14490 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
144a0 3b 0a 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73  ;..    Tls_Diges
144b0 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70  tCommands(interp
144c0 29 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63 72 79  );.    Tls_Encry
144d0 70 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72  ptCommands(inter
144e0 70 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f  p);.    Tls_Info
144f0 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29  Commands(interp)
14500 3b 0a 20 20 20 20 54 6c 73 5f 4b 44 46 43 6f 6d  ;.    Tls_KDFCom
14510 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20  mands(interp);. 
14520 20 20 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61     Tls_RandComma
14530 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20  nds(interp);..  
14540 20 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a    if (interp) {.
14550 09 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70  .Tcl_Eval(interp
14560 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  , tlsTclInitScri
14570 70 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  pt);.    }..    
14580 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72  return Tcl_PkgPr
14590 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41  ovide(interp, PA
145a0 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b  CKAGE_NAME, PACK
145b0 41 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a  AGE_VERSION);.}.
145c0 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
14600 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74  . *.Tls_SafeInit
14610 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d   --. *. *.------
14620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53  ----------*. *.S
14650 74 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72  tandard procedur
14660 65 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c  e required by 'l
14670 6f 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c  oad'.. *.Initial
14680 69 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73  izes this extens
14690 69 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69  ion for a safe i
146a0 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d  nterpreter.. *.-
146b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
146e0 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65  . *. *.Side effe
146f0 63 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27  cts:. *..As of '
14700 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09  Tls_Init'. *. *.
14710 52 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74  Result:. *..A st
14720 61 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72  andard Tcl error
14730 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   code.. *. *----
14740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52  --*. */.DLLEXPOR
14780 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e  T int Tls_SafeIn
14790 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
147a0 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72  nterp) {.    dpr
147b0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
147c0 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 49      return Tls_I
147d0 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 0a  nit(interp);.}..
147e0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
147f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
14820 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
14830 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
14840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14860 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
14870 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
14880 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
14890 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
148a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
148d0 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
148e0 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
148f0 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
14900 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
14910 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14950 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
14960 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
14970 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
14980 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
14990 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
149a0 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
149b0 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
149c0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
149d0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
149e0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
149f0 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
14a00 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
14a10 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
14a20 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
14a30 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
14a40 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
14a50 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
14a60 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
14a70 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
14a80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
14a90 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41  ..}...dprintf("A
14aa0 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61  sked to uninitia
14ab0 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66  lize");..#if def
14ac0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
14ad0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
14ae0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
14af0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
14b00 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f  it_mx);...if (lo
14b10 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65  cks) {..    free
14b20 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f  (locks);..    lo
14b30 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  cks = NULL;..   
14b40 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b   locksCount = 0;
14b50 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74  ..}.#endif..init
14b60 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69  ialized = 0;..#i
14b70 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
14b80 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
14b90 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
14ba0 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c  S)..Tcl_MutexUnl
14bb0 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23  ock(&init_mx);.#
14bc0 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 20 54  endif...return T
14bd0 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  CL_OK;.    }..  
14be0 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
14bf0 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
14c00 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
14c10 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
14c20 0a 09 72 65 74 75 72 6e 20 73 74 61 74 75 73 3b  ..return status;
14c30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
14c40 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
14c50 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
14c60 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
14c70 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
14c80 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74  ADS).    Tcl_Mut
14c90 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
14ca0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69  ;.#endif.    ini
14cb0 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23  tialized = 1;..#
14cc0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
14cd0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14ce0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14cf0 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b  DS).    num_lock
14d00 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73  s = 1;.    locks
14d10 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75  Count = (int) nu
14d20 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63  m_locks;.    loc
14d30 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ks = malloc(size
14d40 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d  of(*locks) * num
14d50 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d  _locks);.    mem
14d60 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69  set(locks, 0, si
14d70 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
14d80 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69  um_locks);.#endi
14d90 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  f..    /* Initia
14da0 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79  lize BOTH libcry
14db0 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20  pto and libssl. 
14dc0 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69  */.    OPENSSL_i
14dd0 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f  nit_ssl(OPENSSL_
14de0 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54  INIT_LOAD_SSL_ST
14df0 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  RINGS | OPENSSL_
14e00 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f  INIT_LOAD_CRYPTO
14e10 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e  _STRINGS..| OPEN
14e20 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
14e30 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53  _CIPHERS | OPENS
14e40 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
14e50 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a  DIGESTS, NULL);.
14e60 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  .    BIO_new_tcl
14e70 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20  (NULL, 0);..#if 
14e80 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  0.    /*.     * 
14e90 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65  XXX:TODO: Remove
14ea0 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72   this code and r
14eb0 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
14ec0 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f   check.     * fo
14ed0 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79  r enough entropy
14ee0 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20   and do not try 
14ef0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
14f00 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c  n.     * terribl
14f10 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a  e entropy.     *
14f20 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  /.    /*.     * 
14f30 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20  Seed the random 
14f40 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
14f50 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72   in the SSL libr
14f60 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e  ary,.     * usin
14f70 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63  g the do/while c
14f80 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65  onstruct because
14f90 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65   of the bug note
14fa0 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f   in the.     * O
14fb0 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74  penSSL FAQ at ht
14fc0 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c  tp://www.openssl
14fd0 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71  .org/support/faq
14fe0 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20  .html#USER1.    
14ff0 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72   *.     * The cr
15000 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65  ux of the proble
15010 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69  m is that Solari
15020 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  s 7 does not hav
15030 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f  e a.     * /dev/
15040 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75  random or /dev/u
15050 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f  random device so
15060 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65   it cannot gathe
15070 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20  r enough.     * 
15080 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65  entropy from the
15090 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65   RAND_seed() whe
150a0 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65  n TLS initialize
150b0 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20  s and refuses.  
150c0 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68     * to go furth
150d0 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73  er. Earlier vers
150e0 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ions of OpenSSL 
150f0 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72  carried on regar
15100 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20  dless..     */. 
15110 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e     srand((unsign
15120 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69  ed int) time((ti
15130 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a  me_t *) NULL));.
15140 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69      do {..for (i
15150 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b   = 0; i < 16; i+
15160 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65  +) {..    rnd_se
15170 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61  ed[i] = 1 + (cha
15180 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64  r) (255.0 * rand
15190 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30  ()/(RAND_MAX+1.0
151a0 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65  ));..}..RAND_see
151b0 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65  d(rnd_seed, size
151c0 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20  of(rnd_seed));. 
151d0 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44     } while (RAND
151e0 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b  _status() != 1);
151f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
15200 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
15210 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
15220 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
15230 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63    Tcl_MutexUnloc
15240 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
15250 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
15260 73 74 61 74 75 73 3b 0a 7d 0a                    status;.}.