Hex Artifact Content

Artifact e039ae19322da4c920d0681d17003ab59a8d0801535ff8212788deedded35a2e:


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 28 6f 6b 29 3b 09 2f 2a 20 42 79 20 64 65  rn(ok);./* By de
3000: 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76 65 72  fault, leave ver
3010: 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68 61 6e  ification unchan
3020: 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20  ged. */.}.../*. 
3030: 2a 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 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 45  ----. *. * Tls_E
3080: 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  rror --. *. *.Ca
3090: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  lls callback wit
30a0: 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f 72 73  h list of errors
30b0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
30c0: 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72  ects:. *.The err
30d0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75   field of the cu
30e0: 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76  rrently operativ
30f0: 65 20 53 74 61 74 65 20 69 73 20 73 65 74 0a 20  e State is set. 
3100: 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20  *.  to a string 
3110: 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20 53  describing the S
3120: 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66  SL negotiation f
3130: 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a  ailure reason. *
3140: 0a 20 2a 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 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
3190: 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74 65 20  Tls_Error(State 
31a0: 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20  *statePtr, char 
31b0: 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *msg) {.    Tcl_
31c0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
31d0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
31e0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
31f0: 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72  cmdPtr, *listPtr
3200: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  ;.    unsigned l
3210: 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61  ong err;.    sta
3220: 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67  tePtr->err = msg
3230: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
3240: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
3250: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
3260: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
3270: 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72 6e  j*)NULL)..return
3280: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
3290: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
32a0: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
32b0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
32c0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
32d0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
32e0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
32f0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
3300: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3310: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3320: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3330: 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20 2d 31  gObj("error", -1
3340: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3350: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3360: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3370: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
3380: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
3390: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
33a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
33b0: 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21 3d 20  .    if (msg != 
33c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  NULL) {..Tcl_Lis
33d0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
33e0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
33f0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3400: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20  bj(msg, -1));.. 
3410: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 28 6d     } else if ((m
3420: 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  sg = Tcl_GetStri
3430: 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65  ngFromObj(Tcl_Ge
3440: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
3450: 70 29 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29  p), (Tcl_Size *)
3460: 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55 4c 4c 29   NULL)) != NULL)
3470: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3480: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3490: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
34a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
34b0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
34c0: 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72 20  else {..listPtr 
34d0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
34e0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69 6c  (0, NULL);..whil
34f0: 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67 65  e ((err = ERR_ge
3500: 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30 29  t_error()) != 0)
3510: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
3520: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3530: 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
3540: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
3550: 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65 72  bj(ERR_reason_er
3560: 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c  ror_string(err),
3570: 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c   -1));..}..Tcl_L
3580: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
3590: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
35a0: 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20 20  tr, listPtr);.  
35b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c    }..    /* Eval
35c0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
35d0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
35e0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
35f0: 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62  );.    EvalCallb
3600: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
3610: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20  ePtr, cmdPtr);. 
3620: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3630: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c  unt(cmdPtr);.}..
3640: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
3690: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 2d  KeyLogCallback -
36a0: 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72 65  -. *. *.Write re
36b0: 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61 20  ceived key data 
36c0: 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a 0a  to log file.. *.
36d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
36e0: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3730: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c 6f  -. */.void KeyLo
3740: 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  gCallback(const 
3750: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
3760: 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20 20  char *line) {.  
3770: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67 65    char *str = ge
3780: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
3790: 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a 66  LE);.    FILE *f
37a0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
37b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
37c0: 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20 3d  if (str) {..fd =
37d0: 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22 29   fopen(str, "a")
37e0: 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20 22  ;..fprintf(fd, "
37f0: 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66 63  %s\n",line);..fc
3800: 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
3810: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3860: 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c 6c   * Password Call
3870: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61  back --. *. *.Ca
3880: 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73 73  lled when a pass
3890: 77 6f 72 64 20 66 6f 72 20 61 20 70 72 69 76 61  word for a priva
38a0: 74 65 20 6b 65 79 20 6c 6f 61 64 69 6e 67 2f 73  te key loading/s
38b0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 0a 20 2a 09  toring a PEM. *.
38c0: 63 65 72 74 69 66 69 63 61 74 65 20 77 69 74 68  certificate with
38d0: 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20 45 76 61   encryption. Eva
38e0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 73 63 72 69  ls callback scri
38f0: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20  pt and returns. 
3900: 2a 09 74 68 65 20 72 65 73 75 6c 74 20 61 73 20  *.the result as 
3910: 74 68 65 20 70 61 73 73 77 6f 72 64 20 73 74 72  the password str
3920: 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20  ing in buf.. *. 
3930: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
3940: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
3950: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
3960: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
3970: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
3980: 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64  rns:. *.Password
3990: 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
39a0: 72 20 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f  r -1 for an erro
39b0: 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  r.. *. *--------
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3a00: 73 74 61 74 69 63 20 69 6e 74 0a 50 61 73 73 77  static int.Passw
3a10: 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63 68 61 72  ordCallback(char
3a20: 20 2a 62 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c   *buf, int size,
3a30: 20 69 6e 74 20 72 77 66 6c 61 67 2c 20 76 6f 69   int rwflag, voi
3a40: 64 20 2a 75 64 61 74 61 29 20 7b 0a 20 20 20 20  d *udata) {.    
3a50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 09  State *statePtr.
3a60: 3d 20 28 53 74 61 74 65 20 2a 29 20 75 64 61 74  = (State *) udat
3a70: 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  a;.    Tcl_Inter
3a80: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
3a90: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
3aa0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
3ab0: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 3b  r;.    int code;
3ac0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
3ad0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
3ae0: 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c   If no callback,
3af0: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c   use default cal
3b00: 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20  lback */.    if 
3b10: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
3b20: 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ord == NULL) {..
3b30: 69 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69  if (Tcl_EvalEx(i
3b40: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73  nterp, "tls::pas
3b50: 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f  sword", -1, TCL_
3b60: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20  EVAL_GLOBAL) == 
3b70: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63  TCL_OK) {..    c
3b80: 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72  har *ret = (char
3b90: 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e   *) Tcl_GetStrin
3ba0: 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  gResult(interp);
3bb0: 0a 09 20 20 20 20 73 74 72 6e 63 70 79 28 62 75  ..    strncpy(bu
3bc0: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
3bd0: 20 73 69 7a 65 29 3b 0a 09 20 20 20 20 72 65 74   size);..    ret
3be0: 75 72 6e 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  urn (int)strlen(
3bf0: 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  ret);..} else {.
3c00: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
3c10: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
3c20: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20   Create command 
3c30: 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c  to eval with fn,
3c40: 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73 69 7a   rwflag, and siz
3c50: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
3c60: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
3c70: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
3c80: 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20 20 20  ->password);.   
3c90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3ca0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3cb0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3cc0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61 73 73  wStringObj("pass
3cd0: 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20 20 20  word", -1));.   
3ce0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3cf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3d00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3d10: 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67 29 29  wIntObj(rwflag))
3d20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3d30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3d40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3d50: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 69 7a  cl_NewIntObj(siz
3d60: 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72  e));..    Tcl_Pr
3d70: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
3d80: 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20  ta) interp);.   
3d90: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43   Tcl_Preserve((C
3da0: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
3db0: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  Ptr);..    /* Ev
3dc0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
3dd0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
3de0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
3df0: 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20  tr);.    code = 
3e00: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
3e10: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43  terp, cmdPtr, TC
3e20: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
3e30: 20 20 20 20 69 66 20 28 63 6f 64 65 20 21 3d 20      if (code != 
3e40: 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20 28 54  TCL_OK) {.#if (T
3e50: 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
3e60: 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d   == 8) && (TCL_M
3e70: 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36  INOR_VERSION < 6
3e80: 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  )..Tcl_Backgroun
3e90: 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a  dError(interp);.
3ea0: 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67  #else..Tcl_Backg
3eb0: 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69  roundException(i
3ec0: 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65  nterp, code);.#e
3ed0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 54  ndif.    }.    T
3ee0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
3ef0: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 54 63  cmdPtr);..    Tc
3f00: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3f10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3f20: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73 75 63  ;..    /* If suc
3f30: 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20 62 61  cessful, pass ba
3f40: 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74 72 69  ck password stri
3f50: 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74 65 20  ng and truncate 
3f60: 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20  if too long */. 
3f70: 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 54     if (code == T
3f80: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 69  CL_OK) {..Tcl_Si
3f90: 7a 65 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a 72  ze len;..char *r
3fa0: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3fb0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
3fc0: 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  bj(Tcl_GetObjRes
3fd0: 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c 65  ult(interp), &le
3fe0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 28  n);..if (len > (
3ff0: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
4000: 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20 3d 20 28  ) {..    len = (
4010: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
4020: 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79 28 62 75  ;..}..strncpy(bu
4030: 66 2c 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29  f, ret, (size_t)
4040: 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d   len);..buf[len]
4050: 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 65   = '\0';..Tcl_Re
4060: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
4070: 61 29 20 69 6e 74 65 72 70 29 3b 0a 09 72 65 74  a) interp);..ret
4080: 75 72 6e 28 28 69 6e 74 29 20 6c 65 6e 29 3b 0a  urn((int) len);.
4090: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 52 65      }.    Tcl_Re
40a0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
40b0: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
40c0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f  return -1;.}.../
40d0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65  -------. *. * Se
4120: 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66  ssion Callback f
4130: 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a  or Clients --. *
4140: 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20  . *.Called when 
4150: 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73  a new session is
4160: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61   added to the ca
4170: 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a  che. In TLS 1.3.
4180: 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72   *.this may be r
4190: 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65  eceived multiple
41a0: 20 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65   times after the
41b0: 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a   handshake. For.
41c0: 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69   *.earlier versi
41d0: 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62  ons, this will b
41e0: 65 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e  e received durin
41f0: 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  g the handshake.
4200: 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20  . *.This is the 
4210: 70 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f  preferred way to
4220: 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61   obtain a resuma
4230: 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a  ble session.. *.
4240: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
4250: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
4260: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
4270: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
4280: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
4290: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20  urn codes:. *.0 
42a0: 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65  = error where se
42b0: 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d  ssion will be im
42c0: 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65  mediately remove
42d0: 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72  d from the inter
42e0: 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20  nal cache.. *.1 
42f0: 3d 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20  = success where 
4300: 61 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73  app retains sess
4310: 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63  ion in session c
4320: 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63  ache, and must c
4330: 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  all SSL_SESSION_
4340: 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65  free() when done
4350: 2e 0a 20 2a 0a 20 2a 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 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
43a0: 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f  tatic int.Sessio
43b0: 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73  nCallback(SSL *s
43c0: 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20  sl, SSL_SESSION 
43d0: 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20  *session) {.    
43e0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
43f0: 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65  = (State*)SSL_ge
4400: 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20  t_app_data((SSL 
4410: 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  *)ssl);.    Tcl_
4420: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
4430: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
4440: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
4450: 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  cmdPtr;.    cons
4460: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4470: 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e  *ticket;.    con
4480: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4490: 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20   *session_id;.  
44a0: 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20    size_t len2;. 
44b0: 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
44c0: 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e  ulen;..    dprin
44d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
44e0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
44f0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
4500: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
4510: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4520: 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20  T_ERR_OK;.    } 
4530: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
4540: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
4550: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
4560: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
4570: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
4580: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
4590: 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 69 6f  fn, chan, sessio
45a0: 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 74 69  n id, session ti
45b0: 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 74 69  cket, and lifeti
45c0: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  me args */.    c
45d0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
45e0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
45f0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
4600: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4610: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4620: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4630: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73  ewStringObj("ses
4640: 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  sion", -1));.   
4650: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4660: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4670: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
4680: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
4690: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
46a0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
46b0: 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  f), -1));..    /
46c0: 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  * Session id */.
46d0: 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d      session_id =
46e0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
46f0: 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c  _id(session, &ul
4700: 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  en);.    Tcl_Lis
4710: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4720: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4730: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
4740: 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64  ayObj(session_id
4750: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
4760: 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73  n));..    /* Ses
4770: 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20  sion ticket */. 
4780: 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67     SSL_SESSION_g
4790: 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
47a0: 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
47b0: 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  n2);.    Tcl_Lis
47c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
47d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
47e0: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
47f0: 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 54  ayObj(ticket, (T
4800: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b  cl_Size) len2));
4810: 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d  ..    /* Lifetim
4820: 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  e - number of se
4830: 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c  conds */.    Tcl
4840: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4850: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4860: 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f  dPtr,..Tcl_NewLo
4870: 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c  ngObj((long) SSL
4880: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
4890: 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
48a0: 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20  t(session)));.. 
48b0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
48c0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
48d0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
48e0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
48f0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
4900: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
4910: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
4920: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
4930: 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  dPtr);.    retur
4940: 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  n 0;.}.../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4990: 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c  -. *. * ALPN Cal
49a0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
49b0: 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61  s and NPN Callba
49c0: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d  ck for Clients -
49d0: 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20  -. *. *.Perform 
49e0: 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31  protocol (http/1
49f0: 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e  .1, h2, h3, etc.
4a00: 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20  ) selection for 
4a10: 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20  the. *.incoming 
4a20: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c  connection. Call
4a30: 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61  ed after Hello a
4a40: 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61  nd server callba
4a50: 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f  cks.. *.Where 'o
4a60: 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64 20  ut' is selected 
4a70: 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e  protocol and 'in
4a80: 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61 64  ' is the peer ad
4a90: 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20  vertised list.. 
4aa0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4ab0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4ac0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4ad0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4ae0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
4af0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
4b00: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4b10: 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c  K: ALPN protocol
4b20: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
4b30: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
4b40: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
4b50: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
4b60: 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f  AL: There was no
4b70: 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e   overlap between
4b80: 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a   the client's. *
4b90: 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69  .    supplied li
4ba0: 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76 65  st and the serve
4bb0: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e  r configuration.
4bc0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4bd0: 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e  will be aborted.
4be0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4bf0: 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70  RR_NOACK: ALPN p
4c00: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65  rotocol not sele
4c10: 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61  cted, e.g., beca
4c20: 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20  use no ALPN. *. 
4c30: 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65     protocols are
4c40: 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20   configured for 
4c50: 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
4c60: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
4c70: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a  continues.. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cc0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
4cd0: 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28  nt.ALPNCallback(
4ce0: 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20  SSL *ssl, const 
4cf0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a  unsigned char **
4d00: 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  out, unsigned ch
4d10: 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e  ar *outlen,..con
4d20: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4d30: 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69   *in, unsigned i
4d40: 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a  nt inlen, void *
4d50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
4d60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
4d70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
4d80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4d90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4da0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4db0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
4dc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20  t code, res;..  
4dd0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
4de0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
4df0: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
4e00: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
4e10: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
4e20: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4e30: 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70  .    /* Select p
4e40: 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69  rotocol */.    i
4e50: 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65  f (SSL_select_ne
4e60: 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e  xt_proto((unsign
4e70: 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c  ed char **) out,
4e80: 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74   outlen, statePt
4e90: 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65  r->protos, state
4ea0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c  Ptr->protos_len,
4eb0: 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20  ..in, inlen) == 
4ec0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f  OPENSSL_NPN_NEGO
4ed0: 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61  TIATED) {../* Ma
4ee0: 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65  tch found */..re
4ef0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4f00: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4f10: 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f  e {../* OPENSSL_
4f20: 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d  NPN_NO_OVERLAP =
4f30: 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20   No overlap, so 
4f40: 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66  use first item f
4f50: 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f  rom client proto
4f60: 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73  col list */..res
4f70: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4f80: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4f90: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4fa0: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
4fb0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
4fc0: 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a  urn res;.    }..
4fd0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4fe0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
4ff0: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70  th fn, chan, dep
5000: 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69  th, cert info li
5010: 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20  st, status, and 
5020: 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20  error args */.  
5030: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5040: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5050: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5060: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5070: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5080: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5090: 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e  wStringObj("alpn
50a0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
50b0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
50c0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
50d0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
50e0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
50f0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
5100: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
5110: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
5120: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5130: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5140: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5150: 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 20  Obj((const char 
5160: 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20  *) *out, -1));. 
5170: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5180: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5190: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
51a0: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65  NewBooleanObj(re
51b0: 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  s == SSL_TLSEXT_
51c0: 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f  ERR_OK));..    /
51d0: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
51e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
51f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5200: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
5210: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
5220: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
5230: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
5240: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
5250: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5260: 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ACK;.    } else 
5270: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
5280: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5290: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
52a0: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
52b0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
52c0: 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d  ERT_FATAL;.    }
52d0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
52e0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
52f0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
5300: 0a 0c 0a 2f 2a 0a 20 2a 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 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5350: 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f 74  * Advertise Prot
5360: 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66  ocols Callback f
5370: 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c  or Next Protocol
5380: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50   Negotiation (NP
5390: 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c  N) in ServerHell
53a0: 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65  o --. *. *.calle
53b0: 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72  d when a TLS ser
53c0: 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74  ver needs a list
53d0: 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70 72   of supported pr
53e0: 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74  otocols for Next
53f0: 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67  . *.Protocol Neg
5400: 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20  otiation.. *. * 
5410: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
5420: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5430: 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72  cts:. *. * Retur
5440: 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f  n codes:. *.SSL_
5450: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e  TLSEXT_ERR_OK: N
5460: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  PN protocol sele
5470: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
5480: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5490: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
54a0: 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f  R_NOACK: NPN pro
54b0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
54c0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
54d0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
54e0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65  ------. */.#ifde
5530: 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63  f USE_NPN.static
5540: 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b   int.NPNCallback
5550: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
5560: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
5570: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
5580: 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e  gned int *outlen
5590: 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20  , void *arg) {. 
55a0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
55b0: 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67  tr = (State*)arg
55c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
55d0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
55e0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c  f (ssl == NULL |
55f0: 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b  | arg == NULL) {
5600: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5610: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20  EXT_ERR_NOACK;. 
5620: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
5630: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
5640: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
5650: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
5660: 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73  ULL) {..*out = s
5670: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b  tatePtr->protos;
5680: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74  ..*outlen = stat
5690: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
56a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
56b0: 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f  *out = NULL;..*o
56c0: 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75  utlen = 0;..retu
56d0: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
56e0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20  R_NOACK;.    }. 
56f0: 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c     return SSL_TL
5700: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23  SEXT_ERR_OK;.}.#
5710: 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  endif.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5760: 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62  . *. * SNI Callb
5770: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
5780: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
5790: 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49   server-side SNI
57a0: 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74   hostname select
57b0: 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69 76  ion after receiv
57c0: 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  ing SNI extensio
57d0: 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48  n. *.in Client H
57e0: 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74  ello. Called aft
57f0: 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63  er hello callbac
5800: 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50  k but before ALP
5810: 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  N callback.. *. 
5820: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
5830: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
5840: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
5850: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
5860: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
5870: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5880: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5890: 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  SNI hostname is 
58a0: 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f  accepted. The co
58b0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
58c0: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
58d0: 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41  T_ERR_ALERT_FATA
58e0: 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  L: SNI hostname 
58f0: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e  is not accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a   The connection.
5910: 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74 65   *.    is aborte
5920: 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61  d. Default for a
5930: 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55  lert is SSL_AD_U
5940: 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45  NRECOGNIZED_NAME
5950: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5960: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5970: 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20  G: SNI hostname 
5980: 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c  is not accepted,
5990: 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20   warning alert. 
59a0: 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20  *.    sent (not 
59b0: 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53  supported in TLS
59c0: 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65  v1.3). The conne
59d0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
59e0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
59f0: 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f  RR_NOACK: SNI ho
5a00: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5a10: 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61  cepted and not a
5a20: 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09  cknowledged,. *.
5a30: 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20      e.g. if SNI 
5a40: 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e  has not been con
5a50: 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e  figured. The con
5a60: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
5a70: 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  s.. *. *--------
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 2d  ----------------
5aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5ac0: 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61  static int.SNICa
5ad0: 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c  llback(const SSL
5ae0: 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72   *ssl, int *aler
5af0: 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  t, void *arg) {.
5b00: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
5b10: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
5b20: 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  g;.    Tcl_Inter
5b30: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
5b40: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
5b50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
5b60: 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c  r;.    int code,
5b70: 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20   res;.    const 
5b80: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
5b90: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70   = NULL;..    dp
5ba0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
5bb0: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
5bc0: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5bd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5be0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5bf0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5c00: 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66   /* Only works f
5c10: 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65  or TLS 1.2 and e
5c20: 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65  arlier */.    se
5c30: 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67  rvername = SSL_g
5c40: 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73  et_servername(ss
5c50: 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  l, TLSEXT_NAMETY
5c60: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20  PE_host_name);. 
5c70: 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e 61     if (!serverna
5c80: 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65  me || servername
5c90: 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09  [0] == '\0') {..
5ca0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5cb0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5cc0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
5cd0: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
5ce0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
5cf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5d00: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5d10: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
5d20: 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20  command to eval 
5d30: 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61  with fn, chan, a
5d40: 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61  nd server name a
5d50: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
5d60: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
5d70: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
5d80: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
5d90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
5da0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
5db0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
5dc0: 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b  Obj("sni", -1));
5dd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5de0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5df0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
5e00: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
5e10: 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  Obj(Tcl_GetChann
5e20: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
5e30: 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20  >self), -1));.  
5e40: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5e50: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5e60: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
5e70: 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76  ewStringObj(serv
5e80: 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a  ername , -1));..
5e90: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
5ea0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
5eb0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
5ec0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
5ed0: 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76    if ((code = Ev
5ee0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
5ef0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
5f00: 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65  Ptr)) > 1) {..re
5f10: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
5f20: 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47  RR_ALERT_WARNING
5f30: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
5f40: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5f50: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
5f60: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
5f70: 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20  3 */.    } else 
5f80: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
5f90: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45  ..res = SSL_TLSE
5fa0: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d  XT_ERR_OK;.    }
5fb0: 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
5fc0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5fd0: 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65  ERT_FATAL;..*ale
5fe0: 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45  rt = SSL_AD_UNRE
5ff0: 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f  COGNIZED_NAME; /
6000: 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  * Not supported 
6010: 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  by TLS 1.3 */.  
6020: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
6030: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6040: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
6050: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
60a0: 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  *. * ClientHello
60b0: 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62   Handshake Callb
60c0: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
60d0: 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79  --. *. *.Used by
60e0: 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69   server to exami
60f0: 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ne the server na
6100: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
6110: 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  NI) extension. *
6120: 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68 65  .provided by the
6130: 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72   client in order
6140: 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70   to select an ap
6150: 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69 66  propriate certif
6160: 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73  icate to. *.pres
6170: 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74  ent, and make ot
6180: 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  her configuratio
6190: 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65  n adjustments re
61a0: 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73  levant to that s
61b0: 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e  erver. *.name an
61c0: 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74  d its configurat
61d0: 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64  ion. This includ
61e0: 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20  es swapping out 
61f0: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20  the associated. 
6200: 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65  *.SSL_CTX pointe
6210: 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  r, modifying the
6220: 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f   server's list o
6230: 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20  f permitted TLS 
6240: 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61  versions,. *.cha
6250: 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65 72  nging the server
6260: 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20 69  's cipher list i
6270: 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68  n response to th
6280: 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65  e client's ciphe
6290: 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09  r list, etc.. *.
62a0: 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e  Called before SN
62b0: 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62  I and ALPN callb
62c0: 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  acks.. *. * Resu
62d0: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
62e0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
62f0: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
6300: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
6310: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
6320: 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  es:. *.SSL_CLIEN
6330: 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73  T_HELLO_RETRY: s
6340: 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73  uspend the hands
6350: 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61  hake, and the ha
6360: 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e  ndshake function
6370: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d   will return imm
6380: 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f  ediately. *.SSL_
6390: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
63a0: 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72  OR: failure, ter
63b0: 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f  minate connectio
63c0: 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20  n. Set alert to 
63d0: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53  error code.. *.S
63e0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
63f0: 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73 73  SUCCESS: success
6400: 0a 20 2a 0a 20 2a 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 2d 2d 2d  ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
6450: 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61  atic int.HelloCa
6460: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
6470: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
6480: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
6490: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
64a0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
64b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
64c0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
64d0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
64e0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
64f0: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
6500: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6510: 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20  servername;.    
6520: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
6530: 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65  har *p;.    size
6540: 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e  _t len, remainin
6550: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
6560: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6570: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
6580: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
6590: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
65a0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
65b0: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
65c0: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
65d0: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c  (const SSL *)NUL
65e0: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69  L || arg == (voi
65f0: 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  d *)NULL) {..ret
6600: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6610: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
6620: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61  }..    /* Get na
6630: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  mes */.    if (!
6640: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  SSL_client_hello
6650: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54  _get0_ext(ssl, T
6660: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65  LSEXT_TYPE_serve
6670: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d  r_name, &p, &rem
6680: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69  aining) || remai
6690: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61  ning <= 2) {..*a
66a0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
66b0: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
66c0: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
66d0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
66e0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
66f0: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
6700: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
6710: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73  the supplied lis
6720: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20  t of names. */. 
6730: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
6740: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
6750: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
6760: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65  f (len + 2 != re
6770: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6780: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33  rt = SSL_R_SSLV3
6790: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50  _ALERT_ILLEGAL_P
67a0: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72  ARAMETER;..retur
67b0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
67c0: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
67d0: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
67e0: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  len;..    /* The
67f0: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63   list in practic
6800: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e  e only has a sin
6810: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20  gle element, so 
6820: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  we only consider
6830: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20   the first one. 
6840: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
6850: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b  ning == 0 || *p+
6860: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45  + != TLSEXT_NAME
6870: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20  TYPE_host_name) 
6880: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6890: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
68a0: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
68b0: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
68c0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
68d0: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
68e0: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  g--;..    /* Now
68f0: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20   we can finally 
6900: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74  pull out the byt
6910: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
6920: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65   actual hostname
6930: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
6940: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
6950: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6960: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
6970: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
6980: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6990: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
69a0: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
69b0: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
69c0: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
69d0: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72   if (len + 2 > r
69e0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
69f0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6a00: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6a10: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6a20: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6a30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6a40: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
6a50: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  n;.    servernam
6a60: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
6a70: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  *)p;..    /* Cre
6a80: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
6a90: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
6aa0: 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61  n, and server na
6ab0: 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  me args */.    c
6ac0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
6ad0: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
6ae0: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
6af0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6b00: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6b10: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
6b20: 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c  ringObj("hello",
6b30: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6b40: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
6b50: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
6b60: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
6b70: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
6b80: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
6b90: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
6ba0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
6bb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
6bc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
6bd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
6be0: 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54  j(servername, (T
6bf0: 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a  cl_Size) len));.
6c00: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
6c10: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
6c20: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
6c30: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
6c40: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
6c50: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
6c60: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
6c70: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
6c80: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6c90: 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61  HELLO_RETRY;..*a
6ca0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6cb0: 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41  V1_ALERT_USER_CA
6cc0: 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65  NCELLED;.    } e
6cd0: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
6ce0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6cf0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6d00: 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65  CESS;.    } else
6d10: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
6d20: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
6d30: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6d40: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6d50: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20  TERNAL_ERROR;.  
6d60: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
6d70: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
6d80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  ;.    return res
6d90: 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}.../*********
6da0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
6db0: 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20  Commands        
6dc0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
6dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
6de0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e20: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73  ----. *. * Hands
6e30: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  hakeObjCmd --. *
6e40: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64  . *.This command
6e50: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
6e60: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68  fy whether the h
6e70: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70  andshake is comp
6e80: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a  lete. *.or not..
6e90: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
6ea0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
6eb0: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73   result. 1 means
6ec0: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c   handshake compl
6ed0: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e  ete, 0 means pen
6ee0: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ding.. *. * Side
6ef0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
6f00: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74   force SSL negot
6f10: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70  iation to take p
6f20: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  lace.. *. *-----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
6f70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61  */.static int Ha
6f80: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c  ndshakeObjCmd(Cl
6f90: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
6fa0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
6fb0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
6fc0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
6fd0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
6fe0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
6ff0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
7000: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
7010: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
7020: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
7030: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65  ;        /* clie
7040: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
7050: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63   socket */.    c
7060: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74  onst char *errSt
7070: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  r = NULL;.    in
7080: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69  t ret = 1;.    i
7090: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20  nt err = 0;.    
70a0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
70b0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
70c0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
70d0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
70e0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
70f0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
7100: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
7110: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
7120: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  R);.    }..    E
7130: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
7140: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  ;..    chan = Tc
7150: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
7160: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
7170: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
7180: 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20  ], (Tcl_Size *) 
7190: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
71a0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
71b0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
71c0: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
71d0: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
71e0: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
71f0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
7200: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
7210: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
7220: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
7230: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
7240: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
7250: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
7260: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
7270: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
7280: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
7290: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
72a0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
72b0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
72c0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
72d0: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
72e0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
72f0: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48  nterp, "TLS", "H
7300: 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e  ANDSHAKE", "CHAN
7310: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
7320: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7330: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
7340: 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  OR);.    }.    s
7350: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
7360: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
7370: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
7380: 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  an);..    dprint
7390: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
73a0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
73b0: 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57  .    ret = Tls_W
73c0: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
73d0: 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29  atePtr, &err, 1)
73e0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ;.    dprintf("T
73f0: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
7400: 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c  t returned: %i",
7410: 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28   ret);..    if (
7420: 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61  ret < 0 && ((sta
7430: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
7440: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26  LS_TCL_ASYNC) &&
7450: 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29   (err == EAGAIN)
7460: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  )) {..dprintf("A
7470: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72  sync set and err
7480: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65   = EAGAIN");..re
7490: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  t = 0;.    } els
74a0: 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b  e if (ret < 0) {
74b0: 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09  ..long result;..
74c0: 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74  errStr = statePt
74d0: 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73  r->err;..Tcl_Res
74e0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
74f0: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28  ;..Tcl_SetErrno(
7500: 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72  err);...if (!err
7510: 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20  Str || (*errStr 
7520: 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72  == 0)) {..    er
7530: 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78  rStr = Tcl_Posix
7540: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09  Error(interp);..
7550: 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  }...Tcl_AppendRe
7560: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61  sult(interp, "ha
7570: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
7580: 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72  ", errStr, (char
7590: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28   *) NULL);..if (
75a0: 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65  (result = SSL_ge
75b0: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
75c0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20  statePtr->ssl)) 
75d0: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
75e0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
75f0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20  esult(interp, " 
7600: 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39  due to \"", X509
7610: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
7620: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74  or_string(result
7630: 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a  ), "\"", (char *
7640: 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  ) NULL);..}..Tcl
7650: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
7660: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
7670: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
7680: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
7690: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
76a0: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
76b0: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
76c0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
76d0: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54  rStr);..return(T
76e0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
76f0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72   else {..if (err
7700: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   != 0) {..    dp
7710: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72  rintf("Got an er
7720: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c  ror with a compl
7730: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20  eted handshake: 
7740: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b  err = %i", err);
7750: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20  ..}..ret = 1;.  
7760: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
7770: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
7780: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25  OK with data \"%
7790: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20  i\"", ret);.    
77a0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
77b0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
77c0: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20  IntObj(ret));.  
77d0: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
77e0: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  ;.}..static cons
77f0: 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f  t char *command_
7800: 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20  opts [] = {.    
7810: 22 2d 61 6c 70 6e 22 2c 20 22 2d 63 61 64 69 72  "-alpn", "-cadir
7820: 22 2c 20 22 2d 63 61 66 69 6c 65 22 2c 20 22 2d  ", "-cafile", "-
7830: 63 65 72 74 22 2c 20 22 2d 63 65 72 74 66 69 6c  cert", "-certfil
7840: 65 22 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 22  e", "-cipher", "
7850: 2d 63 69 70 68 65 72 73 22 2c 20 22 2d 63 69 70  -ciphers", "-cip
7860: 68 65 72 73 75 69 74 65 73 22 2c 0a 20 20 20 20  hersuites",.    
7870: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 68  "-command", "-dh
7880: 70 61 72 61 6d 73 22 2c 20 22 2d 6b 65 79 22 2c  params", "-key",
7890: 20 22 2d 6b 65 79 66 69 6c 65 22 2c 20 22 2d 6d   "-keyfile", "-m
78a0: 6f 64 65 6c 22 2c 20 22 2d 70 61 73 73 77 6f 72  odel", "-passwor
78b0: 64 22 2c 20 22 2d 70 6f 73 74 5f 68 61 6e 64 73  d", "-post_hands
78c0: 68 61 6b 65 22 2c 0a 20 20 20 20 22 2d 72 65 71  hake",.    "-req
78d0: 75 65 73 74 22 2c 20 22 2d 72 65 71 75 69 72 65  uest", "-require
78e0: 22 2c 20 22 2d 73 65 63 75 72 69 74 79 5f 6c 65  ", "-security_le
78f0: 76 65 6c 22 2c 20 22 2d 73 65 72 76 65 72 22 2c  vel", "-server",
7900: 20 22 2d 73 65 72 76 65 72 6e 61 6d 65 22 2c 20   "-servername", 
7910: 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 22  "-session_id", "
7920: 2d 73 73 6c 32 22 2c 0a 20 20 20 20 22 2d 73 73  -ssl2",.    "-ss
7930: 6c 33 22 2c 20 22 2d 74 6c 73 31 22 2c 20 22 2d  l3", "-tls1", "-
7940: 74 6c 73 31 2e 31 22 2c 20 22 2d 74 6c 73 31 2e  tls1.1", "-tls1.
7950: 32 22 2c 20 22 2d 74 6c 73 31 2e 33 22 2c 20 22  2", "-tls1.3", "
7960: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
7970: 22 2c 20 22 2d 76 63 6d 64 22 2c 20 4e 55 4c 4c  ", "-vcmd", NULL
7980: 7d 3b 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e  };..enum _comman
7990: 64 5f 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70  d_opts {.    _op
79a0: 74 5f 61 6c 70 6e 2c 20 5f 6f 70 74 5f 63 61 64  t_alpn, _opt_cad
79b0: 69 72 2c 20 5f 6f 70 74 5f 63 61 66 69 6c 65 2c  ir, _opt_cafile,
79c0: 20 5f 6f 70 74 5f 63 65 72 74 2c 20 5f 6f 70 74   _opt_cert, _opt
79d0: 5f 63 65 72 74 66 69 6c 65 2c 20 5f 6f 70 74 5f  _certfile, _opt_
79e0: 63 69 70 68 65 72 2c 20 5f 6f 70 74 5f 63 69 70  cipher, _opt_cip
79f0: 68 65 72 73 2c 0a 20 20 20 20 5f 6f 70 74 5f 63  hers,.    _opt_c
7a00: 69 70 68 65 72 73 75 69 74 65 2c 20 5f 6f 70 74  iphersuite, _opt
7a10: 5f 63 6d 64 2c 20 5f 6f 70 74 5f 64 68 70 61 72  _cmd, _opt_dhpar
7a20: 61 6d 73 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f  ams, _opt_key, _
7a30: 6f 70 74 5f 6b 65 79 66 69 6c 65 2c 20 5f 6f 70  opt_keyfile, _op
7a40: 74 5f 6d 6f 64 65 6c 2c 20 5f 6f 70 74 5f 70 61  t_model, _opt_pa
7a50: 73 73 77 6f 72 64 2c 0a 20 20 20 20 5f 6f 70 74  ssword,.    _opt
7a60: 5f 68 61 6e 64 73 68 61 6b 65 2c 20 5f 6f 70 74  _handshake, _opt
7a70: 5f 72 65 71 75 65 73 74 2c 20 5f 6f 70 74 5f 72  _request, _opt_r
7a80: 65 71 75 69 72 65 2c 20 5f 6f 70 74 5f 73 65 63  equire, _opt_sec
7a90: 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 5f 6f 70  urity_level, _op
7aa0: 74 5f 73 65 72 76 65 72 2c 20 5f 6f 70 74 5f 73  t_server, _opt_s
7ab0: 65 72 76 65 72 6e 61 6d 65 2c 0a 20 20 20 20 5f  ervername,.    _
7ac0: 6f 70 74 5f 73 65 73 73 69 6f 6e 5f 69 64 2c 20  opt_session_id, 
7ad0: 5f 6f 70 74 5f 73 73 6c 32 2c 20 5f 6f 70 74 5f  _opt_ssl2, _opt_
7ae0: 73 73 6c 33 2c 20 5f 6f 70 74 5f 74 6c 73 31 2c  ssl3, _opt_tls1,
7af0: 20 5f 6f 70 74 5f 74 6c 73 31 31 2c 20 5f 6f 70   _opt_tls11, _op
7b00: 74 5f 74 6c 73 31 32 2c 20 5f 6f 70 74 5f 74 6c  t_tls12, _opt_tl
7b10: 73 31 33 2c 0a 20 20 20 20 5f 6f 70 74 5f 76 61  s13,.    _opt_va
7b20: 6c 69 64 61 74 65 2c 20 5f 6f 70 74 5f 76 63 6d  lidate, _opt_vcm
7b30: 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  d.};../*. *-----
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7b80: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
7b90: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
7ba0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
7bb0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
7bc0: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
7bd0: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
7be0: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
7bf0: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
7c00: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
7c10: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
7c20: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
7c30: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
7c40: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
7c50: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
7c60: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
7c70: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
7c80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
7cd0: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
7ce0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
7cf0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
7d00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
7d10: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7d20: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7d30: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
7d40: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
7d50: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
7d60: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
7d70: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
7d80: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
7d90: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
7da0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
7db0: 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c 3b  TX *ctx..= NULL;
7dc0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
7dd0: 64 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  dObj..= NULL;.  
7de0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77    Tcl_Obj *passw
7df0: 64 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  dObj..= NULL;.  
7e00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09    Tcl_Obj *vcmd.
7e10: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
7e20: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68  _DString upperCh
7e30: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
7e40: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  , upperChannelBl
7e50: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61  ocking, upperCha
7e60: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70  nnelEncoding, up
7e70: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
7e80: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a  r;.    int idx;.
7e90: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 66 6e 2c      Tcl_Size fn,
7ea0: 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c   len;.    int fl
7eb0: 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f  ags...= TLS_TCL_
7ec0: 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65  INIT;.    int se
7ed0: 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69  rver...= 0;./* i
7ee0: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63  s connection inc
7ef0: 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e  oming or outgoin
7f00: 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  g? */.    char *
7f10: 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b  keyfile..= NULL;
7f20: 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66  .    char *certf
7f30: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
7f40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
7f50: 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  key..= NULL;.   
7f60: 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65   Tcl_Size key_le
7f70: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69  n..= 0;.    unsi
7f80: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 09  gned char *cert.
7f90: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
7fa0: 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09  _Size cert_len..
7fb0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  = 0;.    char *c
7fc0: 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a  iphers..= NULL;.
7fd0: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
7fe0: 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a  suites..= NULL;.
7ff0: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
8000: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
8010: 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e 55  ar *CApath..= NU
8020: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48  LL;.    char *DH
8030: 70 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a  params..= NULL;.
8040: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09      char *model.
8050: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68  ..= NULL;.    ch
8060: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09  ar *servername..
8070: 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e  = NULL;./* hostn
8080: 61 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e  ame for Server N
8090: 61 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a  ame Indication *
80a0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  /.    const unsi
80b0: 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
80c0: 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20  on_id = NULL;.  
80d0: 20 20 54 63 6c 5f 53 69 7a 65 20 73 65 73 73 5f    Tcl_Size sess_
80e0: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 54 63  len..= 0;.    Tc
80f0: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 4f 62 6a 09 09  l_Obj *alpnObj..
8100: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
8110: 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d  ssl2 = 0, ssl3 =
8120: 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31   0;.    int tls1
8130: 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31   = 1, tls1_1 = 1
8140: 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c  , tls1_2 = 1, tl
8150: 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e  s1_3 = 1;.    in
8160: 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76  t proto = 0, lev
8170: 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74  el = -1;.    int
8180: 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71   verify = 0, req
8190: 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73  uire = 0, reques
81a0: 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64  t = 1, post_hand
81b0: 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28  shake = 0;.    (
81c0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
81d0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
81e0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64  Called");..#if d
81f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
8200: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
8210: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
8220: 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66  tls1 = 0;.#endif
8230: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
8240: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
8250: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8260: 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31  S1_1).    tls1_1
8270: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
8280: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
8290: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
82a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
82b0: 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30  ).    tls1_2 = 0
82c0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
82d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
82e0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
82f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
8300: 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65    tls1_3 = 0;.#e
8310: 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62  ndif..    if (ob
8320: 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
8330: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8340: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8350: 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22  annel ?options?"
8360: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
8370: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
8380: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
8390: 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20  ();..    chan = 
83a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
83b0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
83c0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
83d0: 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a  [1], (Tcl_Size *
83e0: 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a  ) NULL), NULL);.
83f0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
8400: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
8410: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
8420: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
8430: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
8440: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
8450: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
8460: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
8470: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
8480: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66  el(chan);..    f
8490: 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78  or (idx = 2; idx
84a0: 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20   < objc; idx++) 
84b0: 7b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  {..if (Tcl_GetIn
84c0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
84d0: 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f  p, objv[idx], co
84e0: 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74  mmand_opts, "opt
84f0: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d  ion", 0, &fn) !=
8500: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
8510: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8520: 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61  ;..}.../* Valida
8530: 74 65 20 61 72 67 20 68 61 73 20 76 61 6c 75 65  te arg has value
8540: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e   */..if (++idx >
8550: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54  = objc) {..    T
8560: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8570: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75  interp, "No valu
8580: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22  e for option \""
8590: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
85a0: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  n], "\"", (char 
85b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
85c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
85d0: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29  ..}...switch(fn)
85e0: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 61 6c   {..case _opt_al
85f0: 70 6e 3a 0a 09 20 20 20 20 61 6c 70 6e 4f 62 6a  pn:..    alpnObj
8600: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20   = objv[idx];.. 
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 64 69 72 3a 0a 09 20 20 20  _opt_cadir:..   
8630: 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28   GET_OPT_STRING(
8640: 6f 62 6a 76 5b 69 64 78 5d 2c 20 43 41 70 61 74  objv[idx], CApat
8650: 68 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  h, NULL);..    b
8660: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8670: 5f 63 61 66 69 6c 65 3a 0a 09 20 20 20 20 47 45  _cafile:..    GE
8680: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8690: 76 5b 69 64 78 5d 2c 20 43 41 66 69 6c 65 2c 20  v[idx], CAfile, 
86a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
86b0: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 65  k;..case _opt_ce
86c0: 72 74 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  rt:..    GET_OPT
86d0: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76  _BYTE_ARRAY(objv
86e0: 5b 69 64 78 5d 2c 20 63 65 72 74 2c 20 26 63 65  [idx], cert, &ce
86f0: 72 74 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72  rt_len);..    br
8700: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8710: 63 65 72 74 66 69 6c 65 3a 0a 09 20 20 20 20 47  certfile:..    G
8720: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8730: 6a 76 5b 69 64 78 5d 2c 20 63 65 72 74 66 69 6c  jv[idx], certfil
8740: 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  e, NULL);..    b
8750: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
8760: 5f 63 69 70 68 65 72 3a 0a 09 63 61 73 65 20 5f  _cipher:..case _
8770: 6f 70 74 5f 63 69 70 68 65 72 73 3a 0a 09 20 20  opt_ciphers:..  
8780: 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47    GET_OPT_STRING
8790: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68  (objv[idx], ciph
87a0: 65 72 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  ers, NULL);..   
87b0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
87c0: 70 74 5f 63 69 70 68 65 72 73 75 69 74 65 3a 0a  pt_ciphersuite:.
87d0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52  .    GET_OPT_STR
87e0: 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63  ING(objv[idx], c
87f0: 69 70 68 65 72 73 75 69 74 65 73 2c 20 4e 55 4c  iphersuites, NUL
8800: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
8810: 09 63 61 73 65 20 5f 6f 70 74 5f 63 6d 64 3a 0a  .case _opt_cmd:.
8820: 09 20 20 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62  .    cmdObj = ob
8830: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
8840: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8850: 64 68 70 61 72 61 6d 73 3a 0a 09 20 20 20 20 47  dhparams:..    G
8860: 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62  ET_OPT_STRING(ob
8870: 6a 76 5b 69 64 78 5d 2c 20 44 48 70 61 72 61 6d  jv[idx], DHparam
8880: 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62  s, NULL);..    b
8890: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
88a0: 5f 6b 65 79 3a 0a 09 20 20 20 20 47 45 54 5f 4f  _key:..    GET_O
88b0: 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62  PT_BYTE_ARRAY(ob
88c0: 6a 76 5b 69 64 78 5d 2c 20 6b 65 79 2c 20 26 6b  jv[idx], key, &k
88d0: 65 79 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72  ey_len);..    br
88e0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
88f0: 6b 65 79 66 69 6c 65 3a 0a 09 20 20 20 20 47 45  keyfile:..    GE
8900: 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a  T_OPT_STRING(obj
8910: 76 5b 69 64 78 5d 2c 20 6b 65 79 66 69 6c 65 2c  v[idx], keyfile,
8920: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
8930: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6d  ak;..case _opt_m
8940: 6f 64 65 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f  odel:..    GET_O
8950: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69  PT_STRING(objv[i
8960: 64 78 5d 2c 20 6d 6f 64 65 6c 2c 20 4e 55 4c 4c  dx], model, NULL
8970: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8980: 63 61 73 65 20 5f 6f 70 74 5f 70 61 73 73 77 6f  case _opt_passwo
8990: 72 64 3a 0a 09 20 20 20 20 70 61 73 73 77 64 4f  rd:..    passwdO
89a0: 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a  bj = objv[idx];.
89b0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
89c0: 65 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65  e _opt_handshake
89d0: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42  :..    GET_OPT_B
89e0: 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  OOL(objv[idx], &
89f0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
8a00: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8a10: 73 65 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 3a  se _opt_request:
8a20: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f  ..    GET_OPT_BO
8a30: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72  OL(objv[idx], &r
8a40: 65 71 75 65 73 74 29 3b 0a 09 20 20 20 20 62 72  equest);..    br
8a50: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8a60: 72 65 71 75 69 72 65 3a 0a 09 20 20 20 20 47 45  require:..    GE
8a70: 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b  T_OPT_BOOL(objv[
8a80: 69 64 78 5d 2c 20 26 72 65 71 75 69 72 65 29 3b  idx], &require);
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 63 75 72 69 74 79  se _opt_security
8ab0: 5f 6c 65 76 65 6c 3a 0a 09 20 20 20 20 47 45 54  _level:..    GET
8ac0: 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64  _OPT_INT(objv[id
8ad0: 78 5d 2c 20 26 6c 65 76 65 6c 29 3b 0a 09 20 20  x], &level);..  
8ae0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8af0: 6f 70 74 5f 73 65 72 76 65 72 3a 0a 09 20 20 20  opt_server:..   
8b00: 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62   GET_OPT_BOOL(ob
8b10: 6a 76 5b 69 64 78 5d 2c 20 26 73 65 72 76 65 72  jv[idx], &server
8b20: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8b30: 63 61 73 65 20 5f 6f 70 74 5f 73 65 72 76 65 72  case _opt_server
8b40: 6e 61 6d 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f  name:..    GET_O
8b50: 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69  PT_STRING(objv[i
8b60: 64 78 5d 2c 20 73 65 72 76 65 72 6e 61 6d 65 2c  dx], servername,
8b70: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65   NULL);..    bre
8b80: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73  ak;..case _opt_s
8b90: 65 73 73 69 6f 6e 5f 69 64 3a 0a 09 20 20 20 20  ession_id:..    
8ba0: 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52  GET_OPT_BYTE_ARR
8bb0: 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65  AY(objv[idx], se
8bc0: 73 73 69 6f 6e 5f 69 64 2c 20 26 73 65 73 73 5f  ssion_id, &sess_
8bd0: 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  len);..    break
8be0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73 6c  ;..case _opt_ssl
8bf0: 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  2:..    GET_OPT_
8c00: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8c10: 73 73 6c 32 29 3b 0a 09 20 20 20 20 62 72 65 61  ssl2);..    brea
8c20: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 73  k;..case _opt_ss
8c30: 6c 33 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  l3:..    GET_OPT
8c40: 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  _INT(objv[idx], 
8c50: 26 73 73 6c 33 29 3b 0a 09 20 20 20 20 62 72 65  &ssl3);..    bre
8c60: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74  ak;..case _opt_t
8c70: 6c 73 31 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ls1:..    GET_OP
8c80: 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c  T_INT(objv[idx],
8c90: 20 26 74 6c 73 31 29 3b 0a 09 20 20 20 20 62 72   &tls1);..    br
8ca0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8cb0: 74 6c 73 31 31 3a 0a 09 20 20 20 20 47 45 54 5f  tls11:..    GET_
8cc0: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8cd0: 5d 2c 20 26 74 6c 73 31 5f 31 29 3b 0a 09 20 20  ], &tls1_1);..  
8ce0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8cf0: 6f 70 74 5f 74 6c 73 31 32 3a 0a 09 20 20 20 20  opt_tls12:..    
8d00: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76  GET_OPT_INT(objv
8d10: 5b 69 64 78 5d 2c 20 26 74 6c 73 31 5f 32 29 3b  [idx], &tls1_2);
8d20: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8d30: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 33 3a 0a 09  se _opt_tls13:..
8d40: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
8d50: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8d60: 5f 33 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  _3);..    break;
8d70: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 76 61 6c 69  ..case _opt_vali
8d80: 64 61 74 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74  date:..case _opt
8d90: 5f 76 63 6d 64 3a 0a 09 20 20 20 20 76 63 6d 64  _vcmd:..    vcmd
8da0: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20   = objv[idx];.. 
8db0: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20     break;..}.   
8dc0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 72 65 71 75   }..    if (requ
8dd0: 65 73 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20  est)..verify |= 
8de0: 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e  SSL_VERIFY_CLIEN
8df0: 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52  T_ONCE | SSL_VER
8e00: 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66  IFY_PEER;.    if
8e10: 20 28 72 65 71 75 65 73 74 20 26 26 20 72 65 71   (request && req
8e20: 75 69 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20  uire).verify |= 
8e30: 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f  SSL_VERIFY_FAIL_
8e40: 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b  IF_NO_PEER_CERT;
8e50: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
8e60: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
8e70: 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  ke).verify |= SS
8e80: 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41  L_VERIFY_POST_HA
8e90: 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20  NDSHAKE;.    if 
8ea0: 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76  (verify == 0)..v
8eb0: 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49  erify = SSL_VERI
8ec0: 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72  FY_NONE;..    pr
8ed0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54  oto |= (ssl2 ? T
8ee0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20  LS_PROTO_SSL2 : 
8ef0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
8f00: 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f   (ssl3 ? TLS_PRO
8f10: 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20  TO_SSL3 : 0);.  
8f20: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
8f30: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8f40: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
8f50: 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54  o |= (tls1_1 ? T
8f60: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20  LS_PROTO_TLS1_1 
8f70: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
8f80: 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53  |= (tls1_2 ? TLS
8f90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20  _PROTO_TLS1_2 : 
8fa0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
8fb0: 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50   (tls1_3 ? TLS_P
8fc0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29  ROTO_TLS1_3 : 0)
8fd0: 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20  ;..    /* reset 
8fe0: 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b  to NULL if blank
8ff0: 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64   string provided
9000: 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74   */.    if (cert
9010: 20 26 26 20 21 2a 63 65 72 74 29 09 09 20 20 20   && !*cert)..   
9020: 20 20 20 20 20 63 65 72 74 09 20 20 20 20 20 20       cert.      
9030: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
9040: 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09   (key && !*key).
9050: 09 20 20 20 20 20 20 20 20 6b 65 79 09 20 20 20  .        key.   
9060: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
9070: 20 69 66 20 28 63 65 72 74 66 69 6c 65 20 26 26   if (certfile &&
9080: 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20   !*certfile)    
9090: 20 20 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20       certfile.= 
90a0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65  NULL;.    if (ke
90b0: 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69  yfile && !*keyfi
90c0: 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20  le)..keyfile.   
90d0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
90e0: 20 69 66 20 28 63 69 70 68 65 72 73 20 26 26 20   if (ciphers && 
90f0: 21 2a 63 69 70 68 65 72 73 29 09 20 20 20 20 20  !*ciphers).     
9100: 20 20 20 63 69 70 68 65 72 73 09 20 20 20 20 20     ciphers.     
9110: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9120: 66 20 28 63 69 70 68 65 72 73 75 69 74 65 73 20  f (ciphersuites 
9130: 26 26 20 21 2a 63 69 70 68 65 72 73 75 69 74 65  && !*ciphersuite
9140: 73 29 20 63 69 70 68 65 72 73 75 69 74 65 73 20  s) ciphersuites 
9150: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9160: 66 20 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43  f (CAfile && !*C
9170: 41 66 69 6c 65 29 09 20 20 20 20 20 20 20 20 43  Afile).        C
9180: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  Afile.        = 
9190: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
91a0: 70 61 74 68 20 26 26 20 21 2a 43 41 70 61 74 68  path && !*CApath
91b0: 29 09 20 20 20 20 20 20 20 20 43 41 70 61 74 68  ).        CApath
91c0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
91d0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
91e0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
91f0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
9200: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
9210: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
9220: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
9230: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
9240: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
9250: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
9260: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
9270: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
9280: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
9290: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
92a0: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
92b0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
92c0: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
92d0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
92e0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
92f0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
9300: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
9310: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
9320: 20 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20    if (cmdObj != 
9330: 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69 64 29 20  NULL) {..(void) 
9340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9350: 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 26 6c 65  mObj(cmdObj, &le
9360: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
9370: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
9380: 61 6c 6c 62 61 63 6b 20 3d 20 63 6d 64 4f 62 6a  allback = cmdObj
9390: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
93a0: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
93b0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a  ->callback);..}.
93c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
93d0: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20  locate password 
93e0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77  */.    if (passw
93f0: 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  dObj != NULL) {.
9400: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
9410: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73  tringFromObj(pas
9420: 73 77 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09  swdObj, &len);..
9430: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
9440: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
9450: 72 64 20 3d 20 70 61 73 73 77 64 4f 62 6a 3b 0a  rd = passwdObj;.
9460: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
9470: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
9480: 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20  password);..}.  
9490: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
94a0: 63 61 74 65 20 76 61 6c 69 64 61 74 65 20 63 6f  cate validate co
94b0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20  mmand */.    if 
94c0: 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29  (vcmd) {..(void)
94d0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
94e0: 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e  omObj(vcmd, &len
94f0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
9500: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76 63      statePtr->vc
9510: 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20  md = vcmd;..    
9520: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
9530: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29  (statePtr->vcmd)
9540: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
9550: 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c  if (model != NUL
9560: 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a  L) {..int mode;.
9570: 09 2f 2a 20 47 65 74 20 74 68 65 20 22 6d 6f 64  ./* Get the "mod
9580: 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  el" context */..
9590: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68  chan = Tcl_GetCh
95a0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f  annel(interp, mo
95b0: 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66  del, &mode);..if
95c0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
95d0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
95e0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
95f0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
9600: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
9610: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
9620: 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  .. * Make sure t
9630: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
9640: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
9650: 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63  .. */..chan = Tc
9660: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
9670: 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63 6c 5f  chan);..if (Tcl_
9680: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
9690: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
96a0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 20 20  nelType()) {..  
96b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
96c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
96d0: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
96e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
96f0: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
9700: 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22  t a TLS channel"
9710: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  , NULL);..    Tc
9720: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
9730: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
9740: 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c  MPORT", "CHANNEL
9750: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
9760: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
9770: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
9780: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
9790: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
97a0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d  ERROR;..}..ctx =
97b0: 20 28 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47   ((State *)Tcl_G
97c0: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
97d0: 65 44 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74  eData(chan))->ct
97e0: 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  x;.    } else {.
97f0: 09 69 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f  .if ((ctx = CTX_
9800: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2c 20 73  Init(statePtr, s
9810: 65 72 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65  erver, proto, ke
9820: 79 66 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c  yfile, certfile,
9830: 20 6b 65 79 2c 20 63 65 72 74 2c 20 28 69 6e 74   key, cert, (int
9840: 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20  ) key_len,..    
9850: 28 69 6e 74 29 20 63 65 72 74 5f 6c 65 6e 2c 20  (int) cert_len, 
9860: 43 41 70 61 74 68 2c 20 43 41 66 69 6c 65 2c 20  CApath, CAfile, 
9870: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 73  ciphers, ciphers
9880: 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48  uites, level, DH
9890: 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c  params)) == NULL
98a0: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
98b0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
98c0: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
98d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
98e0: 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65      }..    state
98f0: 50 74 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a  Ptr->ctx = ctx;.
9900: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57  .    /*.     * W
9910: 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73  e need to make s
9920: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 68 61  ure that the cha
9930: 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69  nnel works in bi
9940: 6e 61 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20  nary (for the.  
9950: 20 20 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20     * encryption 
9960: 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65  not to get goofe
9970: 64 20 75 70 29 2e 0a 20 20 20 20 20 2a 20 57 65  d up)..     * We
9980: 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f 20 61 64   only want to ad
9990: 6a 75 73 74 20 74 68 65 20 62 75 66 66 65 72 69  just the bufferi
99a0: 6e 67 20 69 6e 20 70 72 65 2d 76 32 20 63 68 61  ng in pre-v2 cha
99b0: 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a 20 20 20  nnels, where.   
99c0: 20 20 2a 20 65 61 63 68 20 63 68 61 6e 6e 65 6c    * each channel
99d0: 20 69 6e 20 74 68 65 20 73 74 61 63 6b 20 6d 61   in the stack ma
99e0: 69 6e 74 61 69 6e 65 64 20 69 74 73 20 6f 77 6e  intained its own
99f0: 20 62 75 66 66 65 72 73 2e 0a 20 20 20 20 20 2a   buffers..     *
9a00: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
9a10: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
9a20: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
9a30: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9a40: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
9a50: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
9a60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
9a70: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
9a80: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
9a90: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
9aa0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9ab0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
9ac0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9ad0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
9ae0: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
9af0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
9b00: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9b10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9b20: 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22  han, "-encoding"
9b30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
9b40: 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63  ncoding);.    Tc
9b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
9b60: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9b70: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c   "-translation",
9b80: 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72   &upperChannelTr
9b90: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
9ba0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
9bb0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
9bc0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
9bd0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
9be0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
9bf0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9c00: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9c10: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22  -translation", "
9c20: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 54 63  binary");.    Tc
9c30: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9c40: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
9c50: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 22 74   "-blocking", "t
9c60: 72 75 65 22 29 3b 0a 20 20 20 20 64 70 72 69 6e  rue");.    dprin
9c70: 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63  tf("Consuming Tc
9c80: 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54  l channel %s", T
9c90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
9ca0: 65 28 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74  e(chan));.    st
9cb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54  atePtr->self = T
9cc0: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28  cl_StackChannel(
9cd0: 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e  interp, Tls_Chan
9ce0: 6e 65 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65  nelType(), (Clie
9cf0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
9d00: 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45  ,..(TCL_READABLE
9d10: 20 7c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29   | TCL_WRITABLE)
9d20: 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72  , chan);.    dpr
9d30: 69 6e 74 66 28 22 43 72 65 61 74 65 64 20 63 68  intf("Created ch
9d40: 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c  annel named %s",
9d50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
9d60: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
9d70: 6c 66 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74  lf));.    if (st
9d80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20  atePtr->self == 
9d90: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
9da0: 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f  LL) {../*.. * No
9db0: 20 75 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e   use of Tcl_Even
9dc0: 74 75 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75  tuallyFree becau
9dd0: 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54  se no possible T
9de0: 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a  cl_Preserve... *
9df0: 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  /..Tls_Free((cha
9e00: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
9e10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
9e20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  R;.    }..    Tc
9e30: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9e40: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
9e50: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61  Ptr->self, "-tra
9e60: 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44  nslation", Tcl_D
9e70: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
9e80: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
9e90: 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f  tion));.    Tcl_
9ea0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
9eb0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
9ec0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64  r->self, "-encod
9ed0: 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ing", Tcl_DStrin
9ee0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
9ef0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a  nnelEncoding));.
9f00: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
9f10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9f20: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
9f30: 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c   "-eofchar", Tcl
9f40: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
9f50: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9f60: 61 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ar));.    Tcl_Se
9f70: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9f80: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
9f90: 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e  >self, "-blockin
9fa0: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
9fb0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
9fc0: 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20  elBlocking));.  
9fd0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
9fe0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  e(&upperChannelT
9ff0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
a000: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
a010: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
a020: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
a030: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
a040: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
a050: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
a060: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
a070: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
a080: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53  .    /*.     * S
a090: 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  SL Initializatio
a0a0: 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74  n.     */.    st
a0b0: 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53  atePtr->ssl = SS
a0c0: 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e  L_new(statePtr->
a0d0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ctx);.    if (!s
a0e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
a0f0: 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20  ./* SSL library 
a100: 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70  error */..Tcl_Ap
a110: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a120: 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e  p, "couldn't con
a130: 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73 69  struct ssl sessi
a140: 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  on: ", GET_ERR_R
a150: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
a160: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
a170: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a180: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a190: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
a1a0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
a1b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
a1c0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a1d0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
a1e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a1f0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
a200: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
a210: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
a220: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
a230: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
a240: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
a250: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
a260: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
a270: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
a280: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
a290: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
a2a0: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33  g, though RFC 43
a2b0: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a  66 says UTF-8. *
a2c0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f  /..if (!SSL_set_
a2d0: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65  tlsext_host_name
a2e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
a2f0: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72  servername) && r
a300: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54  equire) {..    T
a310: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a320: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e 49  interp, "Set SNI
a330: 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65   extension faile
a340: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
a350: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
a360: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
a370: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
a380: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
a390: 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22 46  PORT", "SNI", "F
a3a0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
a3b0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73   NULL);..    Tls
a3c0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a3d0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a3e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a3f0: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73  ..}.../* Set hos
a400: 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63  tname for peer c
a410: 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e  ertificate hostn
a420: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
a430: 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20   in clients...  
a440: 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73   Don't use SSL_s
a450: 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69  et1_host since i
a460: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
a470: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
a480: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
a490: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
a4a0: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
a4b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a4c0: 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68  terp, "Set DNS h
a4d0: 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20  ostname failed: 
a4e0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
a4f0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
a500: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
a510: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
a520: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
a530: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20  T", "HOSTNAME", 
a540: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
a550: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a560: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a570: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
a580: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a590: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
a5a0: 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69   /* Resume sessi
a5b0: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20  on id */.    if 
a5c0: 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73  (session_id && s
a5d0: 65 73 73 5f 6c 65 6e 20 3c 3d 20 53 53 4c 5f 4d  ess_len <= SSL_M
a5e0: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54  AX_SID_CTX_LENGT
a5f0: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  H) {../* SSL_set
a600: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69  _session() */..i
a610: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  f (!SSL_SESSION_
a620: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28  set1_id_context(
a630: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
a640: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
a650: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73  session_id, (uns
a660: 69 67 6e 65 64 20 69 6e 74 29 20 73 65 73 73 5f  igned int) sess_
a670: 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  len)) {..    Tcl
a680: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a690: 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65  terp, "Resume se
a6a0: 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c  ssion failed: ",
a6b0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
a6c0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
a6d0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
a6e0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
a6f0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
a700: 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41  , "SESSION", "FA
a710: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
a720: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
a730: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a740: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a750: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a760: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a770: 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74   Enable Applicat
a780: 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63  ion-Layer Protoc
a790: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20  ol Negotiation. 
a7a0: 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74  Examples are: ht
a7b0: 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e  tp/1.0,..http/1.
a7c0: 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20  1, h2, h3, ftp, 
a7d0: 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70  imap, pop3, xmpp
a7e0: 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65  -client, xmpp-se
a7f0: 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c  rver, mqtt, irc,
a800: 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20   etc. */.    if 
a810: 28 61 6c 70 6e 4f 62 6a 20 21 3d 20 4e 55 4c 4c  (alpnObj != NULL
a820: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20  ) {../* Convert 
a830: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20  a TCL list into 
a840: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  a protocol-list 
a850: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a  in wire-format *
a860: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  /..unsigned char
a870: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75   *protos, *p;..u
a880: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74  nsigned int prot
a890: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c  os_len = 0;..Tcl
a8a0: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69  _Size cnt, i;..i
a8b0: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  nt j;..Tcl_Obj *
a8c0: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c  *list;...if (Tcl
a8d0: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
a8e0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e  nts(interp, alpn
a8f0: 4f 62 6a 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  Obj, &cnt, &list
a900: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
a910: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a920: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a930: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a940: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
a950: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
a960: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
a970: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
a980: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
a990: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
a9a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
a9b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
a9c0: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
a9d0: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
a9e0: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
a9f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
aa00: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
aa10: 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28  mes too long", (
aa20: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
aa30: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
aa40: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
aa50: 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e   "IMPORT", "ALPN
aa60: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
aa70: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54  ar *) NULL);...T
aa80: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
aa90: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65   statePtr);...re
aaa0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
aab0: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74  .    }..    prot
aac0: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69  os_len += 1 + (i
aad0: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a  nt) len;..}.../*
aae0: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c   Build the compl
aaf0: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ete protocol-lis
ab00: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63  t */..protos = c
ab10: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65  kalloc(protos_le
ab20: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c  n);../* protocol
ab30: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f  -lists consist o
ab40: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70  f 8-bit length-p
ab50: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74  refixed, byte st
ab60: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a  rings */..for (j
ab70: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73   = 0, p = protos
ab80: 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20  ; j < cnt; j++) 
ab90: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72  {..    char *str
aba0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
abb0: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c  FromObj(list[j],
abc0: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b   &len);..    *p+
abd0: 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  + = (unsigned ch
abe0: 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65  ar) len;..    me
abf0: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69  mcpy(p, str, (si
ac00: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20  ze_t) len);..   
ac10: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
ac20: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
ac30: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
ac40: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
ac50: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
ac60: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
ac70: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
ac80: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
ac90: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
aca0: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
acb0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
acc0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
acd0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
ace0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
acf0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41  t(interp, "Set A
ad00: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61  LPN protocols fa
ad10: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
ad20: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
ad30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
ad40: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
ad50: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
ad60: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
ad70: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
ad80: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
ad90: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
ada0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
adb0: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73     ckfree(protos
adc0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
add0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f  CL_ERROR;..}.../
ade0: 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c  * Store protocol
adf0: 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65  s list */..state
ae00: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72  Ptr->protos = pr
ae10: 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d  otos;..statePtr-
ae20: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72  >protos_len = pr
ae30: 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20  otos_len;.    } 
ae40: 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72  else {..statePtr
ae50: 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b  ->protos = NULL;
ae60: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
ae70: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20  os_len = 0;.    
ae80: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
ae90: 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20   SSL Callbacks. 
aea0: 20 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73      */.    SSL_s
aeb0: 65 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74  et_app_data(stat
aec0: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
aed0: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a   *)statePtr);./*
aee0: 20 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75   point back to u
aef0: 73 20 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65  s */..    SSL_se
af00: 74 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74  t_verify(statePt
af10: 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20  r->ssl, verify, 
af20: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b  VerifyCallback);
af30: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66  .    SSL_set_inf
af40: 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  o_callback(state
af50: 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61  Ptr->ssl, InfoCa
af60: 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a  llback);..    /*
af70: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62   Callback for ob
af80: 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  serving protocol
af90: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66   messages */.#if
afa0: 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ndef OPENSSL_NO_
afb0: 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a  SSL_TRACE.    /*
afc0: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
afd0: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61  t_msg_callback_a
afe0: 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  rg(statePtr->ctx
aff0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
b000: 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53  tr);.    void SS
b010: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
b020: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
b030: 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ctx, MessageCal
b040: 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53  lback); */.    S
b050: 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  SL_set_msg_callb
b060: 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72  ack_arg(statePtr
b070: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
b080: 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53  tatePtr);.    SS
b090: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
b0a0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
b0b0: 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  , MessageCallbac
b0c0: 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  k);.#endif..    
b0d0: 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68  /* Create Tcl_Ch
b0e0: 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65  annel BIO Handle
b0f0: 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  r */.    statePt
b100: 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e  r->p_bio.= BIO_n
b110: 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c  ew_tcl(statePtr,
b120: 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20   BIO_NOCLOSE);. 
b130: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f     statePtr->bio
b140: 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66  .= BIO_new(BIO_f
b150: 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66  _ssl());..    if
b160: 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20   (server) {../* 
b170: 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73  Server callbacks
b180: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
b190: 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61  _tlsext_serverna
b1a0: 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  me_arg(statePtr-
b1b0: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
b1c0: 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54  atePtr);..SSL_CT
b1d0: 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72  X_set_tlsext_ser
b1e0: 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b  vername_callback
b1f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b200: 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53  SNICallback);..S
b210: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e  SL_CTX_set_clien
b220: 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65  t_hello_cb(state
b230: 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43  Ptr->ctx, HelloC
b240: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
b250: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20  )statePtr);..if 
b260: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
b270: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
b280: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c    SSL_CTX_set_al
b290: 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61  pn_select_cb(sta
b2a0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e  tePtr->ctx, ALPN
b2b0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
b2c0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66  *)statePtr);.#if
b2d0: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20  def USE_NPN..   
b2e0: 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30   if (tls1_2 == 0
b2f0: 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29   && tls1_3 == 0)
b300: 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
b310: 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76  _next_protos_adv
b320: 65 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65  ertised_cb(state
b330: 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c  Ptr->ctx, NPNCal
b340: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
b350: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d  tatePtr);..    }
b360: 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20  .#endif..}.../* 
b370: 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f  Enable server to
b380: 20 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65   send cert reque
b390: 73 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61  st after handsha
b3a0: 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79  ke (TLS 1.3 only
b3b0: 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65  ) */../* A write
b3c0: 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20   operation must 
b3d0: 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74  take place for t
b3e0: 68 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52  he Certificate R
b3f0: 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20  equest to be..  
b400: 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69   sent to the cli
b410: 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65  ent, this can be
b420: 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64   done with SSL_d
b430: 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a  o_handshake(). *
b440: 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26  /..if (request &
b450: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
b460: 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20   && tls1_3) {.. 
b470: 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c     SSL_verify_cl
b480: 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  ient_post_handsh
b490: 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ake(statePtr->ss
b4a0: 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20  l);..}.../* set 
b4b0: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20  automatic curve 
b4c0: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53  selection */..SS
b4d0: 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28  L_set_ecdh_auto(
b4e0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31  statePtr->ssl, 1
b4f0: 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76  );.../* Set serv
b500: 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74  er mode */..stat
b510: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
b520: 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09  LS_TCL_SERVER;..
b530: 53 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73  SSL_set_accept_s
b540: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
b550: 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  sl);.    } else 
b560: 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c  {../* Client cal
b570: 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66  lbacks */.#ifdef
b580: 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74   USE_NPN..if (st
b590: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
b5a0: 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32  = NULL && tls1_2
b5b0: 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20   == 0 && tls1_3 
b5c0: 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c  == 0) {..    SSL
b5d0: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
b5e0: 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74  oto_select_cb(st
b5f0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50  atePtr->ctx, ALP
b600: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
b610: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d   *)statePtr);..}
b620: 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73  .#endif.../* Ses
b630: 73 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a  sion caching */.
b640: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73  .SSL_CTX_set_ses
b650: 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28  sion_cache_mode(
b660: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
b670: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c  SL_SESS_CACHE_CL
b680: 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f  IENT | SSL_SESS_
b690: 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41  CACHE_NO_INTERNA
b6a0: 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43  L_STORE);..SSL_C
b6b0: 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f  TX_sess_set_new_
b6c0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
b6d0: 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  , SessionCallbac
b6e0: 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20  k);.../* Enable 
b6f0: 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41  post handshake A
b700: 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78  uthentication ex
b710: 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33  tension. TLS 1.3
b720: 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f   only, not http/
b730: 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  2. */..if (reque
b740: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
b750: 68 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c  hake) {..    SSL
b760: 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68  _set_post_handsh
b770: 61 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74  ake_auth(statePt
b780: 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a  r->ssl, 1);..}..
b790: 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d  ./* Set client m
b7a0: 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ode */..SSL_set_
b7b0: 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74  connect_state(st
b7c0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
b7d0: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f    }.    SSL_set_
b7e0: 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  bio(statePtr->ss
b7f0: 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  l, statePtr->p_b
b800: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f  io, statePtr->p_
b810: 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65  bio);.    BIO_se
b820: 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e  t_ssl(statePtr->
b830: 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  bio, statePtr->s
b840: 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  sl, BIO_NOCLOSE)
b850: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
b860: 20 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74   End of SSL Init
b870: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72  .     */.    dpr
b880: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
b890: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
b8a0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
b8b0: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63  ->self));.    Tc
b8c0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
b8d0: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c  rp, (char *) Tcl
b8e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
b8f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
b900: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
b910: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b920: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
b930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b970: 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f  . *. * UnimportO
b980: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
b990: 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73  his procedure is
b9a0: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f   invoked to remo
b9b0: 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  ve the topmost c
b9c0: 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20  hannel filter.. 
b9d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
b9e0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
b9f0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
ba00: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
ba10: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
ba20: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
ba30: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d  channel.. *. *--
ba40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ba80: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
ba90: 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28  .UnimportObjCmd(
baa0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
bab0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
bac0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
bad0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
bae0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
baf0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
bb00: 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
bb10: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
bb20: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 28 76 6f  e on. */.    (vo
bb30: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
bb40: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
bb50: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
bb60: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
bb70: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
bb80: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
bb90: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
bba0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bbb0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20      }..    chan 
bbc0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
bbd0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
bbe0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
bbf0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
bc00: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
bc10: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
bc20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bc30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
bc40: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
bc50: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
bc60: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
bc70: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
bc80: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
bc90: 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ;..    if (Tcl_G
bca0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
bcb0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
bcc0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
bcd0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bce0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
bcf0: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
bd00: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
bd10: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
bd20: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
bd30: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
bd40: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
bd50: 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f  , "TLS", "UNIMPO
bd60: 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  RT", "CHANNEL", 
bd70: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
bd80: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
bd90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bda0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c    }..    if (Tcl
bdb0: 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28  _UnstackChannel(
bdc0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d  interp, chan) ==
bdd0: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72   TCL_ERROR) {..r
bde0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bdf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
be00: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
be10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54  -------. *. * CT
be60: 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72  X_Init -- constr
be70: 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e  uct a SSL_CTX in
be80: 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73  stance. *. * Res
be90: 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64  ults:. *.A valid
bea0: 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63   SSL_CTX instanc
beb0: 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a  e or NULL.. *. *
bec0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
bed0: 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c  *.constructs SSL
bee0: 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20   context (CTX). 
bef0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
bf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
bf40: 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58  ic SSL_CTX *.CTX
bf50: 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61  _Init(State *sta
bf60: 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72  tePtr, int isSer
bf70: 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20  ver, int proto, 
bf80: 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63  char *keyfile, c
bf90: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20  har *certfile,. 
bfa0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
bfb0: 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20   *key, unsigned 
bfc0: 63 68 61 72 20 2a 63 65 72 74 2c 20 69 6e 74 20  char *cert, int 
bfd0: 6b 65 79 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72  key_len, int cer
bfe0: 74 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43 41 70  t_len, char *CAp
bff0: 61 74 68 2c 0a 20 20 20 20 63 68 61 72 20 2a 43  ath,.    char *C
c000: 41 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 69 70  Afile, char *cip
c010: 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68  hers, char *ciph
c020: 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65  ersuites, int le
c030: 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72  vel, char *DHpar
c040: 61 6d 73 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49  ams) {.    Tcl_I
c050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 20 3d 20  nterp *interp = 
c060: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
c070: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
c080: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54  tx = NULL;.    T
c090: 63 6c 5f 44 53 74 72 69 6e 67 20 64 73 3b 0a 20  cl_DString ds;. 
c0a0: 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 2c 20     int off = 0, 
c0b0: 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20 20 20 69  abort = 0;.    i
c0c0: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  nt load_private_
c0d0: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  key;.    const S
c0e0: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
c0f0: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
c100: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
c110: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54  if (!proto) {..T
c120: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c130: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69  interp, "no vali
c140: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  d protocol selec
c150: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
c160: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
c170: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
c180: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e  * create SSL con
c190: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  text */.#if OPEN
c1a0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
c1b0: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30  ER >= 0x10100000
c1c0: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f  L || defined(NO_
c1d0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL2) || defined
c1e0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
c1f0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
c200: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c210: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c  TO_SSL2)) {..Tcl
c220: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
c230: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74  terp, "SSL2 prot
c240: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
c250: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
c260: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
c270: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
c280: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
c290: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
c2a0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
c2b0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
c2c0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
c2d0: 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL3)) {..Tcl_
c2e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
c2f0: 65 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f  erp, "SSL3 proto
c300: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
c310: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
c320: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
c330: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
c340: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
c350: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
c360: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
c370: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
c380: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
c390: 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41  _TLS1)) {..Tcl_A
c3a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c3b0: 72 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f  rp, "TLS 1.0 pro
c3c0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
c3d0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
c3e0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
c3f0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
c400: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
c410: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
c420: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c430: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_1).    if (EN
c440: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
c450: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20  _PROTO_TLS1_1)) 
c460: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c470: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
c480: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.1 protocol no
c490: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
c4a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
c4b0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
c4c0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
c4d0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
c4e0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
c4f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
c500: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
c510: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
c520: 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_2)) {..Tcl_A
c530: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c540: 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f  rp, "TLS 1.2 pro
c550: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
c560: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
c570: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
c580: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
c590: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
c5a0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
c5b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c5c0: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_3).    if (EN
c5d0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
c5e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20  _PROTO_TLS1_3)) 
c5f0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c600: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
c610: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.3 protocol no
c620: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
c630: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
c640: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
c650: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
c660: 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09  (proto == 0) {..
c670: 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67  /* Use full rang
c680: 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  e */..SSL_CTX_se
c690: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
c6a0: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53  ion(ctx, 0);..SS
c6b0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
c6c0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
c6d0: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
c6e0: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b  switch (proto) {
c6f0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
c700: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
c710: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
c720: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
c730: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
c740: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
c750: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
c760: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL2:..method = i
c770: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f  sServer ? SSLv2_
c780: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
c790: 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d  : SSLv2_client_m
c7a0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
c7b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c7c0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
c7d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c7e0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
c7f0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c800: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
c810: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
c820: 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20  O_SSL3:..method 
c830: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c  = isServer ? SSL
c840: 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v3_server_method
c850: 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e  () : SSLv3_clien
c860: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
c870: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
c880: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
c890: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c8a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26  NSSL_NO_TLS1) &&
c8b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c8c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
c8d0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
c8e0: 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68  ROTO_TLS1:..meth
c8f0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
c900: 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74  TLSv1_server_met
c910: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c  hod() : TLSv1_cl
c920: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
c930: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
c940: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
c950: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
c960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
c970: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
c980: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c990: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _1_METHOD).    c
c9a0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
c9b0: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_1:..method = 
c9c0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
c9d0: 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _1_server_method
c9e0: 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69  () : TLSv1_1_cli
c9f0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
ca00: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
ca10: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ca20: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
ca30: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ca40: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
ca50: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
ca60: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  2_METHOD).    ca
ca70: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
ca80: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_2:..method = i
ca90: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
caa0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  2_server_method(
cab0: 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65  ) : TLSv1_2_clie
cac0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
cad0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
cae0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
caf0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
cb00: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
cb10: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  3).    case TLS_
cb20: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f  PROTO_TLS1_3:../
cb30: 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69  * Use the generi
cb40: 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e  c method and con
cb50: 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66  straint range af
cb60: 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63  ter context is c
cb70: 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f  reated */..metho
cb80: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
cb90: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
cba0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
cbb0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
cbc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  ;.#endif.    def
cbd0: 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69  ault:../* Negoti
cbe0: 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69  ate highest avai
cbf0: 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65  lable SSL/TLS ve
cc00: 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64  rsion */..method
cc10: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
cc20: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
cc30: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
cc40: 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45  ethod();.#if OPE
cc50: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
cc60: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
cc70: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f  L && !defined(NO
cc80: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
cc90: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
cca0: 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L2)..off |= (ENA
ccb0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
ccc0: 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20  PROTO_SSL2)   ? 
ccd0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
cce0: 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv2);.#endif.#if
ccf0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
cd00: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
cd10: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
cd20: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
cd30: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cd40: 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20  O_SSL3)   ? 0 : 
cd50: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29  SSL_OP_NO_SSLv3)
cd60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
cd70: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
cd80: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
cd90: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66  SL_NO_TLS1)..off
cda0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
cdb0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
cdc0: 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  S1)   ? 0 : SSL_
cdd0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65  OP_NO_TLSv1);.#e
cde0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
cdf0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
ce00: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
ce10: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66  _NO_TLS1_1)..off
ce20: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
ce30: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
ce40: 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_1) ? 0 : SSL_
ce50: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a  OP_NO_TLSv1_1);.
ce60: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
ce70: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
ce80: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
ce90: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f  SL_NO_TLS1_2)..o
cea0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
ceb0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
cec0: 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53  TLS1_2) ? 0 : SS
ced0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29  L_OP_NO_TLSv1_2)
cee0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
cef0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
cf00: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
cf10: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
cf20: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
cf30: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cf40: 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20  O_TLS1_3) ? 0 : 
cf50: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
cf60: 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61  3);.#endif..brea
cf70: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  k;.    }..    ER
cf80: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
cf90: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
cfa0: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b  CTX_new(method);
cfb0: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b  .    if (!ctx) {
cfc0: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
cfd0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67      }..    if (g
cfe0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
cff0: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58  ILE)) {..SSL_CTX
d000: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c  _set_keylog_call
d010: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67  back(ctx, KeyLog
d020: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
d030: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
d040: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
d050: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d060: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
d070: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52  (proto == TLS_PR
d080: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53  OTO_TLS1_3) {..S
d090: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
d0a0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
d0b0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
d0c0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
d0d0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
d0e0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
d0f0: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65  RSION);.    }.#e
d100: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  ndif..    /* For
d110: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74  ce cipher select
d120: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72  ion order by ser
d130: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  ver */.    if (!
d140: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c  isServer) {..SSL
d150: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
d160: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50  (ctx, SSL_OP_CIP
d170: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45  HER_SERVER_PREFE
d180: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23  RENCE);.    }..#
d190: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
d1a0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
d1b0: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e  100000L.    Open
d1c0: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f  SSL_add_all_algo
d1d0: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61  rithms(); /* Loa
d1e0: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69  d ciphers and di
d1f0: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  gests */.#endif.
d200: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
d210: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
d220: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
d230: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
d240: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
d250: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
d260: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
d270: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
d280: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
d290: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
d2a0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
d2b0: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
d2c0: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69  PRESSION);./* di
d2d0: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
d2e0: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
d2f0: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
d300: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
d310: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69  tx, off);../* di
d320: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76  sable protocol v
d330: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f  ersions */.#if O
d340: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d350: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30  UMBER < 0x101010
d360: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  00L.    SSL_CTX_
d370: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53  set_mode(ctx, SS
d380: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52  L_MODE_AUTO_RETR
d390: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65  Y);./* handle ne
d3a0: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20  w handshakes in 
d3b0: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62  background. On b
d3c0: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65  y default in Ope
d3d0: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23  nSSL 1.1.1. */.#
d3e0: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54  endif.    SSL_CT
d3f0: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65  X_sess_set_cache
d400: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b  _size(ctx, 128);
d410: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
d420: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72  r defined cipher
d430: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73  s, cipher suites
d440: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c  , and security l
d450: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
d460: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c  (ciphers != NULL
d470: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
d480: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74  t_cipher_list(ct
d490: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09  x, ciphers)) {..
d4a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d4b0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
d4c0: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f  phers failed: No
d4d0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
d4e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d4f0: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
d500: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
d510: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
d520: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
d530: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
d540: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
d550: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
d560: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f  suites)) {..Tcl_
d570: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d580: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
d590: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
d5a0: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
d5b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d5c0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
d5d0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
d5e0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
d5f0: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20  /* Set security 
d600: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
d610: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c  (level > -1 && l
d620: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20  evel < 6) {../* 
d630: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79  SSL_set_security
d640: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43  _level */..SSL_C
d650: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  TX_set_security_
d660: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c  level(ctx, level
d670: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
d680: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
d690: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
d6a0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
d6b0: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
d6c0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
d6d0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
d6e0: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
d6f0: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c  cb_userdata(ctx,
d700: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
d710: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  r);..    /* read
d720: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
d730: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
d740: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
d750: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69  ilt-in one */.#i
d760: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  fdef OPENSSL_NO_
d770: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  DH.    if (DHpar
d780: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
d790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d7a0: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72  (interp, "DH par
d7b0: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e  ameter support n
d7c0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28  ot available", (
d7d0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d7e0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d7f0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d800: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
d810: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20   {..DH* dh;..if 
d820: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
d830: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62  L) {..    BIO *b
d840: 69 6f 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  io;..    bio = B
d850: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
d860: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
d870: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
d880: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
d890: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
d8a0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d8b0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
d8c0: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
d8d0: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
d8e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
d8f0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
d900: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
d910: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
d920: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
d930: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
d940: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
d950: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
d960: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
d970: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
d980: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
d990: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
d9a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
d9b0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
d9c0: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
d9d0: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
d9e0: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
d9f0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
da00: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
da10: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
da20: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
da30: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65  h);..    DH_free
da40: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  (dh);...} else {
da50: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
da60: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
da70: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
da80: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
da90: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
daa0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
dab0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
dac0: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
dad0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dae0: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
daf0: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
db00: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
db10: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
db20: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
db30: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
db40: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
db50: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
db60: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
db70: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
db80: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
db90: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
dba0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
dbb0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
dbc0: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
dbd0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
dbe0: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
dbf0: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
dc00: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
dc10: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
dc20: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
dc30: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
dc40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
dc50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
dc60: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
dc70: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
dc80: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
dc90: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
dca0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
dcb0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
dcc0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
dcd0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
dce0: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
dcf0: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65  e(&ds);..    } e
dd00: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20  lse if (cert != 
dd10: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
dd20: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09  ivate_key = 1;..
dd30: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
dd40: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31  certificate_ASN1
dd50: 28 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20  (ctx, cert_len, 
dd60: 63 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20  cert) <= 0) {.. 
dd70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
dd80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
dd90: 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74 69  ble to set certi
dda0: 66 69 63 61 74 65 3a 20 22 2c 0a 09 09 47 45 54  ficate: ",...GET
ddb0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
ddc0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
ddd0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
dde0: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
ddf0: 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 0a 20 20 20  rn NULL;..}..   
de00: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66   } else {..certf
de10: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30  ile = (char*)X50
de20: 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65  9_get_default_ce
de30: 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20  rt_file();...if 
de40: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
de50: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
de60: 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c  x, certfile, SSL
de70: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
de80: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20  = 0) {.#if 0..  
de90: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
dea0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
deb0: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
dec0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
ded0: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
dee0: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
def0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
df00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
df10: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
df20: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
df30: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20  LL;.#endif..}.  
df40: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
df50: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20  our private key 
df60: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f  */.    if (load_
df70: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09  private_key) {..
df80: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
df90: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55  ULL && key == NU
dfa0: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69  LL) {..    keyfi
dfb0: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
dfc0: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20  }...if (keyfile 
dfd0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
dfe0: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61  /* get the priva
dff0: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  te key associate
e000: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74  d with this cert
e010: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
e020: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
e030: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65  ULL) {...keyfile
e040: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20   = certfile;..  
e050: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53    }...    if (SS
e060: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
e070: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46  eKey_file(ctx, F
e080: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29  2N(keyfile, &ds)
e090: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
e0a0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  EM) <= 0) {...Tc
e0b0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e0c0: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
e0d0: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
e0e0: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
e0f0: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
e100: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
e110: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
e120: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
e130: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e140: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
e150: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
e160: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69  ey file ", keyfi
e170: 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47  le, " ",...    G
e180: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
e190: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e1a0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
e1b0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
e1c0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
e1d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
e1e0: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  (&ds);...} else 
e1f0: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29  if (key != NULL)
e200: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f   {..    if (SSL_
e210: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
e220: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59  ey_ASN1(EVP_PKEY
e230: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b  _RSA, ctx, key,k
e240: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
e250: 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70  ../* flush the p
e260: 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20  assphrase which 
e270: 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e  might be left in
e280: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09   the result */..
e290: 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
e2a0: 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c  nterp, NULL, TCL
e2b0: 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f  _STATIC);...Tcl_
e2c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e2d0: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
e2e0: 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20  set public key: 
e2f0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
e300: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
e310: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
e320: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
e330: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
e340: 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e  .}../* Now we kn
e350: 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e  ow that a key an
e360: 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65 6e  d cert have been
e370: 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a   set against.. *
e380: 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74   the SSL context
e390: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54   */..if (!SSL_CT
e3a0: 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f  X_check_private_
e3b0: 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20  key(ctx)) {..   
e3c0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e3d0: 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61  t(interp, "priva
e3e0: 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20  te key does not 
e3f0: 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69 66  match the certif
e400: 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79  icate public key
e410: 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61 72  ",....     (char
e420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
e430: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e440: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
e450: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ULL;..}.    }.. 
e460: 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73 65     /* Set to use
e470: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
e480: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
e490: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
e4a0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
e4b0: 69 63 61 74 65 73 2e 20 54 68 65 0a 20 20 20 20  icates. The.    
e4c0: 20 2a 20 76 65 72 69 66 79 20 70 61 74 68 20 61   * verify path a
e4d0: 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65 20  nd store can be 
e4e0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74 68  overridden by th
e4f0: 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20 65  e SSL_CERT_DIR e
e500: 6e 76 20 76 61 72 2e 20 54 68 65 20 76 65 72 69  nv var. The veri
e510: 66 79 20 66 69 6c 65 20 63 61 6e 0a 20 20 20 20  fy file can.    
e520: 20 2a 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e   * be overridden
e530: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
e540: 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a  _FILE env var. *
e550: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43  /.    if (!SSL_C
e560: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76  TX_set_default_v
e570: 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78 29  erify_paths(ctx)
e580: 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20  ) {..abort++;.  
e590: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
e5a0: 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43 41  rides for the CA
e5b0: 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e 64   verify path and
e5c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23   file */.    {.#
e5d0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
e5e0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
e5f0: 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70  000000L..if (CAp
e600: 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43  ath != NULL || C
e610: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
e620: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e630: 67 20 64 73 31 3b 0a 09 20 20 20 20 69 66 20 28  g ds1;..    if (
e640: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
e650: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
e660: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
e670: 26 64 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68  &ds), F2N(CApath
e680: 2c 20 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62  , &ds1))) {...ab
e690: 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
e6a0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
e6b0: 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63  ee(&ds);..    Tc
e6c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e6d0: 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65  s1);...    /* Se
e6e0: 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f  t list of CAs to
e6f0: 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20   send to client 
e700: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
e710: 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69  a client certifi
e720: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  cate */..    /* 
e730: 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f  https://sourcefo
e740: 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75  rge.net/p/tls/bu
e750: 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f  gs/57/ */..    /
e760: 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20  * XXX:TODO: Let 
e770: 74 68 65 20 75 73 65 72 20 73 75 70 70 6c 79 20  the user supply 
e780: 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74  values here inst
e790: 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67  ead of something
e7a0: 20 74 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20   that exists on 
e7b0: 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a  the filesystem *
e7c0: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
e7d0: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
e7e0: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
e7f0: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
e800: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
e810: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
e820: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
e830: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
e840: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
e850: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
e860: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
e870: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
e880: 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69 66 20 28  ..}..#else..if (
e890: 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29 20  CApath != NULL) 
e8a0: 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  {..    if (!SSL_
e8b0: 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
e8c0: 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41 70  dir(ctx, F2N(CAp
e8d0: 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09 09  ath, &ds))) {...
e8e0: 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a  abort++;..    }.
e8f0: 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
e900: 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09 69  Free(&ds);..}..i
e910: 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
e920: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
e930: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
e940: 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  fy_file(ctx, F2N
e950: 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20  (CAfile, &ds))) 
e960: 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
e970: 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
e980: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
e990: 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
e9a0: 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
e9b0: 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
e9c0: 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
e9d0: 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
e9e0: 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
e9f0: 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
ea00: 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
ea10: 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
ea20: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
ea30: 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
ea40: 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
ea50: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
ea60: 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
ea70: 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
ea80: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
ea90: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
eaa0: 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ..}.#endif.    }
eab0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78  ..    return ctx
eac0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
ead0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
eb10: 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d  *. * StatusObjCm
eb20: 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74  d -- return cert
eb30: 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e  ificate for conn
eb40: 65 63 74 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20  ected peer.. *. 
eb50: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
eb60: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
eb70: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
eb80: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65  effects:. *.None
eb90: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
ebe0: 74 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73  tatic int.Status
ebf0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
ec00: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
ec10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
ec20: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
ec30: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
ec40: 5d 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  ]) {.    State *
ec50: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35  statePtr;.    X5
ec60: 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63  09 *peer;.    Tc
ec70: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20  l_Obj *objPtr;. 
ec80: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
ec90: 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  han;.    char *c
eca0: 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70  hannelName, *cip
ecb0: 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f  hers;.    int mo
ecc0: 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  de;.    const un
ecd0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
ece0: 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  to;.    unsigned
ecf0: 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e   int len;.    in
ed00: 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20  t nid, res;.    
ed10: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
ed20: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
ed30: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
ed40: 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20  if (objc < 2 || 
ed50: 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a  objc > 3 || (obj
ed60: 63 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d  c == 3 && !strcm
ed70: 70 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  p(Tcl_GetString(
ed80: 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61  objv[1]), "-loca
ed90: 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  l"))) {..Tcl_Wro
eda0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
edb0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f  , 1, objv, "?-lo
edc0: 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a  cal? channel");.
edd0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ede0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
edf0: 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20   Get channel Id 
ee00: 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61  */.    channelNa
ee10: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
ee20: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28  ngFromObj(objv[(
ee30: 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20  objc == 2 ? 1 : 
ee40: 32 29 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a  2)], (Tcl_Size *
ee50: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61  ) NULL);.    cha
ee60: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
ee70: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
ee80: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
ee90: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
eea0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
eeb0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
eec0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
eed0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
eee0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
eef0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
ef00: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
ef10: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
ef20: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
ef30: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
ef40: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
ef50: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
ef60: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
ef70: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
ef80: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
ef90: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
efa0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
efb0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
efc0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
efd0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
efe0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41  erp, "TLS", "STA
eff0: 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  TUS", "CHANNEL",
f000: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
f010: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
f020: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f030: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
f040: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63  r = (State *) Tc
f050: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
f060: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
f070: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74  .    /* Get cert
f080: 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72  ificate for peer
f090: 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   or self */.    
f0a0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
f0b0: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
f0c0: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74  _peer_certificat
f0d0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
f0e0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
f0f0: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  peer = SSL_get_c
f100: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
f110: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
f120: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30  ..    /* Get X50
f130: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
f140: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65  fo */.    if (pe
f150: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
f160: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
f170: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
f180: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
f190: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
f1a0: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
f1b0: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
f1c0: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
f1d0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
f1e0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
f1f0: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
f200: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
f210: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
f220: 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22  jPtr, "peername"
f230: 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e  , SSL_get0_peern
f240: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
f250: 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  l), -1);.    LAP
f260: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
f270: 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22   objPtr, "sbits"
f280: 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  , SSL_get_cipher
f290: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
f2a0: 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20  ssl, NULL));..  
f2b0: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
f2c0: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
f2d0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
f2e0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
f2f0: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
f300: 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68  , "cipher", ciph
f310: 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  ers, -1);..    /
f320: 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
f330: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
f340: 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
f350: 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  eer */.    LAPPE
f360: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
f370: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65  bjPtr, "verifyRe
f380: 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72  sult",..X509_ver
f390: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
f3a0: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
f3b0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
f3c0: 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
f3d0: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
f3e0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64   mode */.    mod
f3f0: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  e = SSL_get_veri
f400: 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  fy_mode(statePtr
f410: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  ->ssl);.    if (
f420: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
f430: 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50  FY_NONE) {..LAPP
f440: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
f450: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
f460: 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ode", "none", -1
f470: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
f480: 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62  .Tcl_Obj *listOb
f490: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
f4a0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
f4b0: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
f4c0: 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a  _VERIFY_PEER) {.
f4d0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f4e0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
f4f0: 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
f500: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f510: 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b  bj("peer", -1));
f520: 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
f530: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
f540: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
f550: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
f560: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f570: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
f580: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f590: 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20  ingObj("fail if 
f5a0: 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d  no peer cert", -
f5b0: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
f5c0: 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
f5d0: 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09  CLIENT_ONCE) {..
f5e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
f5f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f600: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
f610: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f620: 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c  j("client once",
f630: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
f640: 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
f650: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
f660: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
f670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f680: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
f690: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f6a0: 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
f6b0: 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
f6c0: 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
f6d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f6e0: 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
f6f0: 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
f700: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
f710: 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
f720: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
f730: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
f740: 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
f750: 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
f760: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
f770: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
f780: 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
f790: 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
f7a0: 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
f7b0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
f7c0: 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
f7d0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
f7e0: 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
f7f0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
f800: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f810: 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
f820: 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a  )proto, (Tcl_Siz
f830: 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  e) len);.    LAP
f840: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
f850: 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
f860: 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
f870: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
f880: 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  sl), -1);..    /
f890: 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
f8a0: 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
f8b0: 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
f8c0: 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
f8d0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
f8e0: 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
f8f0: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
f900: 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
f910: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
f920: 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
f930: 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
f940: 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
f950: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
f960: 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
f970: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
f980: 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
f990: 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
f9a0: 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
f9b0: 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 69 66  d), -1);..    if
f9c0: 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
f9d0: 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
f9e0: 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  er_signature_typ
f9f0: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
fa00: 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
fa10: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
fa20: 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
fa30: 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
fa40: 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
fa50: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21  .    }.    if (!
fa60: 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a  res) {nid = 0;}.
fa70: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
fa80: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fa90: 22 73 69 67 6e 61 74 75 72 65 54 79 70 65 22 2c  "signatureType",
faa0: 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29   OBJ_nid2ln(nid)
fab0: 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  , -1);..    Tcl_
fac0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
fad0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
fae0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
faf0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
fb40: 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  . * ConnectionIn
fb50: 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  foObjCmd -- retu
fb60: 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  rn connection in
fb70: 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  fo from OpenSSL.
fb80: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
fb90: 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e   *.A list of con
fba0: 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a  nection info.  *
fbb0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbf0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
fc00: 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f  ic int Connectio
fc10: 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65  nInfoObjCmd(Clie
fc20: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
fc30: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
fc40: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
fc50: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
fc60: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
fc70: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
fc80: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
fc90: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
fca0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
fcb0: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
fcc0: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
fcd0: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
fce0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c  Tcl_Obj *objPtr,
fcf0: 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63   *listPtr;.    c
fd00: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20  onst SSL *ssl;. 
fd10: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50     const SSL_CIP
fd20: 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20  HER *cipher;.   
fd30: 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49   const SSL_SESSI
fd40: 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20  ON *session;.   
fd50: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d   const EVP_MD *m
fd60: 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  d;.    (void) cl
fd70: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69  ientData;..    i
fd80: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
fd90: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
fda0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
fdb0: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
fdc0: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
fdd0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  );.    }..    ch
fde0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
fdf0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
fe00: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
fe10: 28 6f 62 6a 76 5b 31 5d 2c 20 28 54 63 6c 5f 53  (objv[1], (Tcl_S
fe20: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55  ize *) NULL), NU
fe30: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
fe40: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
fe50: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
fe60: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
fe70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
fe80: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
fe90: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
fea0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
feb0: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
fec0: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
fed0: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
fee0: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
fef0: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
ff00: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
ff10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ff20: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
ff30: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
ff40: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
ff50: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54      "\": not a T
ff60: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
ff70: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
ff80: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
ff90: 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e  LS", "CONNECTION
ffa0: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
ffb0: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
ffc0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
ffd0: 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20  (TCL_ERROR);.   
ffe0: 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d   }..    objPtr =
fff0: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
10000 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f  0, NULL);..    /
10010 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  * Connection inf
10020 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  o */.    statePt
10030 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
10040 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
10050 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20  nceData(chan);. 
10060 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74     ssl = statePt
10070 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28  r->ssl;.    if (
10080 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ssl != NULL) {..
10090 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74  /* connection st
100a0 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ate */..LAPPEND_
100b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
100c0 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c  tr, "state", SSL
100d0 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f  _state_string_lo
100e0 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09  ng(ssl), -1);...
100f0 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75 65  /* Get SNI reque
10100 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65  sted server name
10110 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
10120 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10130 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53   "servername", S
10140 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d  SL_get_servernam
10150 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41  e(ssl, TLSEXT_NA
10160 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65  METYPE_host_name
10170 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
10180 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41   protocol */..LA
10190 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
101a0 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f  , objPtr, "proto
101b0 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65  col", SSL_get_ve
101c0 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b  rsion(ssl), -1);
101d0 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74  .../* Renegotiat
101e0 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09  ion allowed */..
101f0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
10200 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65  erp, objPtr, "re
10210 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f  negotiation_allo
10220 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  wed", SSL_get_se
10230 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69  cure_renegotiati
10240 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20  on_support((SSL 
10250 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47  *) ssl));.../* G
10260 65 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65  et security leve
10270 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  l */..LAPPEND_IN
10280 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
10290 2c 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65  , "security_leve
102a0 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75  l", SSL_get_secu
102b0 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29  rity_level(ssl))
102c0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69  ;.../* Session i
102d0 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  nfo */..LAPPEND_
102e0 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
102f0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65  Ptr, "session_re
10300 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69  used", SSL_sessi
10310 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b  on_reused(ssl));
10320 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20  .../* Is server 
10330 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
10340 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
10350 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72  jPtr, "is_server
10360 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72  ", SSL_is_server
10370 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20  (ssl));.../* Is 
10380 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  DTLS */..LAPPEND
10390 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
103a0 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c  jPtr, "is_dtls",
103b0 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c   SSL_is_dtls(ssl
103c0 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
103d0 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f  * Cipher info */
103e0 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53  .    cipher = SS
103f0 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69  L_get_current_ci
10400 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69  pher(ssl);.    i
10410 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c  f (cipher != NUL
10420 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42  L) {..char buf[B
10430 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69  UFSIZ] = {0};..i
10440 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74  nt bits, alg_bit
10450 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e  s;.../* Cipher n
10460 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ame */..LAPPEND_
10470 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10480 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53  tr, "cipher", SS
10490 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
104a0 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a  e(cipher), -1);.
104b0 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66  ../* RFC name of
104c0 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
104d0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
104e0 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72  objPtr, "standar
104f0 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50  d_name", SSL_CIP
10500 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d  HER_standard_nam
10510 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a  e(cipher), -1);.
10520 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d  ../* OpenSSL nam
10530 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
10540 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10550 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65  rp, objPtr, "ope
10560 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e  nssl_name", OPEN
10570 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28  SSL_cipher_name(
10580 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64  SSL_CIPHER_stand
10590 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29  ard_name(cipher)
105a0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d  ), -1);.../* num
105b0 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69  ber of secret bi
105c0 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68  ts used for ciph
105d0 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53  er */..bits = SS
105e0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74  L_CIPHER_get_bit
105f0 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62  s(cipher, &alg_b
10600 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49  its);..LAPPEND_I
10610 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
10620 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22  r, "secret_bits"
10630 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e  , bits);..LAPPEN
10640 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10650 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d  jPtr, "algorithm
10660 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73  _bits", alg_bits
10670 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20  );../* alg_bits 
10680 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65  is actual key se
10690 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73  cret bits. If us
106a0 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65  e bits and secre
106b0 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69  t (algorithm) bi
106c0 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74  ts differ,..   t
106d0 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62  he rest of the b
106e0 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69  its are fixed, i
106f0 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20  .e. for limited 
10700 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28  export ciphers (
10710 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09  bits < 56) */...
10720 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69  /* Indicates whi
10730 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f  ch SSL/TLS proto
10740 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73  col version firs
10750 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69  t defined the ci
10760 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  pher */..LAPPEND
10770 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10780 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f  Ptr, "min_versio
10790 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  n", SSL_CIPHER_g
107a0 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65  et_version(ciphe
107b0 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69  r), -1);.../* Ci
107c0 70 68 65 72 20 4e 49 44 2c 20 64 69 67 65 73 74  pher NID, digest
107d0 20 4e 49 44 20 28 6e 6f 6e 65 20 66 6f 72 20 41   NID (none for A
107e0 45 41 44 20 63 69 70 68 65 72 20 73 75 69 74 65  EAD cipher suite
107f0 73 29 2c 20 4b 65 79 20 45 78 63 68 61 6e 67 65  s), Key Exchange
10800 20 4e 49 44 2c 20 61 6e 64 20 61 75 74 68 65 6e   NID, and authen
10810 74 69 63 61 74 69 6f 6e 20 4e 49 44 20 2a 2f 0a  tication NID */.
10820 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10830 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
10840 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20  pherNID", (char 
10850 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
10860 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68  _CIPHER_get_ciph
10870 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  er_nid(cipher)),
10880 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
10890 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
108a0 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20  r, "digestNID", 
108b0 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
108c0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
108d0 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70  t_digest_nid(cip
108e0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
108f0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10900 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63   objPtr, "keyExc
10910 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72  hangeNID", (char
10920 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
10930 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f  L_CIPHER_get_kx_
10940 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
10950 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
10960 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10970 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e  "authenticationN
10980 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
10990 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
109a0 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28  ER_get_auth_nid(
109b0 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
109c0 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68  ./* message auth
109d0 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
109e0 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44  - Cipher is AEAD
109f0 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68   (e.g. GCM or Ch
10a00 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29  aCha20/Poly1305)
10a10 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41   or not */../* A
10a20 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63  uthenticated Enc
10a30 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73  ryption with ass
10a40 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45  ociated data (AE
10a50 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41  AD) check */..LA
10a60 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
10a70 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
10a80 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c  er_is_aead", SSL
10a90 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28  _CIPHER_is_aead(
10aa0 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 47  cipher));.../* G
10ab0 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69  et OpenSSL-speci
10ac0 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41  fic ID, not IANA
10ad0 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f   ID */..LAPPEND_
10ae0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10af0 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c  tr, "cipher_id",
10b00 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45   (int) SSL_CIPHE
10b10 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72 29  R_get_id(cipher)
10b20 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65  );.../* Two-byte
10b30 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65 20   ID used in the 
10b40 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20  TLS protocol of 
10b50 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65 72  the given cipher
10b60 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
10b70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10b80 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20   "protocol_id", 
10b90 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52  (int) SSL_CIPHER
10ba0 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64  _get_protocol_id
10bb0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
10bc0 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74  Textual descript
10bd0 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65  ion of the ciphe
10be0 72 2e 20 49 6e 63 6c 75 64 65 73 3a 20 63 69 70  r. Includes: cip
10bf0 68 65 72 20 6e 61 6d 65 2c 20 70 72 6f 74 6f 63  her name, protoc
10c00 6f 6c 20 76 65 72 73 69 6f 6e 2c 20 6b 65 79 0a  ol version, key.
10c10 09 20 20 20 65 78 63 68 61 6e 67 65 2c 20 61 75  .   exchange, au
10c20 74 68 65 6e 74 69 63 61 74 69 6f 6e 2c 20 73 79  thentication, sy
10c30 6d 6d 65 74 72 69 63 20 65 6e 63 72 79 70 74 69  mmetric encrypti
10c40 6f 6e 20 6d 65 74 68 6f 64 2c 20 6d 65 73 73 61  on method, messa
10c50 67 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  ge authenticatio
10c60 6e 20 63 6f 64 65 20 2a 2f 0a 09 69 66 20 28 53  n code */..if (S
10c70 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
10c80 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75  ption(cipher, bu
10c90 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
10ca0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10cb0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10cc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73  rp, objPtr, "des
10cd0 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20  cription", buf, 
10ce0 2d 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 69 67  -1);..}.../* Dig
10cf0 65 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20  est used during 
10d00 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64  the SSL/TLS hand
10d10 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67  shake when using
10d20 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a   the cipher. */.
10d30 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  .md = SSL_CIPHER
10d40 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64  _get_handshake_d
10d50 69 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09  igest(cipher);..
10d60 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10d70 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e  rp, objPtr, "han
10d80 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20  dshake_digest", 
10d90 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e  (char *)EVP_MD_n
10da0 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 20 20  ame(md), -1);.  
10db0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73    }..    /* Sess
10dc0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
10dd0 73 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65  session = SSL_ge
10de0 74 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a  t_session(ssl);.
10df0 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20      if (session 
10e00 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73  != NULL) {..cons
10e10 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10e20 2a 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74  *ticket;..size_t
10e30 20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64   len2;..unsigned
10e40 20 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73   int ulen;..cons
10e50 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
10e60 2a 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72  *session_id, *pr
10e70 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63  oto;..unsigned c
10e80 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d  har buffer[SSL_M
10e90 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45  AX_MASTER_KEY_LE
10ea0 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f  NGTH];.../* Repo
10eb0 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
10ec0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
10ed0 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e  sult of the ALPN
10ee0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
10ef0 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
10f00 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
10f10 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c  session, &proto,
10f20 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
10f30 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10f40 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
10f50 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54  har *) proto, (T
10f60 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
10f70 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20  ../* Report the 
10f80 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f  selected protoco
10f90 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  l as a result of
10fa0 20 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61   the NPN negotia
10fb0 74 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55  tion */.#ifdef U
10fc0 53 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30  SE_NPN..SSL_get0
10fd0 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f  _next_proto_nego
10fe0 74 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f  tiated(ssl, &pro
10ff0 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  to, &ulen);..LAP
11000 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11010 20 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20   objPtr, "npn", 
11020 28 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20  (char *) proto, 
11030 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
11040 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65  ;.#endif.../* Re
11050 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20  sumable session 
11060 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11070 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11080 20 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53   "resumable", SS
11090 4c 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73  L_SESSION_is_res
110a0 75 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29  umable(session))
110b0 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73  ;.../* Session s
110c0 74 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e  tart time (secon
110d0 64 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20  ds since epoch) 
110e0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
110f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11100 20 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53   "start_time", S
11110 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
11120 69 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  ime(session));..
11130 09 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75  ./* Timeout valu
11140 65 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f  e - SSL_CTX_get_
11150 74 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f  timeout (in seco
11160 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  nds) */..LAPPEND
11170 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62  _LONG(interp, ob
11180 6a 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c  jPtr, "timeout",
11190 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
111a0 5f 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e  _timeout(session
111b0 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  ));.../* Session
111c0 20 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e   id - TLSv1.2 an
111d0 64 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a  d below only */.
111e0 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53  .session_id = SS
111f0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64  L_SESSION_get_id
11200 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
11210 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
11220 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
11230 2c 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  , "session_id", 
11240 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
11250 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09  _Size) ulen);...
11260 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65  /* Session conte
11270 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69  xt */..session_i
11280 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
11290 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28  get0_id_context(
112a0 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
112b0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
112c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
112d0 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78   "session_contex
112e0 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20  t", session_id, 
112f0 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
11300 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
11310 69 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f  icket - client o
11320 6e 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  nly */..SSL_SESS
11330 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28  ION_get0_ticket(
11340 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
11350 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
11360 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
11370 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
11380 6f 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b  on_ticket", tick
11390 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
113a0 65 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  en2);.../* Sessi
113b0 6f 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69  on ticket lifeti
113c0 6d 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f  me hint (in seco
113d0 6e 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  nds) */..LAPPEND
113e0 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62  _LONG(interp, ob
113f0 6a 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22  jPtr, "lifetime"
11400 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  , SSL_SESSION_ge
11410 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d  t_ticket_lifetim
11420 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29  e_hint(session))
11430 3b 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70  ;.../* Ticket ap
11440 70 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50  p data */.#if OP
11450 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
11460 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
11470 30 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  0L..SSL_SESSION_
11480 67 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64  get0_ticket_appd
11490 61 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e  ata((SSL_SESSION
114a0 20 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69   *) session, &ti
114b0 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c  cket, &len2);..L
114c0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
114d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
114e0 69 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c  icket_app_data",
114f0 20 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69   ticket, (Tcl_Si
11500 7a 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69  ze) len2);.#endi
11510 66 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65  f.../* Get maste
11520 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d  r key */..len2 =
11530 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
11540 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73  _master_key(sess
11550 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c  ion, buffer, SSL
11560 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f  _MAX_MASTER_KEY_
11570 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e  LENGTH);..LAPPEN
11580 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
11590 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72   objPtr, "master
115a0 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28  _key", buffer, (
115b0 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
115c0 0a 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f  .../* Compressio
115d0 6e 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65  n id */..unsigne
115e0 64 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53  d int id = SSL_S
115f0 45 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72  ESSION_get_compr
11600 65 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b  ess_id(session);
11610 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11620 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11630 6f 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ompression_id", 
11640 69 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22  id == 1 ? "zlib"
11650 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
11660 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f      }..    /* Co
11670 6d 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  mpression info *
11680 2f 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  /.    if (ssl !=
11690 20 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20   NULL) {.#ifdef 
116a0 48 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53  HAVE_SSL_COMPRES
116b0 53 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50  SION..const COMP
116c0 5f 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a  _METHOD *comp, *
116d0 65 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53  expn;..comp = SS
116e0 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f  L_get_current_co
116f0 6d 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a  mpression(ssl);.
11700 09 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f  .expn = SSL_get_
11710 63 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f  current_expansio
11720 6e 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e  n(ssl);...LAPPEN
11730 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11740 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
11750 6f 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f  on", comp ? SSL_
11760 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f  COMP_get_name(co
11770 6d 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  mp) : "none", -1
11780 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11790 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
117a0 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70  "expansion", exp
117b0 6e 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  n ? SSL_COMP_get
117c0 5f 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e  _name(expn) : "n
117d0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65  one", -1);.#else
117e0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
117f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11800 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f  ompression", "no
11810 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  ne", -1);..LAPPE
11820 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11830 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f  bjPtr, "expansio
11840 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  n", "none", -1);
11850 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
11860 20 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66     /* Server inf
11870 6f 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67  o */.    {..long
11880 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f   mode = SSL_CTX_
11890 67 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68  get_session_cach
118a0 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d  e_mode(statePtr-
118b0 3e 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73  >ctx);..char *ms
118c0 67 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20  g;...if (mode & 
118d0 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f  SSL_SESS_CACHE_O
118e0 46 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d  FF) {..    msg =
118f0 20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20   "off";..} else 
11900 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
11910 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54  ESS_CACHE_CLIENT
11920 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
11930 63 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65  client";..} else
11940 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
11950 53 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45  SESS_CACHE_SERVE
11960 52 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  R) {..    msg = 
11970 22 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73  "server";..} els
11980 65 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  e if (mode & SSL
11990 5f 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48  _SESS_CACHE_BOTH
119a0 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
119b0 62 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b  both";..} else {
119c0 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b  ..    msg = "unk
119d0 6e 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45  nown";..}..LAPPE
119e0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
119f0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
11a00 63 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67  cache_mode", msg
11a10 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , -1);.    }..  
11a20 20 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a    /* CA List */.
11a30 20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20      /* IF not a 
11a40 73 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20  server, same as 
11a50 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41  SSL_get0_peer_CA
11a60 5f 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72  _list. If server
11a70 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58   same as SSL_CTX
11a80 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _get_client_CA_l
11a90 69 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50  ist */.    listP
11aa0 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
11ab0 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20  Obj(0, NULL);.  
11ac0 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f    STACK_OF(X509_
11ad0 4e 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a  NAME) *ca_list;.
11ae0 20 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74      if ((ca_list
11af0 20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e   = SSL_get_clien
11b00 74 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20  t_CA_list(ssl)) 
11b10 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72  != NULL) {..char
11b20 20 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b   buffer[BUFSIZ];
11b30 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20  ...for (int i = 
11b40 30 3b 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e  0; i < sk_X509_N
11b50 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29  AME_num(ca_list)
11b60 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35  ; i++) {..    X5
11b70 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20  09_NAME *name = 
11b80 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c  sk_X509_NAME_val
11b90 75 65 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a  ue(ca_list, i);.
11ba0 09 20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b  .    if (name) {
11bb0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65  ...X509_NAME_one
11bc0 6c 69 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65  line(name, buffe
11bd0 72 2c 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63  r, BUFSIZ);...Tc
11be0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11bf0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
11c00 69 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  istPtr, Tcl_NewS
11c10 74 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c  tringObj(buffer,
11c20 20 2d 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d   -1));..    }..}
11c30 0a 20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45  .    }.    LAPPE
11c40 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
11c50 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c  bjPtr, "caList",
11c60 20 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c   listPtr);.    L
11c70 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
11c80 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69  p, objPtr, "caLi
11c90 73 74 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30  stCount", sk_X50
11ca0 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69  9_NAME_num(ca_li
11cb0 73 74 29 29 3b 0a 0a 0a 20 20 20 20 54 63 6c 5f  st));...    Tcl_
11cc0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11cd0 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
11ce0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11cf0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
11d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
11d40 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d  . * MiscObjCmd -
11d50 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a  - misc commands.
11d60 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
11d70 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
11d80 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
11d90 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
11da0 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
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 2d  ----------------
11dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11df0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69  */.static int.Mi
11e00 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  scObjCmd(ClientD
11e10 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
11e20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11e30 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
11e40 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
11e50 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69  v[]) {.    stati
11e60 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f  c const char *co
11e70 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72  mmands [] = { "r
11e80 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e  eq", "strreq", N
11e90 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20  ULL };.    enum 
11ea0 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c  command { C_REQ,
11eb0 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d   C_STRREQ, C_DUM
11ec0 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69  MY };.    Tcl_Si
11ed0 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20  ze cmd;.    int 
11ee0 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20  isStr;.    char 
11ef0 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 20  buffer[16384];. 
11f00 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
11f10 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
11f20 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
11f30 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
11f40 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
11f50 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11f60 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e  objv, "subcomman
11f70 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74  d ?args?");..ret
11f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11f90 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c     }.    if (Tcl
11fa0 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
11fb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
11fc0 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d  , commands, "com
11fd0 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20  mand", 0, &cmd) 
11fe0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
11ff0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12000 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
12010 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
12020 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20     isStr = (cmd 
12030 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20  == C_STRREQ);.  
12040 20 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20    switch ((enum 
12050 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a  command) cmd) {.
12060 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61  .case C_REQ:..ca
12070 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09  se C_STRREQ: {..
12080 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b      EVP_PKEY *pk
12090 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35  ey=NULL;..    X5
120a0 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09  09 *cert=NULL;..
120b0 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e      X509_NAME *n
120c0 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54  ame=NULL;..    T
120d0 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a  cl_Obj **listv;.
120e0 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69  .    Tcl_Size li
120f0 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b  stc;..    int i;
12100 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d  ...    BIO *out=
12110 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72  NULL;...    char
12120 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22   *k_C="",*k_ST="
12130 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22  ",*k_L="",*k_O="
12140 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e  ",*k_OU="",*k_CN
12150 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b  ="",*k_Email="";
12160 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f  ..    char *keyo
12170 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b  ut,*pemout,*str;
12180 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a  ..    int keysiz
12190 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d  e,serial=0,days=
121a0 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53  365;..#if OPENSS
121b0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
121c0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
121d0 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20      BIGNUM *bne 
121e0 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41  = NULL;..    RSA
121f0 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65   *rsa = NULL;.#e
12200 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  lse..    EVP_PKE
12210 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  Y_CTX *ctx = NUL
12220 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20  L;.#endif...    
12230 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20  if ((objc<5) || 
12240 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63  (objc>6)) {...Tc
12250 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
12260 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
12270 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65  "keysize keyfile
12280 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f   certfile ?info?
12290 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
122a0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a  _ERROR;..    }..
122b0 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
122c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
122d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79  p, objv[2], &key
122e0 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  size) != TCL_OK)
122f0 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f   {...return TCL_
12300 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
12310 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65     keyout=Tcl_Ge
12320 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
12330 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63  ;..    pemout=Tc
12340 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12350 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69  [4]);..    if (i
12360 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65  sStr) {...Tcl_Se
12370 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f  tVar(interp,keyo
12380 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f  ut,"",0);...Tcl_
12390 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65  SetVar(interp,pe
123a0 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20  mout,"",0);..   
123b0 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a   }...    if (obj
123c0 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63  c>=6) {...if (Tc
123d0 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
123e0 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ents(interp, obj
123f0 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c  v[5], &listc, &l
12400 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  istv) != TCL_OK)
12410 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20   {...    return 
12420 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a  TCL_ERROR;...}..
12430 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29 20  ..if ((listc%2) 
12440 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63  != 0) {...    Tc
12450 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
12460 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20  rp,"Information 
12470 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20 65  list must have e
12480 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ven number of ar
12490 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a  guments",NULL);.
124a0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
124b0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f  _ERROR;...}...fo
124c0 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b  r (i=0; i<listc;
124d0 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73   i+=2) {...    s
124e0 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  tr=Tcl_GetString
124f0 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20  (listv[i]);...  
12500 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72    if (strcmp(str
12510 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09  ,"days")==0) {..
12520 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74  ..if (Tcl_GetInt
12530 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c  FromObj(interp,l
12540 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29  istv[i+1],&days)
12550 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20  !=TCL_OK)....   
12560 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12570 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  R;...    } else 
12580 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
12590 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09  serial")==0) {..
125a0 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74  ..if (Tcl_GetInt
125b0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c  FromObj(interp,l
125c0 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61  istv[i+1],&seria
125d0 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  l)!=TCL_OK).... 
125e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
125f0 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
12600 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
12610 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ,"C")==0) {....k
12620 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  _C=Tcl_GetString
12630 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
12640 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
12650 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d  trcmp(str,"ST")=
12660 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63  =0) {....k_ST=Tc
12670 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
12680 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
12690 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
126a0 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a  (str,"L")==0) {.
126b0 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74  ...k_L=Tcl_GetSt
126c0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
126d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
126e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
126f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d  ")==0) {....k_O=
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 4f 55 22 29 3d 3d 30 29  mp(str,"OU")==0)
12740 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47   {....k_OU=Tcl_G
12750 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
12760 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
12770 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
12780 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09  r,"CN")==0) {...
12790 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72  .k_CN=Tcl_GetStr
127a0 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
127b0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
127c0 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d   (strcmp(str,"Em
127d0 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  ail")==0) {....k
127e0 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74  _Email=Tcl_GetSt
127f0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
12800 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;...    } else {
12810 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  ....Tcl_SetResul
12820 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77  t(interp,"Unknow
12830 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c  n parameter",NUL
12840 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43  L);....return TC
12850 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
12860 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66  ...}..    }..#if
12870 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
12880 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
12890 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d  0000L..    bne =
128a0 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20   BN_new();..    
128b0 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b  rsa = RSA_new();
128c0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50  ..    pkey = EVP
128d0 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20  _PKEY_new();..  
128e0 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c    if (bne == NUL
128f0 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c  L || rsa == NULL
12900 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c   || pkey == NULL
12910 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64   || !BN_set_word
12920 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a  (bne,RSA_F4) ||.
12930 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f  ..!RSA_generate_
12940 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73  key_ex(rsa, keys
12950 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20  ize, bne, NULL) 
12960 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73  || !EVP_PKEY_ass
12970 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73  ign_RSA(pkey, rs
12980 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59  a)) {...EVP_PKEY
12990 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f  _free(pkey);.../
129a0 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b  * RSA_free(rsa);
129b0 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b   freed by EVP_PK
129c0 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f  EY_free */...BN_
129d0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65  free(bne);.#else
129e0 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50  ..    pkey = EVP
129f0 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e  _RSA_gen((unsign
12a00 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29  ed int) keysize)
12a10 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50  ;..    ctx = EVP
12a20 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b  _PKEY_CTX_new(pk
12a30 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69  ey,NULL);..    i
12a40 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  f (pkey == NULL 
12a50 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c  || ctx == NULL |
12a60 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
12a70 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a  en_init(ctx) ||.
12a80 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ..!EVP_PKEY_CTX_
12a90 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62  set_rsa_keygen_b
12aa0 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65  its(ctx, keysize
12ab0 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b  ) || !EVP_PKEY_k
12ac0 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79  eygen(ctx, &pkey
12ad0 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
12ae0 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56  free(pkey);...EV
12af0 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28  P_PKEY_CTX_free(
12b00 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54  ctx);.#endif...T
12b10 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
12b20 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
12b30 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65  ating private ke
12b40 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75  y",NULL);...retu
12b50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
12b60 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66     } else {...if
12b70 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20   (isStr) {...   
12b80 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
12b90 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20  _s_mem());...   
12ba0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
12bb0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
12bc0 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
12bd0 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
12be0 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c   i=BIO_read(out,
12bf0 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75  buffer,sizeof(bu
12c00 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20  ffer)-1);...    
12c10 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b  i=(i<0) ? 0 : i;
12c20 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d  ...    buffer[i]
12c30 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c  ='\0';...    Tcl
12c40 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b  _SetVar(interp,k
12c50 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b  eyout,buffer,0);
12c60 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68  ...    BIO_flush
12c70 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  (out);...    BIO
12c80 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20  _free(out);...} 
12c90 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74  else {...    out
12ca0 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66  =BIO_new(BIO_s_f
12cb0 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49  ile());...    BI
12cc0 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65  O_write_filename
12cd0 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09  (out,keyout);...
12ce0 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
12cf0 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  o_PrivateKey(out
12d00 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c  ,pkey,NULL,NULL,
12d10 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09  0,NULL,NULL);...
12d20 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65      /* PEM_write
12d30 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b  _bio_RSAPrivateK
12d40 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c  ey(out, rsa, NUL
12d50 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c  L, NULL, 0, NULL
12d60 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20  , NULL); */...  
12d70 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
12d80 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20  ut);.. .}....if 
12d90 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28  ((cert=X509_new(
12da0 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20  ))==NULL) {...  
12db0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
12dc0 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65  interp,"Error ge
12dd0 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69  nerating certifi
12de0 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55  cate request",NU
12df0 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  LL);...    EVP_P
12e00 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
12e10 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
12e20 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
12e30 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
12e40 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
12e50 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e  dif...    return
12e60 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 09 09 7d  (TCL_ERROR);...}
12e70 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72  ....X509_set_ver
12e80 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09  sion(cert,2);...
12e90 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74  ASN1_INTEGER_set
12ea0 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c  (X509_get_serial
12eb0 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72  Number(cert),ser
12ec0 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74  ial);...X509_gmt
12ed0 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
12ee0 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74  m_notBefore(cert
12ef0 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74  ),0);...X509_gmt
12f00 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74  ime_adj(X509_get
12f10 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29  m_notAfter(cert)
12f20 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a  ,(long)60*60*24*
12f30 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65  days);...X509_se
12f40 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b  t_pubkey(cert,pk
12f50 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30  ey);....name=X50
12f60 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61  9_get_subject_na
12f70 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30  me(cert);....X50
12f80 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12f90 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22  _by_txt(name,"C"
12fa0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
12fb0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
12fc0 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c  char *) k_C, -1,
12fd0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
12fe0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
12ff0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c  y_txt(name,"ST",
13000 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
13010 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13020 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c  har *) k_ST, -1,
13030 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
13040 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
13050 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20  y_txt(name,"L", 
13060 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
13070 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
13080 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d  ar *) k_L, -1, -
13090 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41  1, 0);...X509_NA
130a0 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f  ME_add_entry_by_
130b0 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42  txt(name,"O", MB
130c0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
130d0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
130e0 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c   *) k_O, -1, -1,
130f0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
13100 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
13110 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53  t(name,"OU", MBS
13120 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13130 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13140 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c  *) k_OU, -1, -1,
13150 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
13160 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
13170 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53  t(name,"CN", MBS
13180 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13190 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
131a0 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c  *) k_CN, -1, -1,
131b0 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45   0);...X509_NAME
131c0 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78  _add_entry_by_tx
131d0 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20  t(name,"Email", 
131e0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
131f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
13200 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d  ar *) k_Email, -
13210 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35  1, -1, 0);....X5
13220 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_set_subject_n
13230 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a  ame(cert,name);.
13240 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67  ...if (!X509_sig
13250 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f  n(cert,pkey,EVP_
13260 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20  sha256())) {... 
13270 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72     X509_free(cer
13280 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b  t);...    EVP_PK
13290 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
132a0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
132b0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
132c0 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e  000000L...    BN
132d0 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64  _free(bne);.#end
132e0 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  if...    Tcl_Set
132f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
13300 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72  rror signing cer
13310 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b  tificate",NULL);
13320 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
13330 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
13340 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
13350 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
13360 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
13370 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
13380 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b  _X509(out,cert);
13390 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
133a0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
133b0 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
133c0 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
133d0 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
133e0 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
133f0 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
13400 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66  terp,pemout,buff
13410 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
13420 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
13430 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
13440 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
13450 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
13460 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
13470 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
13480 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75  lename(out,pemou
13490 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
134a0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
134b0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49  ,cert);...    BI
134c0 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b  O_free_all(out);
134d0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65  ...}....X509_fre
134e0 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50  e(cert);...EVP_P
134f0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
13500 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
13510 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
13520 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72  0000000L...BN_fr
13530 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
13540 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b  .    }..}..break
13550 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
13560 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
13570 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13580 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e  *********/./* In
135a0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  it             *
135b0 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
135c0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
135d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
135f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13610 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
13620 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
13630 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
13640 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
13650 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
13660 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
13670 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
13680 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
13690 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
136a0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
136b0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
136c0 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
136d0 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
136e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13720 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
13730 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50  ree(char *blockP
13740 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  tr) {.    State 
13750 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
13760 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a  te *)blockPtr;..
13770 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
13780 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  led");..    Tls_
13790 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
137a0 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63  .    ckfree(bloc
137b0 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  kPtr);.}.../*. *
137c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13800 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c  ---. *. * Tls_Cl
13810 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ean --. *. *.Thi
13820 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
13830 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
13840 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
13850 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
13860 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
13870 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
13880 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20   below 1.  This 
13890 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c  should. *.be cal
138a0 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  led synchronousl
138b0 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72  y by the ClosePr
138c0 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20  oc, not in the. 
138d0 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  *.EventuallyFree
138e0 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
138f0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
13900 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
13910 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
13920 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
13930 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13970 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54  -----. */.void T
13980 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a  ls_Clean(State *
13990 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
139a0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
139b0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
139c0 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
139d0 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65   here that we're
139e0 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
139f0 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
13a00 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
13a10 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
13a20 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
13a30 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
13a40 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
13a50 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
13a60 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
13a70 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
13a80 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
13a90 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65   {..ckfree(state
13aa0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73  Ptr->protos);..s
13ab0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
13ac0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
13ad0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
13ae0 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20  bio) {../* This 
13af0 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68  will call SSL_sh
13b00 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34  utdown. Bug 1414
13b10 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  045 */..dprintf(
13b20 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70  "BIO_free_all(%p
13b30 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69  )", statePtr->bi
13b40 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c  o);..BIO_free_al
13b50 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  l(statePtr->bio)
13b60 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ;..statePtr->bio
13b70 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
13b80 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
13b90 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66  >ssl) {..dprintf
13ba0 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c  ("SSL_free(%p)",
13bb0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b   statePtr->ssl);
13bc0 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65  ..SSL_free(state
13bd0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74  Ptr->ssl);..stat
13be0 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c  ePtr->ssl = NULL
13bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
13c00 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b  statePtr->ctx) {
13c10 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73  ..SSL_CTX_free(s
13c20 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
13c30 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
13c40 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
13c50 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
13c60 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44  llback) {..Tcl_D
13c70 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
13c80 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
13c90 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  ..statePtr->call
13ca0 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  back = NULL;.   
13cb0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
13cc0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b  Ptr->password) {
13cd0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
13ce0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
13cf0 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74  sword);..statePt
13d00 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55  r->password = NU
13d10 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
13d20 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
13d30 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
13d40 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
13d50 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72  vcmd);..statePtr
13d60 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  ->vcmd = NULL;. 
13d70 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
13d80 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  f("Returning");.
13d90 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  }...#if TCL_MAJO
13da0 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64  R_VERSION > 8.#d
13db0 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f  efine MIN_VERSIO
13dc0 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64  N "9.0".#else.#d
13dd0 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f  efine MIN_VERSIO
13de0 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a  N "8.5".#endif..
13df0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
13e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e30 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
13e40 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a  ls_Init --. *. *
13e50 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61  .This is a packa
13e60 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ge initializatio
13e70 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69  n procedure, whi
13e80 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09  ch is called. *.
13e90 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69 73  by Tcl when this
13ea0 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62   package is to b
13eb0 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e  e added to an in
13ec0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a  terpreter.. *. *
13ed0 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20 63   Results:  Ssl c
13ee0 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c 6f  onfigured and lo
13ef0 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20  aded. *. * Side 
13f00 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72 65  effects:. *. cre
13f10 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d  ate the ssl comm
13f20 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20  and, initialize 
13f30 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20  ssl context. *. 
13f40 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f80 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f  ----. */.DLLEXPO
13f90 52 54 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28  RT int Tls_Init(
13fa0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13fb0 72 70 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  rp) {.    const 
13fc0 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53  char tlsTclInitS
13fd0 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63  cript[] = {.#inc
13fe0 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22  lude "tls.tcl.h"
13ff0 0a 09 30 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20  ..0x00.    };.. 
14000 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14010 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55 53  ed");..#ifdef US
14020 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20  E_TCL_STUBS.    
14030 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62  if (Tcl_InitStub
14040 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45  s(interp, MIN_VE
14050 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c  RSION, 0) == NUL
14060 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
14070 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65  _ERROR;.    }.#e
14080 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63 6c  ndif.    if (Tcl
14090 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74 65  _PkgRequire(inte
140a0 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56  rp, "Tcl", MIN_V
140b0 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
140c0 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
140d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
140e0 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e      if (TlsLibIn
140f0 69 74 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  it(0) != TCL_OK)
14100 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
14110 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
14120 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
14130 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
14140 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
14150 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
14160 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
14170 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14180 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
14190 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43  ::connection", C
141a0 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
141b0 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
141c0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
141d0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
141e0 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
141f0 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
14200 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64  terp, "tls::hand
14210 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b  shake", Handshak
14220 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  eObjCmd, (Client
14230 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
14240 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
14250 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
14260 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
14270 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
14280 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f  import", ImportO
14290 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
142a0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
142b0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
142c0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
142d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
142e0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 69  interp, "tls::mi
142f0 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c  sc", MiscObjCmd,
14300 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
14310 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
14320 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
14330 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14340 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14350 2c 20 22 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74  , "tls::unimport
14360 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
14370 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
14380 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
14390 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
143a0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
143b0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
143c0 72 70 2c 20 22 74 6c 73 3a 3a 73 74 61 74 75 73  rp, "tls::status
143d0 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c  ", StatusObjCmd,
143e0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
143f0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
14400 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
14410 0a 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74  ..    Tls_Digest
14420 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29  Commands(interp)
14430 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63 72 79 70  ;.    Tls_Encryp
14440 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70  tCommands(interp
14450 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f 43  );.    Tls_InfoC
14460 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b  ommands(interp);
14470 0a 20 20 20 20 54 6c 73 5f 4b 44 46 43 6f 6d 6d  .    Tls_KDFComm
14480 61 6e 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20  ands(interp);.  
14490 20 20 54 6c 73 5f 52 61 6e 64 43 6f 6d 6d 61 6e    Tls_RandComman
144a0 64 73 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20  ds(interp);..   
144b0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09   if (interp) {..
144c0 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
144d0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
144e0 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  t);.    }..    r
144f0 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f  eturn Tcl_PkgPro
14500 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43  vide(interp, PAC
14510 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41  KAGE_NAME, PACKA
14520 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a  GE_VERSION);.}..
14530 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
14540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
14570 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
14580 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
14590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74  ---------*. *.St
145c0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
145d0 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
145e0 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
145f0 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
14600 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
14610 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
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 2d 2d 2d 2d 2a 0a  --------------*.
14650 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
14660 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
14670 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
14680 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
14690 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
146a0 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
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 2d  ----------------
146e0 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
146f0 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
14700 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
14710 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
14720 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
14730 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e     return(Tls_In
14740 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a  it(interp));.}..
14750 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
14790 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
147a0 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
147b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147d0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
147e0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
147f0 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
14800 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
14810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
14840 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
14850 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
14860 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
14870 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
14880 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
14890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
148d0 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
148e0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
148f0 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
14900 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
14910 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
14920 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
14930 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
14940 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
14950 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
14960 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
14970 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
14980 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
14990 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
149a0 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
149b0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
149c0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
149d0 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
149e0 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
149f0 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
14a00 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
14a10 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
14a20 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65  alize");..#if de
14a30 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
14a40 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
14a50 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
14a60 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
14a70 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c  nit_mx);...if (l
14a80 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65  ocks) {..    fre
14a90 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c  e(locks);..    l
14aa0 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ocks = NULL;..  
14ab0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30    locksCount = 0
14ac0 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69  ;..}.#endif..ini
14ad0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23  tialized = 0;..#
14ae0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
14af0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14b00 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14b10 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
14b20 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
14b30 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
14b40 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a  TCL_OK);.    }..
14b50 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69      if (initiali
14b60 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  zed) {..dprintf(
14b70 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69  "Called, but usi
14b80 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22  ng cached value"
14b90 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  );..return(statu
14ba0 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  s);.    }..    d
14bb0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
14bc0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
14bd0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
14be0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
14bf0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
14c00 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
14c10 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
14c20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
14c30 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
14c40 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
14c50 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
14c60 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
14c70 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
14c80 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
14c90 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
14ca0 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
14cb0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
14cc0 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
14cd0 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
14ce0 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
14cf0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
14d00 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
14d10 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
14d20 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
14d30 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
14d40 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
14d50 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
14d60 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
14d70 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
14d80 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
14d90 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
14da0 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
14db0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
14dc0 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
14dd0 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
14de0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
14df0 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
14e00 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
14e10 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
14e20 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
14e30 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
14e40 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
14e50 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
14e60 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
14e70 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
14e80 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
14e90 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
14ea0 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
14eb0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
14ec0 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
14ed0 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
14ee0 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
14ef0 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
14f00 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
14f10 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
14f20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
14f30 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
14f40 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
14f50 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
14f60 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
14f70 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
14f80 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
14f90 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
14fa0 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
14fb0 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
14fc0 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
14fd0 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
14fe0 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
14ff0 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
15000 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
15010 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
15020 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
15030 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
15040 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
15050 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
15060 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
15070 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
15080 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
15090 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
150a0 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
150b0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
150c0 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
150d0 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
150e0 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
150f0 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
15100 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
15110 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
15120 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
15130 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
15140 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
15150 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
15160 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
15170 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15180 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15190 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
151a0 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65 78 55 6e  .    Tcl_MutexUn
151b0 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
151c0 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
151d0 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a        rn(status);.}.