Hex Artifact Content

Artifact 5f4251e5e6447c29c431055fedbec66647bab9bf075b5ae97c5c91b6c5fa5044:


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 64 69  _len, char *CAdi
0610: 72 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c  r, char *CAfile,
0620: 0a 09 09 63 68 61 72 20 2a 63 69 70 68 65 72 73  ...char *ciphers
0630: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
0640: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
0650: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
0660: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 09 54 6c  ;..static int.Tl
0670: 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69  sLibInit(int uni
0680: 6e 69 74 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65  nitialize);..#de
0690: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
06a0: 53 4c 32 09 09 30 78 30 31 0a 23 64 65 66 69 6e  SL2..0x01.#defin
06b0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
06c0: 09 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 54  ..0x02.#define T
06d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30  LS_PROTO_TLS1..0
06e0: 78 30 34 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x04.#define TLS_
06f0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30  PROTO_TLS1_1.0x0
0700: 38 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  8.#define TLS_PR
0710: 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a  OTO_TLS1_2.0x10.
0720: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0730: 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30 0a 23 64  O_TLS1_3.0x20.#d
0740: 65 66 69 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c  efine ENABLED(fl
0750: 61 67 2c 20 6d 61 73 6b 29 09 28 28 28 66 6c 61  ag, mask).(((fla
0760: 67 29 20 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20  g) & (mask)) == 
0770: 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65  (mask))..#define
0780: 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09   SSLKEYLOGFILE..
0790: 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a  "SSLKEYLOGFILE".
07a0: 0a 2f 2a 0a 20 2a 20 53 74 61 74 69 63 20 64 61  ./*. * Static da
07b0: 74 61 20 73 74 72 75 63 74 75 72 65 73 0a 20 2a  ta structures. *
07c0: 2f 0a 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  /..#ifndef OPENS
07d0: 53 4c 5f 4e 4f 5f 44 48 0a 23 69 6e 63 6c 75 64  SL_NO_DH.#includ
07e0: 65 20 22 64 68 5f 70 61 72 61 6d 73 2e 68 22 0a  e "dh_params.h".
07f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 20 54 68  #endif../*. * Th
0800: 72 65 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f  read-Safe TLS Co
0810: 64 65 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54  de. */..#ifdef T
0820: 43 4c 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69  CL_THREADS.#defi
0830: 6e 65 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ne OPENSSL_THREA
0840: 44 5f 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75  D_DEFINES.#inclu
0850: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e  de <openssl/open
0860: 73 73 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64  sslconf.h>..#ifd
0870: 65 66 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ef OPENSSL_THREA
0880: 44 53 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  DS.#include <ope
0890: 6e 73 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23  nssl/crypto.h>.#
08a0: 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c  include <openssl
08b0: 2f 73 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54  /ssl.h>../*. * T
08c0: 68 72 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f  hreaded operatio
08d0: 6e 20 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69  n requires locki
08e0: 6e 67 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20  ng callbacks. * 
08f0: 42 61 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70  Based from /cryp
0900: 74 6f 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66  to/cryptlib.c of
0910: 20 4f 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f   OpenSSL and NSO
0920: 70 65 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61  penSSL.. */..sta
0930: 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c  tic Tcl_Mutex *l
0940: 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61  ocks = NULL;.sta
0950: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75  tic int locksCou
0960: 6e 74 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54  nt = 0;.static T
0970: 63 6c 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78  cl_Mutex init_mx
0980: 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e  ;.#endif /* OPEN
0990: 53 53 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23  SSL_THREADS */.#
09a0: 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52  endif /* TCL_THR
09b0: 45 41 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a  EADS */..../****
09c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
09d0: 2f 0a 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20  /./* Callbacks  
09e0: 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
09f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0a00: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0a50: 45 76 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f  Eval Callback Co
0a60: 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45  mmand --. *. *.E
0a70: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
0a80: 6d 61 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61  mand and catch a
0a90: 6e 79 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20  ny errors. *. * 
0aa0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20  Results:. *.0 = 
0ab0: 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64  Command returned
0ac0: 20 66 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65   fail or eval re
0ad0: 74 75 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52  turned TCL_ERROR
0ae0: 0a 20 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20  . *.1 = Command 
0af0: 72 65 74 75 72 6e 65 64 20 73 75 63 63 65 73 73  returned success
0b00: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65   or eval returne
0b10: 64 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53  d TCL_OK. *. * S
0b20: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
0b30: 45 76 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61  Evaluates callba
0b40: 63 6b 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  ck command. *. *
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b90: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
0ba0: 6e 74 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28  nt.EvalCallback(
0bb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0bc0: 72 70 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65  rp, State *state
0bd0: 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  Ptr, Tcl_Obj *cm
0be0: 64 50 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20  dPtr) {.    int 
0bf0: 63 6f 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20  code, ok = 0;.. 
0c00: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
0c10: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74  (ClientData) int
0c20: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72  erp);.    Tcl_Pr
0c30: 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61  eserve((ClientDa
0c40: 74 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a  ta) statePtr);..
0c50: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
0c60: 62 61 63 6b 20 77 69 74 68 20 73 75 63 63 65 73  back with succes
0c70: 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72 65 74 75  s for ok or retu
0c80: 72 6e 20 76 61 6c 75 65 20 31 2c 20 66 61 69 6c  rn value 1, fail
0c90: 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 72 65   for error or re
0ca0: 74 75 72 6e 20 76 61 6c 75 65 20 30 20 2a 2f 0a  turn value 0 */.
0cb0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0cc0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0cd0: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
0ce0: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
0cf0: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
0d00: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
0d10: 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20  code == TCL_OK) 
0d20: 7b 0a 09 2f 2a 20 43 68 65 63 6b 20 72 65 73 75  {../* Check resu
0d30: 6c 74 20 66 6f 72 20 72 65 74 75 72 6e 20 76 61  lt for return va
0d40: 6c 75 65 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20  lue */..Tcl_Obj 
0d50: 2a 72 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  *result = Tcl_Ge
0d60: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
0d70: 70 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20  p);..if (result 
0d80: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47  == NULL || Tcl_G
0d90: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
0da0: 65 72 70 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b  erp, result, &ok
0db0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
0dc0: 20 20 20 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 20      ok = 1;..}. 
0dd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
0de0: 45 72 72 6f 72 20 2d 20 72 65 6a 65 63 74 20 74  Error - reject t
0df0: 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  he certificate *
0e00: 2f 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  /.#if (TCL_MAJOR
0e10: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
0e20: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
0e30: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
0e40: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
0e50: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
0e60: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
0e70: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
0e80: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
0e90: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65   }..    Tcl_Rele
0ea0: 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  ase((ClientData)
0eb0: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20   statePtr);.    
0ec0: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
0ed0: 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29  entData) interp)
0ee0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ;.    return ok;
0ef0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
0f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a  -------------. *
0f40: 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  . * InfoCallback
0f50: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
0f60: 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74 69 6f  rs SSL connectio
0f70: 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20 2a 20  n process. *. * 
0f80: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
0f90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
0fa0: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
0fb0: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
0fc0: 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ed). *. *-------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f  ------------. */
1010: 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 66  .static void.Inf
1020: 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20  oCallback(const 
1030: 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 77 68  SSL *ssl, int wh
1040: 65 72 65 2c 20 69 6e 74 20 72 65 74 29 20 7b 0a  ere, int ret) {.
1050: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
1060: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53  Ptr = (State*)SS
1070: 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28  L_get_app_data((
1080: 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20  SSL *)ssl);.    
1090: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
10b0: 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f  nterp;.    Tcl_O
10c0: 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20  bj *cmdPtr;.    
10d0: 63 68 61 72 20 2a 6d 61 6a 6f 72 3b 20 63 68 61  char *major; cha
10e0: 72 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20 20 20 64  r *minor;..    d
10f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
1100: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
1110: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d  Ptr->callback ==
1120: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
1130: 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 69  ..return;..    i
1140: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
1150: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
1160: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
1170: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
1180: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
1190: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
11a0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
11b0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
11c0: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
11d0: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
11e0: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
11f0: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1200: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
1210: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
1220: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1230: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
1240: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
1250: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1260: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
1270: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
1280: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
1290: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
12a0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
12b0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
12c0: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
12d0: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
12e0: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
12f0: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
1300: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1310: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
1320: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
1330: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1340: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
1350: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
1360: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
1370: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
1380: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
1390: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
13a0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
13b0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
13c0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
13d0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
13e0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
13f0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1400: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
1410: 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20  ringObj("info", 
1420: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1430: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1440: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1450: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1460: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
1470: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1480: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1490: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
14a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
14c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14d0: 28 6d 61 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20  (major, -1));.  
14e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
14f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1500: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1510: 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f  ewStringObj(mino
1520: 72 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66  r, -1));..    if
1530: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42   (where & SSL_CB
1540: 5f 41 4c 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c  _ALERT) {..Tcl_L
1550: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1560: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1570: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
1580: 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c  StringObj(SSL_al
1590: 65 72 74 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f  ert_desc_string_
15a0: 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b  long(ret), -1));
15b0: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
15c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
15d0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
15e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
15f0: 28 53 53 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f  (SSL_alert_type_
1600: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1610: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c  , -1));.    } el
1620: 73 65 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  se {..Tcl_ListOb
1630: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1640: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1650: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1660: 67 4f 62 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73  gObj(SSL_state_s
1670: 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c  tring_long(ssl),
1680: 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74   -1));..Tcl_List
1690: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
16a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
16b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16c0: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a  j("info", -1));.
16d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76      }..    /* Ev
16e0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
16f0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
1700: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
1710: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
1720: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
1730: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
1740: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
1750: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
1760: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
1770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
17b0: 2a 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63  * MessageCallbac
17c0: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74  k --. *. *.Monit
17d0: 6f 72 73 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c  ors SSL protocol
17e0: 20 6d 65 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20   messages. *. * 
17f0: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
1800: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1810: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
1820: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
1830: 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ed). *. *-------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
1880: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
1890: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74  _NO_SSL_TRACE.st
18a0: 61 74 69 63 20 76 6f 69 64 0a 4d 65 73 73 61 67  atic void.Messag
18b0: 65 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72  eCallback(int wr
18c0: 69 74 65 5f 70 2c 20 69 6e 74 20 76 65 72 73 69  ite_p, int versi
18d0: 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f  on, int content_
18e0: 74 79 70 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64  type, const void
18f0: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65   *buf, size_t le
1900: 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69  n, SSL *ssl, voi
1910: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
1920: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
1930: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
1940: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1950: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
1960: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
1970: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
1980: 20 63 68 61 72 20 2a 76 65 72 2c 20 2a 74 79 70   char *ver, *typ
1990: 65 3b 0a 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b  e;.    BIO *bio;
19a0: 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72  .    char buffer
19b0: 5b 31 35 30 30 30 5d 3b 0a 20 20 20 20 62 75 66  [15000];.    buf
19c0: 66 65 72 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20  fer[0] = 0;..   
19d0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
19e0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
19f0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
1a00: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
1a10: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
1a20: 20 73 77 69 74 63 68 28 76 65 72 73 69 6f 6e 29   switch(version)
1a30: 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56   {.#if OPENSSL_V
1a40: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
1a50: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
1a60: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
1a70: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
1a80: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
1a90: 20 20 63 61 73 65 20 53 53 4c 32 5f 56 45 52 53    case SSL2_VERS
1aa0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c  ION:..ver = "SSL
1ab0: 76 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  v2";..break;.#en
1ac0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
1ad0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
1ae0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
1af0: 5f 53 53 4c 33 29 0a 20 20 20 20 63 61 73 65 20  _SSL3).    case 
1b00: 53 53 4c 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  SSL3_VERSION:..v
1b10: 65 72 20 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62  er = "SSLv3";..b
1b20: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  reak;.#endif.   
1b30: 20 63 61 73 65 20 54 4c 53 31 5f 56 45 52 53 49   case TLS1_VERSI
1b40: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1b50: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1b60: 63 61 73 65 20 54 4c 53 31 5f 31 5f 56 45 52 53  case TLS1_1_VERS
1b70: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1b80: 76 31 2e 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.1";..break;. 
1b90: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 32 5f 56     case TLS1_2_V
1ba0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1bb0: 54 4c 53 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b  TLSv1.2";..break
1bc0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 31 5f  ;.    case TLS1_
1bd0: 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  3_VERSION:..ver 
1be0: 3d 20 22 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72  = "TLSv1.3";..br
1bf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 30 3a  eak;.    case 0:
1c00: 0a 09 76 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a  ..ver = "none";.
1c10: 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
1c20: 75 6c 74 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b  ult:..ver = "unk
1c30: 6e 6f 77 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  nown";..break;. 
1c40: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
1c50: 20 28 63 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20   (content_type) 
1c60: 7b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  {.    case SSL3_
1c70: 52 54 5f 48 45 41 44 45 52 3a 0a 09 74 79 70 65  RT_HEADER:..type
1c80: 20 3d 20 22 48 65 61 64 65 72 22 3b 0a 09 62 72   = "Header";..br
1c90: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53  eak;.    case SS
1ca0: 4c 33 5f 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54  L3_RT_INNER_CONT
1cb0: 45 4e 54 5f 54 59 50 45 3a 0a 09 74 79 70 65 20  ENT_TYPE:..type 
1cc0: 3d 20 22 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74  = "Inner Content
1cd0: 20 54 79 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a   Type";..break;.
1ce0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1cf0: 5f 43 48 41 4e 47 45 5f 43 49 50 48 45 52 5f 53  _CHANGE_CIPHER_S
1d00: 50 45 43 3a 0a 09 74 79 70 65 20 3d 20 22 43 68  PEC:..type = "Ch
1d10: 61 6e 67 65 20 43 69 70 68 65 72 22 3b 0a 09 62  ange Cipher";..b
1d20: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
1d30: 53 4c 33 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74  SL3_RT_ALERT:..t
1d40: 79 70 65 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09  ype = "Alert";..
1d50: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1d60: 53 53 4c 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b  SSL3_RT_HANDSHAK
1d70: 45 3a 0a 09 74 79 70 65 20 3d 20 22 48 61 6e 64  E:..type = "Hand
1d80: 73 68 61 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a  shake";..break;.
1d90: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1da0: 5f 41 50 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54  _APPLICATION_DAT
1db0: 41 3a 0a 09 74 79 70 65 20 3d 20 22 41 70 70 20  A:..type = "App 
1dc0: 44 61 74 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  Data";..break;. 
1dd0: 20 20 20 63 61 73 65 20 44 54 4c 53 31 5f 52 54     case DTLS1_RT
1de0: 5f 48 45 41 52 54 42 45 41 54 3a 0a 09 74 79 70  _HEARTBEAT:..typ
1df0: 65 20 3d 20 22 48 65 61 72 74 62 65 61 74 22 3b  e = "Heartbeat";
1e00: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ..break;.    def
1e10: 61 75 6c 74 3a 0a 09 74 79 70 65 20 3d 20 22 75  ault:..type = "u
1e20: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a  nknown";.    }..
1e30: 20 20 20 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d      /* Needs com
1e40: 70 69 6c 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e  pile time option
1e50: 20 22 65 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61   "enable-ssl-tra
1e60: 63 65 22 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  ce". */.    if (
1e70: 28 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42  (bio = BIO_new(B
1e80: 49 4f 5f 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20  IO_s_mem())) != 
1e90: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a  NULL) {..int n;.
1ea0: 09 53 53 4c 5f 74 72 61 63 65 28 77 72 69 74 65  .SSL_trace(write
1eb0: 5f 70 2c 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e  _p, version, con
1ec0: 74 65 6e 74 5f 74 79 70 65 2c 20 62 75 66 2c 20  tent_type, buf, 
1ed0: 6c 65 6e 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20  len, ssl, (void 
1ee0: 2a 29 62 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f  *)bio);..n = BIO
1ef0: 5f 72 65 61 64 28 62 69 6f 2c 20 62 75 66 66 65  _read(bio, buffe
1f00: 72 2c 20 6d 69 6e 28 42 49 4f 5f 70 65 6e 64 69  r, min(BIO_pendi
1f10: 6e 67 28 62 69 6f 29 2c 20 31 34 39 39 39 29 29  ng(bio), 14999))
1f20: 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20 30  ;..n = (n<0) ? 0
1f30: 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e 5d   : n;..buffer[n]
1f40: 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49 4f   = 0;..(void)BIO
1f50: 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42 49  _flush(bio);..BI
1f60: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20 20  O_free(bio);.   
1f70: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
1f80: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
1f90: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1fa0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1fb0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1fc0: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1fd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1fe0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1ff0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2000: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
2010: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2020: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2030: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2040: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
2050: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2060: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2070: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2080: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2090: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
20a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
20b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
20c0: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
20d0: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
20e0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
20f0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2100: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2110: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2120: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2130: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2140: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2150: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
2160: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
2170: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
2180: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2190: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
21a0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
21b0: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
21c0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
21d0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
21e0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
21f0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2200: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2210: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2220: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2230: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2240: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
2250: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
22b0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
22c0: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
22d0: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
22e0: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
22f0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2300: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2310: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2320: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2330: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
2340: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
2350: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
2360: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
2370: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
2380: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
2390: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
23a0: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
23b0: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
23c0: 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61 69  certificate chai
23d0: 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74 61  n is checked sta
23e0: 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20 64  rting with the d
23f0: 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20 6c  eepest nesting l
2400: 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20 72  evel. *.  (the r
2410: 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63 61  oot CA certifica
2420: 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20 75  te) and worked u
2430: 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65 65  pward to the pee
2440: 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65 2e  r's certificate.
2450: 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75 72  . *.All signatur
2460: 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63 75  es are valid, cu
2470: 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77 69  rrent time is wi
2480: 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20 6c  thin first and l
2490: 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69 6d  ast validity tim
24a0: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61 74  e.. *.Check that
24b0: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
24c0: 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74 68   is issued by th
24d0: 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66 69  e issuer certifi
24e0: 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a 09  cate issuer.. *.
24f0: 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63 61  Check the revoca
2500: 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72 20  tion status for 
2510: 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74 65  each certificate
2520: 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 76  .. *.Check the v
2530: 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20 67  alidity of the g
2540: 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68 65  iven CRL and the
2550: 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f 6e   cert revocation
2560: 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65 63   status.. *.Chec
2570: 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20 6f  k the policies o
2580: 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69 66  f all the certif
2590: 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72 67  icates. *. * Arg
25a0: 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f 6f  s. *.preverify_o
25b0: 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65 74  k indicates whet
25c0: 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69 63  her the certific
25d0: 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ate verification
25e0: 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20 6e   passed (1) or n
25f0: 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65 73  ot (0). *. * Res
2600: 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c 62  ults:. *.A callb
2610: 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68 65  ack bound to the
2620: 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74 75   socket may retu
2630: 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20 20  rn one of:. *.  
2640: 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72 74    0...- the cert
2650: 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d 65  ificate is deeme
2660: 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64 20  d invalid, send 
2670: 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a 09  verification. *.
2680: 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c 65  ...  failure ale
2690: 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64 20  rt to peer, and 
26a0: 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73 68  terminate handsh
26b0: 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09 09  ake.. *.    1...
26c0: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
26d0: 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c 69  e is deemed vali
26e0: 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68  d, continue with
26f0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20   handshake.. *. 
2700: 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67 09     empty string.
2710: 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20 63  - no change to c
2720: 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64  ertificate valid
2730: 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64 65  ation. *. * Side
2740: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2750: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2760: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2770: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2780: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2790: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
27a0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
27b0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
27c0: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
2810: 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66 79  tatic int.Verify
2820: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b 2c  Callback(int ok,
2830: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 20   X509_STORE_CTX 
2840: 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c 5f  *ctx) {.    Tcl_
2850: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
2860: 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20 28   SSL   *ssl..= (
2870: 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45 5f  SSL*)X509_STORE_
2880: 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61 28  CTX_get_ex_data(
2890: 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78 5f  ctx, SSL_get_ex_
28a0: 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45 5f  data_X509_STORE_
28b0: 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20 20  CTX_idx());.    
28c0: 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20 58  X509  *cert..= X
28d0: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
28e0: 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28 63  t_current_cert(c
28f0: 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20 2a  tx);.    State *
2900: 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61 74  statePtr.= (Stat
2910: 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64  e*)SSL_get_app_d
2920: 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54 63  ata(ssl);.    Tc
2930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2940: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
2950: 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65 70  erp;.    int dep
2960: 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45  th..= X509_STORE
2970: 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f 64  _CTX_get_error_d
2980: 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20 69  epth(ctx);.    i
2990: 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f 53  nt err..= X509_S
29a0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
29b0: 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64 70  or(ctx);..    dp
29c0: 72 69 6e 74 66 28 22 56 65 72 69 66 79 3a 20 25  rintf("Verify: %
29d0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
29e0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
29f0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
2a00: 4c 4c 29 20 7b 0a 09 69 66 20 28 73 74 61 74 65  LL) {..if (state
2a10: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a20: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a30: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2a50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2a60: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2a70: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74   } else if (cert
2a80: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20   == NULL || ssl 
2a90: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
2aa0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
2ab0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
2ac0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
2ad0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
2ae0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
2af0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
2b00: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2b10: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2b20: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2b30: 77 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69  wStringObj("veri
2b40: 66 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  fy", -1));.    T
2b50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b70: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
2b80: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
2b90: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
2ba0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
2bb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2bc0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2bd0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2be0: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64   Tcl_NewIntObj(d
2bf0: 65 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f  epth));.    Tcl_
2c00: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c10: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2c20: 50 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39  Ptr, Tls_NewX509
2c30: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74  Obj(interp, cert
2c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2c70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f   Tcl_NewIntObj(o
2c80: 6b 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  k));.    Tcl_Lis
2c90: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2ca0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2cb0: 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  ,..Tcl_NewString
2cc0: 4f 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f  Obj((char*)X509_
2cd0: 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f  verify_cert_erro
2ce0: 72 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d  r_string(err), -
2cf0: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65  1));..    /* Pre
2d00: 76 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63  vent I/O while c
2d10: 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72  allback is in pr
2d20: 6f 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a  ogress */.    /*
2d30: 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73   statePtr->flags
2d40: 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c   |= TLS_TCL_CALL
2d50: 42 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a  BACK; */..    /*
2d60: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
2d70: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
2d80: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
2d90: 6d 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d  mdPtr);.    ok =
2da0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
2db0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
2dc0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
2dd0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
2de0: 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 73  dPtr);..    /* s
2df0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26  tatePtr->flags &
2e00: 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c  = ~(TLS_TCL_CALL
2e10: 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  BACK); */.    re
2e20: 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79 20  turn(ok);./* By 
2e30: 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20 76  default, leave v
2e40: 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63 68  erification unch
2e50: 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f 2a  anged. */.}.../*
2e60: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ea0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
2eb0: 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09  _Error --. *. *.
2ec0: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 77  Calls callback w
2ed0: 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72 6f  ith list of erro
2ee0: 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  rs.. *. * Side e
2ef0: 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 65  ffects:. *.The e
2f00: 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  rr field of the 
2f10: 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61 74  currently operat
2f20: 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65 74  ive State is set
2f30: 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69 6e  . *.  to a strin
2f40: 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65  g describing the
2f50: 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e   SSL negotiation
2f60: 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e 0a   failure reason.
2f70: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
2fc0: 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61 74  d.Tls_Error(Stat
2fd0: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61  e *statePtr, cha
2fe0: 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54 63  r *msg) {.    Tc
2ff0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3000: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
3010: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
3020: 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74 50   *cmdPtr, *listP
3030: 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  tr;.    unsigned
3040: 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20 73   long err;.    s
3050: 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20 6d  tatePtr->err = m
3060: 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  sg;..    dprintf
3070: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3080: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
3090: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
30a0: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
30b0: 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  rn;..    /* Crea
30c0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
30d0: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
30e0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
30f0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61  Obj(statePtr->ca
3100: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c  llback);.    Tcl
3110: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3120: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3130: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3140: 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c 20  ingObj("error", 
3150: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
3160: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3170: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3180: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
3190: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
31a0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
31b0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
31c0: 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20 21  );.    if (msg !
31d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c  = NULL) {..Tcl_L
31e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
31f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
3200: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
3210: 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a  gObj(msg, -1));.
3220: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
3230: 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53 74  (msg = Tcl_GetSt
3240: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3250: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3260: 65 72 70 29 2c 20 4e 55 4c 4c 29 29 20 21 3d 20  erp), NULL)) != 
3270: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73  NULL) {..Tcl_Lis
3280: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3290: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
32a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
32b0: 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20  bj(msg, -1));.. 
32c0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73     } else {..lis
32d0: 74 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  tPtr = Tcl_NewLi
32e0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
32f0: 09 77 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45  .while ((err = E
3300: 52 52 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20  RR_get_error()) 
3310: 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  != 0) {..    Tcl
3320: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3330: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
3340: 73 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  stPtr, Tcl_NewSt
3350: 72 69 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73  ringObj(ERR_reas
3360: 6f 6e 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  on_error_string(
3370: 65 72 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  err), -1));..}..
3380: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
3390: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
33a0: 20 63 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72   cmdPtr, listPtr
33b0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
33c0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
33d0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
33e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
33f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c  mdPtr);.    Eval
3400: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
3410: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
3420: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
3430: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
3440: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3490: 2a 0a 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  *. * KeyLogCallb
34a0: 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69  ack --. *. *.Wri
34b0: 74 65 20 72 65 63 65 69 76 65 64 20 6b 65 79 20  te received key 
34c0: 64 61 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65  data to log file
34d0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
34e0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ects:. *.none. *
34f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
3540: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63  KeyLogCallback(c
3550: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
3560: 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29  onst char *line)
3570: 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72   {.    char *str
3580: 20 3d 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59   = getenv(SSLKEY
3590: 4c 4f 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49  LOGFILE);.    FI
35a0: 4c 45 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72  LE *fd;..    dpr
35b0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
35c0: 0a 20 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a  .    if (str) {.
35d0: 09 66 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c  .fd = fopen(str,
35e0: 20 22 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28   "a");..fprintf(
35f0: 66 64 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29  fd, "%s\n",line)
3600: 3b 0a 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20  ;..fclose(fd);. 
3610: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d     }.}.../*. *--
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3660: 2d 0a 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64  -. *. * Password
3670: 20 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a   Callback --. *.
3680: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.Called when a
3690: 20 70 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20   password for a 
36a0: 70 72 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64  private key load
36b0: 69 6e 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45  ing/storing a PE
36c0: 4d 0a 20 2a 09 63 65 72 74 69 66 69 63 61 74 65  M. *.certificate
36d0: 20 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e   with encryption
36e0: 2e 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b  . Evals callback
36f0: 20 73 63 72 69 70 74 20 61 6e 64 20 72 65 74 75   script and retu
3700: 72 6e 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c  rns. *.the resul
3710: 74 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72  t as the passwor
3720: 64 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e  d string in buf.
3730: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
3740: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
3750: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
3760: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
3770: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
3780: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73   Returns:. *.Pas
3790: 73 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79  sword size in by
37a0: 74 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e  tes or -1 for an
37b0: 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d   error.. *. *---
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
3810: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
3820: 28 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20  (char *buf, int 
3830: 73 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67  size, int rwflag
3840: 2c 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b  , void *udata) {
3850: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
3860: 65 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29  ePtr.= (State *)
3870: 20 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f   udata;.    Tcl_
3880: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
3890: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
38a0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
38b0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
38c0: 63 6f 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e  code;..    dprin
38d0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
38e0: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
38f0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
3900: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
3910: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3920: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
3930: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
3940: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3950: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3960: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3970: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3980: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3990: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
39a0: 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
39b0: 65 72 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63  erp);..    strnc
39c0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
39d0: 7a 65 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20  ze_t) size);..  
39e0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74    return (int)st
39f0: 72 6c 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c  rlen(ret);..} el
3a00: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
3a10: 20 2d 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20   -1;..}.    }.. 
3a20: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3a30: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
3a40: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3a50: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3a60: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
3a70: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3a80: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3a90: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3aa0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3ab0: 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29  ("password", -1)
3ac0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3ad0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3ae0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3af0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77  Tcl_NewIntObj(rw
3b00: 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  flag));.    Tcl_
3b10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3b20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3b30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
3b40: 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20  bj(size));..    
3b50: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
3b60: 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70  ientData) interp
3b70: 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65  );.    Tcl_Prese
3b80: 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29  rve((ClientData)
3b90: 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20   statePtr);..   
3ba0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
3bb0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
3bc0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
3bd0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63  t(cmdPtr);.    c
3be0: 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62  ode = Tcl_EvalOb
3bf0: 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  jEx(interp, cmdP
3c00: 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f  tr, TCL_EVAL_GLO
3c10: 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f  BAL);.    if (co
3c20: 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de != TCL_OK) {.
3c30: 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56  #if (TCL_MAJOR_V
3c40: 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20  ERSION == 8) && 
3c50: 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49  (TCL_MINOR_VERSI
3c60: 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63  ON < 6)..Tcl_Bac
3c70: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74  kgroundError(int
3c80: 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c  erp);.#else..Tcl
3c90: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70  _BackgroundExcep
3ca0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64  tion(interp, cod
3cb0: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  e);.#endif.    }
3cc0: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
3cd0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
3ce0: 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28      Tcl_Release(
3cf0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3d00: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3d10: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70  If successful, p
3d20: 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72  ass back passwor
3d30: 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75  d string and tru
3d40: 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e  ncate if too lon
3d50: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64  g */.    if (cod
3d60: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
3d70: 69 6e 74 20 6c 65 6e 3b 0a 09 63 68 61 72 20 2a  int len;..char *
3d80: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3d90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3da0: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3db0: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 26 6c  sult(interp), &l
3dc0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20  en);..if (len > 
3dd0: 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c  size-1) {..    l
3de0: 65 6e 20 3d 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a  en = size-1;..}.
3df0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
3e00: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  t, (size_t) len)
3e10: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c  ;..buf[len] = '\
3e20: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  0';..Tcl_Release
3e30: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3e40: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 6c  terp);..return(l
3e50: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  en);.    }.    T
3e60: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
3e70: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3e80: 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .    return -1;.
3e90: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3ee0: 20 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62   * Session Callb
3ef0: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
3f00: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3f10: 77 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  when a new sessi
3f20: 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  on is added to t
3f30: 68 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53  he cache. In TLS
3f40: 20 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79   1.3. *.this may
3f50: 20 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c   be received mul
3f60: 74 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65  tiple times afte
3f70: 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e  r the handshake.
3f80: 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20   For. *.earlier 
3f90: 76 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77  versions, this w
3fa0: 69 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20  ill be received 
3fb0: 64 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73  during the hands
3fc0: 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73  hake.. *.This is
3fd0: 20 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77   the preferred w
3fe0: 61 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72  ay to obtain a r
3ff0: 65 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e  esumable session
4000: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
4010: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.None. *. * S
4020: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
4030: 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28  Calls callback (
4040: 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20  if defined). *. 
4050: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
4060: 20 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65   *.0 = error whe
4070: 72 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20  re session will 
4080: 62 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72  be immediately r
4090: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
40a0: 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a  internal cache..
40b0: 20 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77   *.1 = success w
40c0: 68 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73  here app retains
40d0: 20 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73   session in sess
40e0: 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d  ion cache, and m
40f0: 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53  ust call SSL_SES
4100: 53 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e  SION_free() when
4110: 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d   done.. *. *----
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4160: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
4170: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63  essionCallback(c
4180: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53  onst SSL *ssl, S
4190: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
41a0: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ion) {.    State
41b0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
41c0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
41d0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
41e0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
41f0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
4200: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
4210: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4220: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  r;.    const uns
4230: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
4240: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  et;.    const un
4250: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
4260: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a  sion_id;.    siz
4270: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e  e_t len2;.    un
4280: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
4290: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
42a0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
42b0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
42c0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
42d0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
42e0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
42f0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4300: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
4310: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4320: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4330: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4340: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4350: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4360: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4370: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4380: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
4390: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
43a0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
43b0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
43c0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
43d0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  on", -1));.    T
43e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
43f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4400: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
4410: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4420: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4430: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4440: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
4450: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  Session id */.  
4460: 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53    session_id = S
4470: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
4480: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
4490: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
44a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
44b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
44c0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
44d0: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
44e0: 28 69 6e 74 29 20 75 6c 65 6e 29 29 3b 0a 0a 20  (int) ulen));.. 
44f0: 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69     /* Session ti
4500: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
4510: 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
4520: 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69  ket(session, &ti
4530: 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20  cket, &len2);.  
4540: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4550: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4560: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4570: 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74  ewByteArrayObj(t
4580: 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e  icket, (int) len
4590: 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66  2));..    /* Lif
45a0: 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f  etime - number o
45b0: 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20  f seconds */.   
45c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
45d0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
45e0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
45f0: 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29  ewLongObj((long)
4600: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
4610: 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
4620: 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29  _hint(session)))
4630: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
4640: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
4650: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
4660: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
4670: 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63  .    EvalCallbac
4680: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
4690: 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20  tr, cmdPtr);.   
46a0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
46b0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
46c0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a  eturn 0;.}.../*.
46d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e  -----. *. * ALPN
4720: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65   Callback for Se
4730: 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43 61  rvers and NPN Ca
4740: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
4750: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66  ts --. *. *.Perf
4760: 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74  orm protocol (ht
4770: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
4780: 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20  etc.) selection 
4790: 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d  for the. *.incom
47a0: 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ing connection. 
47b0: 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65 6c  Called after Hel
47c0: 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63 61  lo and server ca
47d0: 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72  llbacks.. *.Wher
47e0: 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65 63  e 'out' is selec
47f0: 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64  ted protocol and
4800: 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65 65   'in' is the pee
4810: 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69 73  r advertised lis
4820: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
4830: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
4840: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
4850: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
4860: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
4870: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
4880: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
4890: 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74  RR_OK: ALPN prot
48a0: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54  ocol selected. T
48b0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
48c0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f  ntinues.. *.SSL_
48d0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
48e0: 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77 61  _FATAL: There wa
48f0: 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65 74  s no overlap bet
4900: 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74 27  ween the client'
4910: 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69 65  s. *.    supplie
4920: 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 73  d list and the s
4930: 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61 74  erver configurat
4940: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ion. The connect
4950: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f 72  ion will be abor
4960: 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ted.. *.SSL_TLSE
4970: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c  XT_ERR_NOACK: AL
4980: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  PN protocol not 
4990: 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20  selected, e.g., 
49a0: 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a  because no ALPN.
49b0: 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73   *.    protocols
49c0: 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 20   are configured 
49d0: 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  for this connect
49e0: 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ion. The connect
49f0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
4a00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
4a50: 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62  ic int.ALPNCallb
4a60: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
4a70: 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sl, const unsign
4a80: 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75  ed char **out, u
4a90: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 75  nsigned char *ou
4aa0: 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73  tlen,..const uns
4ab0: 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c 20  igned char *in, 
4ac0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c  unsigned int inl
4ad0: 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  en, void *arg) {
4ae0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
4af0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
4b00: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
4b10: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
4b20: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
4b30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
4b40: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
4b50: 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72 69  , res;..    dpri
4b60: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
4b70: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
4b80: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55  ULL || arg == NU
4b90: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
4ba0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
4bb0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
4bc0: 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f  * Select protoco
4bd0: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53 4c  l */.    if (SSL
4be0: 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f  _select_next_pro
4bf0: 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  to(out, outlen, 
4c00: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4c10: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4c20: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4c30: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4c40: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4c50: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4c60: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4c70: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4c80: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4c90: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
4ca0: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
4cb0: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
4cc0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
4cd0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
4ce0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4cf0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4d00: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
4d10: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
4d20: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
4d30: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
4d40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
4d50: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
4d60: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
4d70: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
4d80: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
4d90: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
4da0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4db0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4dc0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4dd0: 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29  gObj("alpn", -1)
4de0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4df0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4e00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
4e10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
4e20: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
4e30: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
4e40: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
4e50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4e60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4e70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4e80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a 6f  _NewStringObj(*o
4e90: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  ut, -1));.    Tc
4ea0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4eb0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4ec0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f  mdPtr, Tcl_NewBo
4ed0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20  oleanObj(res == 
4ee0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
4ef0: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  K));..    /* Eva
4f00: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
4f10: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
4f20: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4f30: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
4f40: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
4f50: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
4f60: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
4f70: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
4f80: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4f90: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
4fa0: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
4fb0: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4fc0: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4fd0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
4fe0: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
4ff0: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATAL;.    }.    
5000: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5010: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5020: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5030: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76  ------. *. * Adv
5080: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73  ertise Protocols
5090: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65   Callback for Ne
50a0: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  xt Protocol Nego
50b0: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e  tiation (NPN) in
50c0: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a   ServerHello --.
50d0: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65   *. *.called whe
50e0: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e  n a TLS server n
50f0: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73  eeds a list of s
5100: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f  upported protoco
5110: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50  ls for Next. *.P
5120: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
5130: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
5140: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
5150: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
5160: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
5170: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
5180: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72  T_ERR_OK: NPN pr
5190: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
51a0: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
51b0: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
51c0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
51d0: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c  CK: NPN protocol
51e0: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54   not selected. T
51f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5200: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  -. */.#ifdef USE
5260: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a  _NPN.static int.
5270: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  NPNCallback(cons
5280: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
5290: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
52a0: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
52b0: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69  int *outlen, voi
52c0: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
52d0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
52e0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20  (State*)arg;..  
52f0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
5300: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5310: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5320: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
5330: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5340: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5350: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74  .    /* Set prot
5360: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20  ocols list */.  
5370: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
5380: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
5390: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50  {..*out = stateP
53a0: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75  tr->protos;..*ou
53b0: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d  tlen = statePtr-
53c0: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20  >protos_len;.   
53d0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20   } else {..*out 
53e0: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e  = NULL;..*outlen
53f0: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53   = 0;..return SS
5400: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5410: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  CK;.    }.    re
5420: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5430: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ERR_OK;.}.#endif
5440: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5490: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66  * SNI Callback f
54a0: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
54b0: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76  . *.Perform serv
54c0: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74  er-side SNI host
54d0: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61  name selection a
54e0: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53  fter receiving S
54f0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  NI extension. *.
5500: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e  in Client Hello.
5510: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65   Called after he
5520: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74  llo callback but
5530: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c   before ALPN cal
5540: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
5550: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
5560: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5570: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
5580: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
5590: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
55a0: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
55b0: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68  XT_ERR_OK: SNI h
55c0: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70  ostname is accep
55d0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
55e0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
55f0: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5600: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e  _ALERT_FATAL: SN
5610: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
5620: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  t accepted. The 
5630: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20  connection. *.  
5640: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65    is aborted. De
5650: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20  fault for alert 
5660: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f  is SSL_AD_UNRECO
5670: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09  GNIZED_NAME.. *.
5680: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5690: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e  LERT_WARNING: SN
56a0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
56b0: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e  t accepted, warn
56c0: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20  ing alert. *.   
56d0: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f   sent (not suppo
56e0: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29  rted in TLSv1.3)
56f0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5700: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
5710: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5720: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ACK: SNI hostnam
5730: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5740: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77  d and not acknow
5750: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65  ledged,. *.    e
5760: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e  .g. if SNI has n
5770: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  ot been configur
5780: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5790: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
57a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
57f0: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63  c int.SNICallbac
5800: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5810: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
5820: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
5830: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5840: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
5850: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
5860: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
5870: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
5880: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
5890: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
58a0: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
58b0: 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  rname = NULL;.. 
58c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
58d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
58e0: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
58f0: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
5900: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5910: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5920: 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f  ..    /* Only wo
5930: 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32 20  rks for TLS 1.2 
5940: 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a 20  and earlier */. 
5950: 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20     servername = 
5960: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
5970: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
5980: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
5990: 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65 72  e);.    if (!ser
59a0: 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76 65  vername || serve
59b0: 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30 27  rname[0] == '\0'
59c0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
59d0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
59e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
59f0: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
5a00: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
5a10: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
5a20: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a  _TLSEXT_ERR_OK;.
5a30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5a40: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
5a50: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
5a60: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5a70: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5a80: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5a90: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5aa0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5ab0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5ac0: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5ad0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5ae0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5af0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5b00: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5b10: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5b20: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5b30: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5b40: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5b50: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5b60: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5b70: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5b80: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5b90: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5ba0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5bb0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5bc0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5bd0: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5be0: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5bf0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5c00: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5c10: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5c20: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5c30: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5c40: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5c50: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5c60: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5c70: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5c80: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5c90: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5ca0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5cb0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5cc0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5cd0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
5ce0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
5cf0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
5d00: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
5d10: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
5d20: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
5d30: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
5d40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
5d50: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5da0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
5db0: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
5dc0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
5dd0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
5de0: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
5df0: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
5e00: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
5e10: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
5e20: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
5e30: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
5e40: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
5e50: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
5e60: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
5e70: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
5e80: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
5e90: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
5ea0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
5eb0: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
5ec0: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
5ed0: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
5ee0: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
5ef0: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
5f00: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
5f10: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
5f20: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
5f30: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
5f40: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
5f50: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
5f60: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
5f70: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
5f80: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
5f90: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
5fa0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
5fb0: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
5fc0: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
5fd0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
5fe0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
5ff0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
6000: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6010: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6020: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6030: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6040: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
6050: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
6060: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
6070: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
6080: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
6090: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
60a0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
60b0: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
60c0: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
60d0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
60e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
60f0: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
6100: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6150: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
6160: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
6170: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
6180: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
6190: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
61a0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
61b0: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
61c0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
61d0: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
61e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
61f0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
6200: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6210: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6220: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6230: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6240: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
6250: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
6260: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
6270: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
6280: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
6290: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
62a0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
62b0: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
62c0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
62d0: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
62e0: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
62f0: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
6300: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6310: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6320: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6330: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6340: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
6350: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
6360: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
6370: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
6380: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
6390: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
63a0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
63b0: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
63c0: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
63d0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
63e0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
63f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6400: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6410: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6420: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6430: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6440: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
6450: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
6460: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
6470: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
6480: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6490: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
64a0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
64b0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
64c0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
64d0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
64e0: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
64f0: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6500: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6510: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6520: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6530: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6540: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
6550: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
6560: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
6570: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
6580: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
6590: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
65a0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
65b0: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
65c0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
65d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
65e0: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
65f0: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6600: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6610: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6620: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6630: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6640: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
6650: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
6660: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6670: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6680: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
6690: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
66a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
66b0: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
66c0: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
66d0: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
66e0: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
66f0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6700: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6710: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6720: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6730: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6740: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6750: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6760: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6770: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6780: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6790: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
67a0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
67b0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
67c0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
67d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
67e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
67f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
6800: 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c  wStringObj("hell
6810: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
6820: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
6830: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
6840: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
6850: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
6860: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
6870: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
6880: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
6890: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
68a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
68b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
68c0: 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c  gObj(servername,
68d0: 20 28 69 6e 74 29 20 6c 65 6e 29 29 3b 0a 0a 20   (int) len));.. 
68e0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
68f0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
6900: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
6910: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
6920: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
6930: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
6940: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
6950: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
6960: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6970: 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65  LLO_RETRY;..*ale
6980: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6990: 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43  _ALERT_USER_CANC
69a0: 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73  ELLED;.    } els
69b0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
69c0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
69d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
69e0: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SS;.    } else {
69f0: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
6a00: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6a10: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6a20: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
6a30: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RNAL_ERROR;.    
6a40: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
6a50: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6a60: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
6a70: 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
6a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f  *********/./* Co
6a90: 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a  mmands         *
6aa0: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
6ab0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61  --. *. * Handsha
6b10: 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  keObjCmd --. *. 
6b20: 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69  *.This command i
6b30: 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66 79  s used to verify
6b40: 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61 6e   whether the han
6b50: 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65  dshake is comple
6b60: 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a  te. *.or not.. *
6b70: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
6b80: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
6b90: 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68  esult. 1 means h
6ba0: 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74  andshake complet
6bb0: 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69  e, 0 means pendi
6bc0: 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ng.. *. * Side e
6bd0: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66  ffects:. *.May f
6be0: 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61  orce SSL negotia
6bf0: 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61  tion to take pla
6c00: 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ce.. *. *-------
6c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
6c50: 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64  .static int Hand
6c60: 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65  shakeObjCmd(Clie
6c70: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
6c80: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
6c90: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
6ca0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
6cb0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
6cc0: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20  l_Channel chan; 
6cd0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68         /* The ch
6ce0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
6cf0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
6d00: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20  tate *statePtr; 
6d10: 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74         /* client
6d20: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
6d30: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e  ocket */.    con
6d40: 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72 20  st char *errStr 
6d50: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
6d60: 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  ret = 1;.    int
6d70: 20 65 72 72 20 3d 20 30 3b 0a 0a 20 20 20 20 64   err = 0;..    d
6d80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
6d90: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
6da0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
6db0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
6dc0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
6dd0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
6de0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
6df0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
6e00: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
6e10: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
6e20: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
6e30: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
6e40: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c  (objv[1], NULL),
6e50: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
6e60: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
6e70: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
6e80: 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
6e90: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
6ea0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
6eb0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
6ec0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
6ed0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
6ee0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
6ef0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
6f00: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
6f10: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
6f20: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
6f30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6f40: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
6f50: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
6f60: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
6f70: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
6f80: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
6f90: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
6fa0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
6fb0: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
6fc0: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  KE", "CHANNEL", 
6fd0: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
6fe0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
6ff0: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
7000: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
7010: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c  r = (State *)Tcl
7020: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61  _GetChannelInsta
7030: 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a  nceData(chan);..
7040: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
7050: 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72  ling Tls_WaitFor
7060: 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72  Connect");.    r
7070: 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72  et = Tls_WaitFor
7080: 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72  Connect(statePtr
7090: 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20  , &err, 1);.    
70a0: 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69  dprintf("Tls_Wai
70b0: 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75  tForConnect retu
70c0: 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b  rned: %i", ret);
70d0: 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c 20  ..    if (ret < 
70e0: 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72 2d  0 && ((statePtr-
70f0: 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c  >flags & TLS_TCL
7100: 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72 20  _ASYNC) && (err 
7110: 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09  == EAGAIN))) {..
7120: 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73  dprintf("Async s
7130: 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47  et and err = EAG
7140: 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b  AIN");..ret = 0;
7150: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
7160: 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67  ret < 0) {..long
7170: 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72   result;..errStr
7180: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72   = statePtr->err
7190: 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75  ;..Tcl_ResetResu
71a0: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c  lt(interp);..Tcl
71b0: 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a  _SetErrno(err);.
71c0: 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c  ..if (!errStr ||
71d0: 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29   (*errStr == 0))
71e0: 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d   {..    errStr =
71f0: 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28   Tcl_PosixError(
7200: 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63  interp);..}...Tc
7210: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7220: 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b  nterp, "handshak
7230: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72  e failed: ", err
7240: 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  Str, (char *) NU
7250: 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c  LL);..if ((resul
7260: 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  t = SSL_get_veri
7270: 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50  fy_result(stateP
7280: 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30  tr->ssl)) != X50
7290: 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  9_V_OK) {..    T
72a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
72b0: 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f  interp, " due to
72c0: 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79  : ", X509_verify
72d0: 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
72e0: 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68 61  ng(result), (cha
72f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09  r *) NULL);..}..
7300: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
7310: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
7320: 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41  "HANDSHAKE", "FA
7330: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
7340: 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28  NULL);..dprintf(
7350: 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45  "Returning TCL_E
7360: 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68  RROR with handsh
7370: 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c  ake failed: %s",
7380: 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72   errStr);..retur
7390: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
73a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
73b0: 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20  err != 0) {..   
73c0: 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e   dprintf("Got an
73d0: 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f   error with a co
73e0: 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b  mpleted handshak
73f0: 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72  e: err = %i", er
7400: 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b  r);..}..ret = 1;
7410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
7420: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
7430: 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20  CL_OK with data 
7440: 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20  \"%i\"", ret);. 
7450: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
7460: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
7470: 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b  NewIntObj(ret));
7480: 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f  .    return(TCL_
7490: 4f 4b 29 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  OK);..clientData
74a0: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
74b0: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
74c0: 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74  har *command_opt
74d0: 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 2d 61  s [] = {.    "-a
74e0: 6c 70 6e 22 2c 20 22 2d 63 61 64 69 72 22 2c 20  lpn", "-cadir", 
74f0: 22 2d 63 61 66 69 6c 65 22 2c 20 22 2d 63 65 72  "-cafile", "-cer
7500: 74 22 2c 20 22 2d 63 65 72 74 66 69 6c 65 22 2c  t", "-certfile",
7510: 20 22 2d 63 69 70 68 65 72 22 2c 20 22 2d 63 69   "-cipher", "-ci
7520: 70 68 65 72 73 22 2c 20 22 2d 63 69 70 68 65 72  phers", "-cipher
7530: 73 75 69 74 65 73 22 2c 0a 20 20 20 20 22 2d 63  suites",.    "-c
7540: 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 68 70 61 72  ommand", "-dhpar
7550: 61 6d 73 22 2c 20 22 2d 6b 65 79 22 2c 20 22 2d  ams", "-key", "-
7560: 6b 65 79 66 69 6c 65 22 2c 20 22 2d 6d 6f 64 65  keyfile", "-mode
7570: 6c 22 2c 20 22 2d 70 61 73 73 77 6f 72 64 22 2c  l", "-password",
7580: 20 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b   "-post_handshak
7590: 65 22 2c 0a 20 20 20 20 22 2d 72 65 71 75 65 73  e",.    "-reques
75a0: 74 22 2c 20 22 2d 72 65 71 75 69 72 65 22 2c 20  t", "-require", 
75b0: 22 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  "-security_level
75c0: 22 2c 20 22 2d 73 65 72 76 65 72 22 2c 20 22 2d  ", "-server", "-
75d0: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 22 2d 73  servername", "-s
75e0: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 22 2d 73 73  ession_id", "-ss
75f0: 6c 32 22 2c 0a 20 20 20 20 22 2d 73 73 6c 33 22  l2",.    "-ssl3"
7600: 2c 20 22 2d 74 6c 73 31 22 2c 20 22 2d 74 6c 73  , "-tls1", "-tls
7610: 31 2e 31 22 2c 20 22 2d 74 6c 73 31 2e 32 22 2c  1.1", "-tls1.2",
7620: 20 22 2d 74 6c 73 31 2e 33 22 2c 20 22 2d 76 61   "-tls1.3", "-va
7630: 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c 20  lidatecommand", 
7640: 22 2d 76 63 6d 64 22 2c 20 4e 55 4c 4c 7d 3b 0a  "-vcmd", NULL};.
7650: 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f  .enum _command_o
7660: 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 61  pts {.    _opt_a
7670: 6c 70 6e 2c 20 5f 6f 70 74 5f 63 61 64 69 72 2c  lpn, _opt_cadir,
7680: 20 5f 6f 70 74 5f 63 61 66 69 6c 65 2c 20 5f 6f   _opt_cafile, _o
7690: 70 74 5f 63 65 72 74 2c 20 5f 6f 70 74 5f 63 65  pt_cert, _opt_ce
76a0: 72 74 66 69 6c 65 2c 20 5f 6f 70 74 5f 63 69 70  rtfile, _opt_cip
76b0: 68 65 72 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72  her, _opt_cipher
76c0: 73 2c 0a 20 20 20 20 5f 6f 70 74 5f 63 69 70 68  s,.    _opt_ciph
76d0: 65 72 73 75 69 74 65 2c 20 5f 6f 70 74 5f 63 6d  ersuite, _opt_cm
76e0: 64 2c 20 5f 6f 70 74 5f 64 68 70 61 72 61 6d 73  d, _opt_dhparams
76f0: 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 74  , _opt_key, _opt
7700: 5f 6b 65 79 66 69 6c 65 2c 20 5f 6f 70 74 5f 6d  _keyfile, _opt_m
7710: 6f 64 65 6c 2c 20 5f 6f 70 74 5f 70 61 73 73 77  odel, _opt_passw
7720: 6f 72 64 2c 0a 20 20 20 20 5f 6f 70 74 5f 68 61  ord,.    _opt_ha
7730: 6e 64 73 68 61 6b 65 2c 20 5f 6f 70 74 5f 72 65  ndshake, _opt_re
7740: 71 75 65 73 74 2c 20 5f 6f 70 74 5f 72 65 71 75  quest, _opt_requ
7750: 69 72 65 2c 20 5f 6f 70 74 5f 73 65 63 75 72 69  ire, _opt_securi
7760: 74 79 5f 6c 65 76 65 6c 2c 20 5f 6f 70 74 5f 73  ty_level, _opt_s
7770: 65 72 76 65 72 2c 20 5f 6f 70 74 5f 73 65 72 76  erver, _opt_serv
7780: 65 72 6e 61 6d 65 2c 0a 20 20 20 20 5f 6f 70 74  ername,.    _opt
7790: 5f 73 65 73 73 69 6f 6e 5f 69 64 2c 20 5f 6f 70  _session_id, _op
77a0: 74 5f 73 73 6c 32 2c 20 5f 6f 70 74 5f 73 73 6c  t_ssl2, _opt_ssl
77b0: 33 2c 20 5f 6f 70 74 5f 74 6c 73 31 2c 20 5f 6f  3, _opt_tls1, _o
77c0: 70 74 5f 74 6c 73 31 31 2c 20 5f 6f 70 74 5f 74  pt_tls11, _opt_t
77d0: 6c 73 31 32 2c 20 5f 6f 70 74 5f 74 6c 73 31 33  ls12, _opt_tls13
77e0: 2c 0a 20 20 20 20 5f 6f 70 74 5f 76 61 6c 69 64  ,.    _opt_valid
77f0: 61 74 65 2c 20 5f 6f 70 74 5f 76 63 6d 64 0a 7d  ate, _opt_vcmd.}
7800: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ;../*. *--------
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
7850: 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  * ImportObjCmd -
7860: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
7870: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
7880: 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  d to process the
7890: 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20   "ssl" command. 
78a0: 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d  *. *.The ssl com
78b0: 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20  mand pushes SSL 
78c0: 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f  over a (newly co
78d0: 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63  nnected) tcp soc
78e0: 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ket. *. * Result
78f0: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
7900: 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
7910: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
7920: 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74  . *.May modify t
7930: 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61  he behavior of a
7940: 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a  n IO channel.. *
7950: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
7960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7990: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
79a0: 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43  c int.ImportObjC
79b0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
79c0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
79d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
79e0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
79f0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
7a00: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
7a10: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
7a20: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
7a30: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
7a40: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
7a50: 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
7a60: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
7a70: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20   */.    SSL_CTX 
7a80: 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e  *ctx.        = N
7a90: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
7aa0: 20 2a 63 6d 64 4f 62 6a 09 20 20 20 20 20 20 20   *cmdObj.       
7ab0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c   = NULL;.    Tcl
7ac0: 5f 4f 62 6a 20 2a 70 61 73 73 77 64 4f 62 6a 09  _Obj *passwdObj.
7ad0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7ae0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d      Tcl_Obj *vcm
7af0: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
7b00: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
7b10: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  g upperChannelTr
7b20: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72  anslation, upper
7b30: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c  ChannelBlocking,
7b40: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63   upperChannelEnc
7b50: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  oding, upperChan
7b60: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20  nelEOFChar;.    
7b70: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c 20 66 6e  int idx, len, fn
7b80: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09  ;.    int flags.
7b90: 09 20 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54  .        = TLS_T
7ba0: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
7bb0: 20 73 65 72 76 65 72 09 09 20 20 20 20 20 20 20   server..       
7bc0: 20 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e   = 0;./* is conn
7bd0: 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20  ection incoming 
7be0: 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a  or outgoing? */.
7bf0: 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c      char *keyfil
7c00: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
7c10: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74  ;.    char *cert
7c20: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
7c30: 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ULL;.    unsigne
7c40: 64 20 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20  d char *key  .= 
7c50: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 6b 65  NULL;.    int ke
7c60: 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  y_len           
7c70: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75        = 0;.    u
7c80: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
7c90: 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt         = NUL
7ca0: 4c 3b 0a 20 20 20 20 69 6e 74 20 63 65 72 74 5f  L;.    int cert_
7cb0: 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  len             
7cc0: 20 20 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72     = 0;.    char
7cd0: 20 2a 63 69 70 68 65 72 73 09 20 20 20 20 20 20   *ciphers.      
7ce0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
7cf0: 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73  ar *ciphersuites
7d00: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7d10: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
7d20: 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  e.        = NULL
7d30: 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 64 69  ;.    char *CAdi
7d40: 72 09 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  r..        = NUL
7d50: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70  L;.    char *DHp
7d60: 61 72 61 6d 73 09 20 20 20 20 20 20 20 20 3d 20  arams.        = 
7d70: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
7d80: 6d 6f 64 65 6c 09 09 20 20 20 20 20 20 20 20 3d  model..        =
7d90: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
7da0: 2a 73 65 72 76 65 72 6e 61 6d 65 09 20 20 20 20  *servername.    
7db0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 68      = NULL;./* h
7dc0: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72 76  ostname for Serv
7dd0: 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74 69  er Name Indicati
7de0: 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  on */.    const 
7df0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
7e00: 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c 4c  ession_id = NULL
7e10: 3b 0a 20 20 20 20 69 6e 74 20 73 65 73 73 5f 6c  ;.    int sess_l
7e20: 65 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  en              
7e30: 20 20 3d 20 30 3b 0a 20 20 20 20 54 63 6c 5f 4f    = 0;.    Tcl_O
7e40: 62 6a 20 2a 61 6c 70 6e 4f 62 6a 09 09 3d 20 4e  bj *alpnObj..= N
7e50: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c  ULL;.    int ssl
7e60: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
7e70: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
7e80: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
7e90: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
7ea0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
7eb0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20  roto = 0, level 
7ec0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65  = -1;.    int ve
7ed0: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72  rify = 0, requir
7ee0: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d  e = 0, request =
7ef0: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   1, post_handsha
7f00: 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72  ke = 0;..    dpr
7f10: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
7f20: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7f30: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
7f40: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7f50: 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a  ).    tls1 = 0;.
7f60: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
7f70: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
7f80: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7f90: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
7fa0: 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64  tls1_1 = 0;.#end
7fb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
7fc0: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
7fd0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7fe0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31  TLS1_2).    tls1
7ff0: 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _2 = 0;.#endif.#
8000: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
8010: 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_3) || defined
8020: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8030: 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d  _3).    tls1_3 =
8040: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   0;.#endif..    
8050: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
8060: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8070: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8080: 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74  v, "channel ?opt
8090: 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e  ions?");..return
80a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
80b0: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
80c0: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
80d0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
80e0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
80f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
8100: 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29  j(objv[1], NULL)
8110: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
8120: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
8130: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
8140: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8160: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
8170: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
8180: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
8190: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
81a0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
81b0: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
81c0: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
81d0: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 69 66 20 28  ; idx++) {..if (
81e0: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
81f0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
8200: 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  [idx], command_o
8210: 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30  pts, "option", 0
8220: 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b  , &fn) != TCL_OK
8230: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
8240: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
8250: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20  /* Validate arg 
8260: 68 61 73 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66  has value */..if
8270: 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29   (++idx >= objc)
8280: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
8290: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
82a0: 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f   "No value for o
82b0: 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61  ption \"", comma
82c0: 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22  nd_opts[fn], "\"
82d0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
82e0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
82f0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 73  CL_ERROR;..}...s
8300: 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63 61 73  witch(fn) {..cas
8310: 65 20 5f 6f 70 74 5f 61 6c 70 6e 3a 0a 09 20 20  e _opt_alpn:..  
8320: 20 20 61 6c 70 6e 4f 62 6a 20 3d 20 6f 62 6a 76    alpnObj = objv
8330: 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61  [idx];..    brea
8340: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 61  k;..case _opt_ca
8350: 64 69 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  dir:..    GET_OP
8360: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8370: 78 5d 2c 20 43 41 64 69 72 2c 20 4e 55 4c 4c 29  x], CAdir, NULL)
8380: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8390: 61 73 65 20 5f 6f 70 74 5f 63 61 66 69 6c 65 3a  ase _opt_cafile:
83a0: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
83b0: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
83c0: 43 41 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 09  CAfile, NULL);..
83d0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
83e0: 20 5f 6f 70 74 5f 63 65 72 74 3a 0a 09 20 20 20   _opt_cert:..   
83f0: 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52   GET_OPT_BYTE_AR
8400: 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 63  RAY(objv[idx], c
8410: 65 72 74 2c 20 26 63 65 72 74 5f 6c 65 6e 29 3b  ert, &cert_len);
8420: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8430: 73 65 20 5f 6f 70 74 5f 63 65 72 74 66 69 6c 65  se _opt_certfile
8440: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53  :..    GET_OPT_S
8450: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c  TRING(objv[idx],
8460: 20 63 65 72 74 66 69 6c 65 2c 20 4e 55 4c 4c 29   certfile, NULL)
8470: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8480: 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 3a  ase _opt_cipher:
8490: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68  ..case _opt_ciph
84a0: 65 72 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ers:..    GET_OP
84b0: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
84c0: 78 5d 2c 20 63 69 70 68 65 72 73 2c 20 4e 55 4c  x], ciphers, NUL
84d0: 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  L);..    break;.
84e0: 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65  .case _opt_ciphe
84f0: 72 73 75 69 74 65 3a 0a 09 20 20 20 20 47 45 54  rsuite:..    GET
8500: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76  _OPT_STRING(objv
8510: 5b 69 64 78 5d 2c 20 63 69 70 68 65 72 73 75 69  [idx], ciphersui
8520: 74 65 73 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  tes, NULL);..   
8530: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8540: 70 74 5f 63 6d 64 3a 0a 09 20 20 20 20 63 6d 64  pt_cmd:..    cmd
8550: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b  Obj = objv[idx];
8560: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8570: 73 65 20 5f 6f 70 74 5f 64 68 70 61 72 61 6d 73  se _opt_dhparams
8580: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53  :..    GET_OPT_S
8590: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c  TRING(objv[idx],
85a0: 20 44 48 70 61 72 61 6d 73 2c 20 4e 55 4c 4c 29   DHparams, NULL)
85b0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
85c0: 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a 09 20  ase _opt_key:.. 
85d0: 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f     GET_OPT_BYTE_
85e0: 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c  ARRAY(objv[idx],
85f0: 20 6b 65 79 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b   key, &key_len);
8600: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8610: 73 65 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65 3a  se _opt_keyfile:
8620: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
8630: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
8640: 6b 65 79 66 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  keyfile, NULL);.
8650: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8660: 65 20 5f 6f 70 74 5f 6d 6f 64 65 6c 3a 0a 09 20  e _opt_model:.. 
8670: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
8680: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 6d 6f 64  G(objv[idx], mod
8690: 65 6c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  el, NULL);..    
86a0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
86b0: 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 20 20  t_password:..   
86c0: 20 70 61 73 73 77 64 4f 62 6a 20 3d 20 6f 62 6a   passwdObj = obj
86d0: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65  v[idx];..    bre
86e0: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 68  ak;..case _opt_h
86f0: 61 6e 64 73 68 61 6b 65 3a 0a 09 20 20 20 20 47  andshake:..    G
8700: 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76  ET_OPT_BOOL(objv
8710: 5b 69 64 78 5d 2c 20 26 70 6f 73 74 5f 68 61 6e  [idx], &post_han
8720: 64 73 68 61 6b 65 29 3b 0a 09 20 20 20 20 62 72  dshake);..    br
8730: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8740: 72 65 71 75 65 73 74 3a 0a 09 20 20 20 20 47 45  request:..    GE
8750: 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b  T_OPT_BOOL(objv[
8760: 69 64 78 5d 2c 20 26 72 65 71 75 65 73 74 29 3b  idx], &request);
8770: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8780: 73 65 20 5f 6f 70 74 5f 72 65 71 75 69 72 65 3a  se _opt_require:
8790: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 4f  ..    GET_OPT_BO
87a0: 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72  OL(objv[idx], &r
87b0: 65 71 75 69 72 65 29 3b 0a 09 20 20 20 20 62 72  equire);..    br
87c0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
87d0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 3a 0a  security_level:.
87e0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54  .    GET_OPT_INT
87f0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 6c 65 76  (objv[idx], &lev
8800: 65 6c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  el);..    break;
8810: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73 65 72 76  ..case _opt_serv
8820: 65 72 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  er:..    GET_OPT
8830: 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c  _BOOL(objv[idx],
8840: 20 26 73 65 72 76 65 72 29 3b 0a 09 20 20 20 20   &server);..    
8850: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8860: 74 5f 73 65 72 76 65 72 6e 61 6d 65 3a 0a 09 20  t_servername:.. 
8870: 20 20 20 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e     GET_OPT_STRIN
8880: 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 65 72  G(objv[idx], ser
8890: 76 65 72 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a  vername, NULL);.
88a0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
88b0: 65 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e 5f 69  e _opt_session_i
88c0: 64 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  d:..    GET_OPT_
88d0: 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b  BYTE_ARRAY(objv[
88e0: 69 64 78 5d 2c 20 73 65 73 73 69 6f 6e 5f 69 64  idx], session_id
88f0: 2c 20 26 73 65 73 73 5f 6c 65 6e 29 3b 0a 09 20  , &sess_len);.. 
8900: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8910: 5f 6f 70 74 5f 73 73 6c 32 3a 0a 09 20 20 20 20  _opt_ssl2:..    
8920: 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76  GET_OPT_INT(objv
8930: 5b 69 64 78 5d 2c 20 26 73 73 6c 32 29 3b 0a 09  [idx], &ssl2);..
8940: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
8950: 20 5f 6f 70 74 5f 73 73 6c 33 3a 0a 09 20 20 20   _opt_ssl3:..   
8960: 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a   GET_OPT_INT(obj
8970: 76 5b 69 64 78 5d 2c 20 26 73 73 6c 33 29 3b 0a  v[idx], &ssl3);.
8980: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8990: 65 20 5f 6f 70 74 5f 74 6c 73 31 3a 0a 09 20 20  e _opt_tls1:..  
89a0: 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62    GET_OPT_INT(ob
89b0: 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31 29 3b  jv[idx], &tls1);
89c0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
89d0: 73 65 20 5f 6f 70 74 5f 74 6c 73 31 31 3a 0a 09  se _opt_tls11:..
89e0: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
89f0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73 31  objv[idx], &tls1
8a00: 5f 31 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  _1);..    break;
8a10: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31  ..case _opt_tls1
8a20: 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  2:..    GET_OPT_
8a30: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8a40: 74 6c 73 31 5f 32 29 3b 0a 09 20 20 20 20 62 72  tls1_2);..    br
8a50: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8a60: 74 6c 73 31 33 3a 0a 09 20 20 20 20 47 45 54 5f  tls13:..    GET_
8a70: 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78  OPT_INT(objv[idx
8a80: 5d 2c 20 26 74 6c 73 31 5f 33 29 3b 0a 09 20 20  ], &tls1_3);..  
8a90: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
8aa0: 6f 70 74 5f 76 61 6c 69 64 61 74 65 3a 0a 09 63  opt_validate:..c
8ab0: 61 73 65 20 5f 6f 70 74 5f 76 63 6d 64 3a 0a 09  ase _opt_vcmd:..
8ac0: 20 20 20 20 76 63 6d 64 20 3d 20 6f 62 6a 76 5b      vcmd = objv[
8ad0: 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b  idx];..    break
8ae0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
8af0: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65  if (request)..ve
8b00: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
8b10: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c  FY_CLIENT_ONCE |
8b20: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
8b30: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  ;.    if (reques
8b40: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65  t && require).ve
8b50: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
8b60: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
8b70: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20  ER_CERT;.    if 
8b80: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
8b90: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69  _handshake).veri
8ba0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
8bb0: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b  _POST_HANDSHAKE;
8bc0: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20  .    if (verify 
8bd0: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20  == 0)..verify = 
8be0: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b  SSL_VERIFY_NONE;
8bf0: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ..    proto |= (
8c00: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl2 ? TLS_PROTO
8c10: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL2 : 0);.    
8c20: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f  proto |= (ssl3 ?
8c30: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20   TLS_PROTO_SSL3 
8c40: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
8c50: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50  |= (tls1 ? TLS_P
8c60: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a  ROTO_TLS1 : 0);.
8c70: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
8c80: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_1 ? TLS_PROTO
8c90: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20  _TLS1_1 : 0);.  
8ca0: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
8cb0: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _2 ? TLS_PROTO_T
8cc0: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_2 : 0);.    
8cd0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33  proto |= (tls1_3
8ce0: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
8cf0: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  1_3 : 0);..    /
8d00: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
8d10: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20  if blank string 
8d20: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20  provided */.    
8d30: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65  if (cert && !*ce
8d40: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72  rt)..        cer
8d50: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t.        = NULL
8d60: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26  ;.    if (key &&
8d70: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20   !*key)..       
8d80: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e   key.        = N
8d90: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72  ULL;.    if (cer
8da0: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66  tfile && !*certf
8db0: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72  ile)         cer
8dc0: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20  tfile.= NULL;.  
8dd0: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26    if (keyfile &&
8de0: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79   !*keyfile)..key
8df0: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
8e00: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
8e10: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
8e20: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65  s).        ciphe
8e30: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rs.        = NUL
8e40: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
8e50: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70  rsuites && !*cip
8e60: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65  hersuites) ciphe
8e70: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c  rsuites    = NUL
8e80: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  L;.    if (CAfil
8e90: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20  e && !*CAfile). 
8ea0: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20         CAfile.  
8eb0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
8ec0: 20 20 69 66 20 28 43 41 64 69 72 20 26 26 20 21    if (CAdir && !
8ed0: 2a 43 41 64 69 72 29 09 20 20 20 20 20 20 20 20  *CAdir).        
8ee0: 43 41 64 69 72 09 20 20 20 20 20 20 20 20 3d 20  CAdir.        = 
8ef0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48  NULL;.    if (DH
8f00: 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61  params && !*DHpa
8f10: 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48  rams).        DH
8f20: 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20  params        = 
8f30: 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65  NULL;..    /* ne
8f40: 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20  w SSL state */. 
8f50: 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28     statePtr..= (
8f60: 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63  State *) ckalloc
8f70: 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65  ((unsigned) size
8f80: 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20  of(State));.    
8f90: 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c  memset(statePtr,
8fa0: 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65   0, sizeof(State
8fb0: 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74  ));..    statePt
8fc0: 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73  r->flags.= flags
8fd0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
8fe0: 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b  interp.= interp;
8ff0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 76  .    statePtr->v
9000: 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b 0a  flags.= verify;.
9010: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72      statePtr->er
9020: 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a 20  r.= "";..    /* 
9030: 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74 20  allocate script 
9040: 2a 2f 0a 20 20 20 20 69 66 20 28 63 6d 64 4f 62  */.    if (cmdOb
9050: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 28 76  j != NULL) {..(v
9060: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
9070: 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a  ngFromObj(cmdObj
9080: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
9090: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  n) {..    stateP
90a0: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 63  tr->callback = c
90b0: 6d 64 4f 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f  mdObj;..    Tcl_
90c0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
90d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
90e0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
90f0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73  /* allocate pass
9100: 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28  word */.    if (
9110: 70 61 73 73 77 64 4f 62 6a 20 21 3d 20 4e 55 4c  passwdObj != NUL
9120: 4c 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  L) {..(void) Tcl
9130: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
9140: 6a 28 70 61 73 73 77 64 4f 62 6a 2c 20 26 6c 65  j(passwdObj, &le
9150: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
9160: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
9170: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 64  assword = passwd
9180: 4f 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  Obj;..    Tcl_In
9190: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
91a0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
91b0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
91c0: 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61   allocate valida
91d0: 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  te command */.  
91e0: 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28    if (vcmd) {..(
91f0: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
9200: 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c  ingFromObj(vcmd,
9210: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
9220: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
9230: 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a  r->vcmd = vcmd;.
9240: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
9250: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
9260: 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  vcmd);..}.    }.
9270: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21  .    if (model !
9280: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d  = NULL) {..int m
9290: 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65  ode;../* Get the
92a0: 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74   "model" context
92b0: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
92c0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
92d0: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29  p, model, &mode)
92e0: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
92f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
9300: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
9310: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
9320: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
9330: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
9340: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
9350: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
9360: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
9370: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
9380: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
9390: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
93a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
93b0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
93c0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
93d0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
93e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
93f0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
9400: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
9410: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
9420: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
9430: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  nnel", NULL);.. 
9440: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
9450: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
9460: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48  ", "IMPORT", "CH
9470: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
9480: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
9490: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
94a0: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
94b0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
94c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
94d0: 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29  ctx = ((State *)
94e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
94f0: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
9500: 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c  )->ctx;.    } el
9510: 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d  se {..if ((ctx =
9520: 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50   CTX_Init(stateP
9530: 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74  tr, server, prot
9540: 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74  o, keyfile, cert
9550: 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c  file, key, cert,
9560: 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63   key_len,..    c
9570: 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20  ert_len, CAdir, 
9580: 43 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c  CAfile, ciphers,
9590: 20 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c   ciphersuites, l
95a0: 65 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29  evel, DHparams))
95b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
95c0: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
95d0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
95e0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
95f0: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
9600: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78     statePtr->ctx
9610: 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a   = ctx;..    /*.
9620: 20 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74       * We need t
9630: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
9640: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72   the channel wor
9650: 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f  ks in binary (fo
9660: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63  r the.     * enc
9670: 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67  ryption not to g
9680: 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20  et goofed up).. 
9690: 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61      * We only wa
96a0: 6e 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65  nt to adjust the
96b0: 20 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72   buffering in pr
96c0: 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77  e-v2 channels, w
96d0: 68 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68  here.     * each
96e0: 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20   channel in the 
96f0: 73 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64  stack maintained
9700: 20 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73   its own buffers
9710: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63  ..     */.    Tc
9720: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
9730: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
9740: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
9750: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
9760: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
9770: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
9780: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
9790: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
97a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
97b0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
97c0: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20  lEncoding);.    
97d0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
97e0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
97f0: 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26  n, "-eofchar", &
9800: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
9810: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  har);.    Tcl_Ge
9820: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
9830: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
9840: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72  ncoding", &upper
9850: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
9860: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
9870: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9880: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
9890: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43  lation", &upperC
98a0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
98b0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  n);.    Tcl_GetC
98c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
98d0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f  erp, chan, "-blo
98e0: 63 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68  cking", &upperCh
98f0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
9900: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
9910: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9920: 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61   chan, "-transla
9930: 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29  tion", "binary")
9940: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
9950: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9960: 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b  p, chan, "-block
9970: 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20  ing", "true");. 
9980: 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73     dprintf("Cons
9990: 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65  uming Tcl channe
99a0: 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68  l %s", Tcl_GetCh
99b0: 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29  annelName(chan))
99c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
99d0: 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b  self = Tcl_Stack
99e0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
99f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
9a00: 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ), (ClientData) 
9a10: 73 74 61 74 65 50 74 72 2c 20 28 54 43 4c 5f 52  statePtr, (TCL_R
9a20: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
9a30: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
9a40: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
9a50: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
9a60: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
9a70: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
9a80: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
9a90: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
9aa0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
9ab0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
9ac0: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
9ad0: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
9ae0: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
9af0: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
9b00: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
9b10: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
9b20: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
9b30: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
9b40: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
9b50: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
9b60: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
9b70: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
9b80: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
9b90: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
9ba0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20  Translation));. 
9bb0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
9bc0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9bd0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
9be0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
9bf0: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
9c00: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9c10: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ing));.    Tcl_S
9c20: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9c30: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
9c40: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61  ->self, "-eofcha
9c50: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
9c60: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
9c70: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
9c80: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
9c90: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
9ca0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
9cb0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
9cc0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
9cd0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
9ce0: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  g));..    /*.   
9cf0: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
9d00: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
9d10: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
9d20: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
9d30: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
9d40: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
9d50: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
9d60: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
9d90: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
9da0: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52 45 41 53  session: ", REAS
9db0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
9dc0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
9dd0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
9de0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
9df0: 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41  RT", "INIT", "FA
9e00: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
9e10: 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65  NULL);..Tls_Free
9e20: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
9e30: 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  tr);..return TCL
9e40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9e50: 20 20 20 2f 2a 20 53 65 74 20 68 6f 73 74 20 73     /* Set host s
9e60: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20  erver name */.  
9e70: 20 20 69 66 20 28 73 65 72 76 65 72 6e 61 6d 65    if (servername
9e80: 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20 74 68 65  ) {../* Sets the
9e90: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64   server name ind
9ea0: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 69 6e  ication (SNI) in
9eb0: 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 65 78 74   ClientHello ext
9ec0: 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a 20 50 65  ension */../* Pe
9ed0: 72 20 52 46 43 20 36 30 36 36 2c 20 68 6f 73 74  r RFC 6066, host
9ee0: 6e 61 6d 65 20 69 73 20 61 20 41 53 43 49 49 20  name is a ASCII 
9ef0: 65 6e 63 6f 64 65 64 20 73 74 72 69 6e 67 2c 20  encoded string, 
9f00: 74 68 6f 75 67 68 20 52 46 43 20 34 33 36 36 20  though RFC 4366 
9f10: 73 61 79 73 20 55 54 46 2d 38 2e 20 2a 2f 0a 09  says UTF-8. */..
9f20: 69 66 20 28 21 53 53 4c 5f 73 65 74 5f 74 6c 73  if (!SSL_set_tls
9f30: 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65 28 73 74  ext_host_name(st
9f40: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72  atePtr->ssl, ser
9f50: 76 65 72 6e 61 6d 65 29 20 26 26 20 72 65 71 75  vername) && requ
9f60: 69 72 65 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ire) {..    Tcl_
9f70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9f80: 65 72 70 2c 20 22 73 65 74 74 69 6e 67 20 54 4c  erp, "setting TL
9f90: 53 20 68 6f 73 74 20 6e 61 6d 65 20 65 78 74 65  S host name exte
9fa0: 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22 2c 20 28  nsion failed", (
9fb0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
9fc0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
9fd0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
9fe0: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53  S", "IMPORT", "S
9ff0: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  NI", "FAILED", (
a000: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
a010: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a020: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a030: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a040: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
a050: 53 65 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72  Set hostname for
a060: 20 70 65 65 72 20 63 65 72 74 69 66 69 63 61 74   peer certificat
a070: 65 20 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66  e hostname verif
a080: 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e  ication in clien
a090: 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73  ts...   Don't us
a0a0: 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20  e SSL_set1_host 
a0b0: 73 69 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d  since it has lim
a0c0: 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66  itations. */..if
a0d0: 20 28 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74   (!SSL_add1_host
a0e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
a0f0: 73 65 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09  servername)) {..
a100: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a110: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 65  sult(interp, "se
a120: 74 74 69 6e 67 20 44 4e 53 20 68 6f 73 74 20 6e  tting DNS host n
a130: 61 6d 65 20 66 61 69 6c 65 64 22 2c 20 28 63 68  ame failed", (ch
a140: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a150: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a160: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a170: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53  , "IMPORT", "HOS
a180: 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c 45 44 22  TNAME", "FAILED"
a190: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a1a0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
a1b0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a1c0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a1d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
a1e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75    }..    /* Resu
a1f0: 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f  me session id */
a200: 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e  .    if (session
a210: 5f 69 64 20 26 26 20 73 65 73 73 5f 6c 65 6e 20  _id && sess_len 
a220: 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43  <= SSL_MAX_SID_C
a230: 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a  TX_LENGTH) {../*
a240: 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e   SSL_set_session
a250: 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  () */..if (!SSL_
a260: 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f  SESSION_set1_id_
a270: 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65 74 5f  context(SSL_get_
a280: 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50 74 72  session(statePtr
a290: 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f  ->ssl), session_
a2a0: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  id, (unsigned in
a2b0: 74 29 20 73 65 73 73 5f 6c 65 6e 29 29 20 7b 0a  t) sess_len)) {.
a2c0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a2d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52  esult(interp, "R
a2e0: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64  esume session id
a2f0: 20 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20   ", session_id, 
a300: 22 20 66 61 69 6c 65 64 22 2c 20 28 63 68 61 72  " failed", (char
a310: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a320: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a330: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a340: 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49  "IMPORT", "SESSI
a350: 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ON", "FAILED", (
a360: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
a370: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a380: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a390: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a3a0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
a3b0: 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20  ..    /* Enable 
a3c0: 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65  Application-Laye
a3d0: 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  r Protocol Negot
a3e0: 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73  iation. Examples
a3f0: 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a   are: http/1.0,.
a400: 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  .http/1.1, h2, h
a410: 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f  3, ftp, imap, po
a420: 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c  p3, xmpp-client,
a430: 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71   xmpp-server, mq
a440: 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f  tt, irc, etc. */
a450: 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 4f 62 6a  .    if (alpnObj
a460: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20   != NULL) {../* 
a470: 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20 6c 69  Convert a TCL li
a480: 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63  st into a protoc
a490: 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72 65 2d  ol-list in wire-
a4a0: 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67  format */..unsig
a4b0: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 73  ned char *protos
a4c0: 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20  , *p;..unsigned 
a4d0: 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  int protos_len =
a4e0: 20 30 3b 0a 09 69 6e 74 20 69 2c 20 6c 65 6e 2c   0;..int i, len,
a4f0: 20 63 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a   cnt;..Tcl_Obj *
a500: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c  *list;...if (Tcl
a510: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
a520: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e  nts(interp, alpn
a530: 4f 62 6a 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74  Obj, &cnt, &list
a540: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
a550: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
a560: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
a570: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
a580: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
a590: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 65  Determine the me
a5a0: 6d 6f 72 79 20 72 65 71 75 69 72 65 64 20 66 6f  mory required fo
a5b0: 72 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  r the protocol-l
a5c0: 69 73 74 20 2a 2f 0a 09 66 6f 72 20 28 69 20 3d  ist */..for (i =
a5d0: 20 30 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b   0; i < cnt; i++
a5e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74  ) {..    Tcl_Get
a5f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69  StringFromObj(li
a600: 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20  st[i], &len);.. 
a610: 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 32 35 35     if (len > 255
a620: 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
a630: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a640: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 61  ALPN protocol na
a650: 6d 65 20 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63  me too long", (c
a660: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
a670: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
a680: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
a690: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
a6a0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
a6b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c  r *) NULL);...Tl
a6c0: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
a6d0: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
a6e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a6f0: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
a700: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 6c 65 6e  s_len += 1 + len
a710: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
a720: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
a730: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
a740: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
a750: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
a760: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
a770: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
a780: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
a790: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
a7a0: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 2c 20 70  /..for (i = 0, p
a7b0: 20 3d 20 70 72 6f 74 6f 73 3b 20 69 20 3c 20 63   = protos; i < c
a7c0: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
a7d0: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
a7e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
a7f0: 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29 3b  (list[i], &len);
a800: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 6c 65 6e  ..    *p++ = len
a810: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
a820: 20 73 74 72 2c 20 6c 65 6e 29 3b 0a 09 20 20 20   str, len);..   
a830: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
a840: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
a850: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
a860: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
a870: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
a880: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
a890: 69 6f 6e 73 20 72 65 76 65 72 73 65 73 20 74 68  ions reverses th
a8a0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
a8b0: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
a8c0: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
a8d0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
a8e0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
a8f0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
a900: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a910: 74 28 69 6e 74 65 72 70 2c 20 22 66 61 69 6c 65  t(interp, "faile
a920: 64 20 74 6f 20 73 65 74 20 41 4c 50 4e 20 70 72  d to set ALPN pr
a930: 6f 74 6f 63 6f 6c 73 22 2c 20 28 63 68 61 72 20  otocols", (char 
a940: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
a950: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
a960: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
a970: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
a980: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
a990: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a9a0: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
a9b0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a9c0: 20 20 63 6b 66 72 65 65 28 70 72 6f 74 6f 73 29    ckfree(protos)
a9d0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a9e0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
a9f0: 20 53 74 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73   Store protocols
aa00: 20 6c 69 73 74 20 2a 2f 0a 09 73 74 61 74 65 50   list */..stateP
aa10: 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f  tr->protos = pro
aa20: 74 6f 73 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  tos;..statePtr->
aa30: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f  protos_len = pro
aa40: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
aa50: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d  lse {..statePtr-
aa60: 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
aa70: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
aa80: 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d  s_len = 0;.    }
aa90: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
aaa0: 53 53 4c 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20  SSL Callbacks.  
aab0: 20 20 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65     */.    SSL_se
aac0: 74 5f 61 70 70 5f 64 61 74 61 28 73 74 61 74 65  t_app_data(state
aad0: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
aae0: 2a 29 73 74 61 74 65 50 74 72 29 3b 09 2f 2a 20  *)statePtr);./* 
aaf0: 70 6f 69 6e 74 20 62 61 63 6b 20 74 6f 20 75 73  point back to us
ab00: 20 2a 2f 0a 0a 20 20 20 20 53 53 4c 5f 73 65 74   */..    SSL_set
ab10: 5f 76 65 72 69 66 79 28 73 74 61 74 65 50 74 72  _verify(statePtr
ab20: 2d 3e 73 73 6c 2c 20 76 65 72 69 66 79 2c 20 56  ->ssl, verify, V
ab30: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 29 3b 0a  erifyCallback);.
ab40: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f      SSL_set_info
ab50: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
ab60: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c  tr->ssl, InfoCal
ab70: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
ab80: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73  Callback for obs
ab90: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  erving protocol 
aba0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e  messages */.#ifn
abb0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
abc0: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20  SL_TRACE.    /* 
abd0: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74  void SSL_CTX_set
abe0: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
abf0: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
ac00: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
ac10: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c  r);.    void SSL
ac20: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c  _CTX_set_msg_cal
ac30: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
ac40: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ctx, MessageCall
ac50: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53  back); */.    SS
ac60: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
ac70: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
ac80: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
ac90: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c  atePtr);.    SSL
aca0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
acb0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  k(statePtr->ssl,
acc0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
acd0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
ace0: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61  * Create Tcl_Cha
acf0: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72  nnel BIO Handler
ad00: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
ad10: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  ->p_bio.= BIO_ne
ad20: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20  w_tcl(statePtr, 
ad30: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20  BIO_NOCLOSE);.  
ad40: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09    statePtr->bio.
ad50: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f  = BIO_new(BIO_f_
ad60: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20  ssl());..    if 
ad70: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53  (server) {../* S
ad80: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  erver callbacks 
ad90: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
ada0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
adb0: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  e_arg(statePtr->
adc0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
add0: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58  tePtr);..SSL_CTX
ade0: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
adf0: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28  ername_callback(
ae00: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
ae10: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53  NICallback);..SS
ae20: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
ae30: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50  _hello_cb(stateP
ae40: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61  tr->ctx, HelloCa
ae50: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
ae60: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28  statePtr);..if (
ae70: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
ae80: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
ae90: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70   SSL_CTX_set_alp
aea0: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
aeb0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
aec0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
aed0: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64  )statePtr);.#ifd
aee0: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20  ef USE_NPN..    
aef0: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20  if (tls1_2 == 0 
af00: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
af10: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  {...SSL_CTX_set_
af20: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65  next_protos_adve
af30: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50  rtised_cb(stateP
af40: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c  tr->ctx, NPNCall
af50: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
af60: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a  atePtr);..    }.
af70: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45  #endif..}.../* E
af80: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20  nable server to 
af90: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73  send cert reques
afa0: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b  t after handshak
afb0: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29  e (TLS 1.3 only)
afc0: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20   */../* A write 
afd0: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74  operation must t
afe0: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68  ake place for th
aff0: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65  e Certificate Re
b000: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20  quest to be..   
b010: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65  sent to the clie
b020: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20  nt, this can be 
b030: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f  done with SSL_do
b040: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f  _handshake(). */
b050: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
b060: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
b070: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20  && tls1_3) {..  
b080: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69    SSL_verify_cli
b090: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61  ent_post_handsha
b0a0: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ke(statePtr->ssl
b0b0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61  );..}.../* set a
b0c0: 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73  utomatic curve s
b0d0: 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c  election */..SSL
b0e0: 5f 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73  _set_ecdh_auto(s
b0f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
b100: 3b 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65  ;.../* Set serve
b110: 72 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65  r mode */..state
b120: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c  Ptr->flags |= TL
b130: 53 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53  S_TCL_SERVER;..S
b140: 53 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74  SL_set_accept_st
b150: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
b160: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
b170: 0a 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c  ../* Client call
b180: 62 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20  backs */.#ifdef 
b190: 55 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61  USE_NPN..if (sta
b1a0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d  tePtr->protos !=
b1b0: 20 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20   NULL && tls1_2 
b1c0: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d  == 0 && tls1_3 =
b1d0: 3d 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  = 0) {..    SSL_
b1e0: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f  CTX_set_next_pro
b1f0: 74 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61  to_select_cb(sta
b200: 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e  tePtr->ctx, ALPN
b210: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
b220: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a  *)statePtr);..}.
b230: 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73  #endif.../* Sess
b240: 69 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09  ion caching */..
b250: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73  SSL_CTX_set_sess
b260: 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
b270: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53  tatePtr->ctx, SS
b280: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49  L_SESS_CACHE_CLI
b290: 45 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43  ENT | SSL_SESS_C
b2a0: 41 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c  ACHE_NO_INTERNAL
b2b0: 5f 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54  _STORE);..SSL_CT
b2c0: 58 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63  X_sess_set_new_c
b2d0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
b2e0: 20 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b   SessionCallback
b2f0: 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70  );.../* Enable p
b300: 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75  ost handshake Au
b310: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74  thentication ext
b320: 65 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20  ension. TLS 1.3 
b330: 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32  only, not http/2
b340: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
b350: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
b360: 61 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ake) {..    SSL_
b370: 73 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61  set_post_handsha
b380: 6b 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72  ke_auth(statePtr
b390: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09  ->ssl, 1);..}...
b3a0: 2f 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f  /* Set client mo
b3b0: 64 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63  de */..SSL_set_c
b3c0: 6f 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61  onnect_state(sta
b3d0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
b3e0: 20 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62   }.    SSL_set_b
b3f0: 69 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  io(statePtr->ssl
b400: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
b410: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62  o, statePtr->p_b
b420: 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74  io);.    BIO_set
b430: 5f 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62  _ssl(statePtr->b
b440: 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73  io, statePtr->ss
b450: 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  l, BIO_NOCLOSE);
b460: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
b470: 45 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a  End of SSL Init.
b480: 20 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69       */.    dpri
b490: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25  ntf("Returning %
b4a0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
b4b0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
b4c0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c  >self));.    Tcl
b4d0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
b4e0: 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f  p, (char *) Tcl_
b4f0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
b500: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
b510: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a  TCL_VOLATILE);..
b520: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
b530: 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61 20 3d  K;..clientData =
b540: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0c   clientData;.}..
b550: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
b560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
b5a0: 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d  UnimportObjCmd -
b5b0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
b5c0: 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65  cedure is invoke
b5d0: 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20  d to remove the 
b5e0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
b5f0: 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  filter.. *. * Re
b600: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
b610: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
b620: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
b630: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69  cts:. *.May modi
b640: 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20  fy the behavior 
b650: 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c  of an IO channel
b660: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
b670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
b6b0: 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f  tatic int.Unimpo
b6c0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
b6d0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
b6e0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b6f0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
b700: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
b710: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
b720: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
b730: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
b740: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
b750: 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  /..    dprintf("
b760: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
b770: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
b780: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
b790: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
b7a0: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
b7b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b7c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61  ;.    }..    cha
b7d0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
b7e0: 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  el(interp, Tcl_G
b7f0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b800: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
b810: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
b820: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
b830: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
b840: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
b850: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
b860: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
b870: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
b880: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
b890: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
b8a0: 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c  n);..    if (Tcl
b8b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
b8c0: 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
b8d0: 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
b8e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b8f0: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
b900: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
b910: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
b920: 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
b930: 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e   TLS channel", N
b940: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b950: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b960: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d  rp, "TLS", "UNIM
b970: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
b980: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
b990: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
b9a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b9b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
b9c0: 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e 6e 65  cl_UnstackChanne
b9d0: 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 20  l(interp, chan) 
b9e0: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a  == TCL_ERROR) {.
b9f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
ba00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  R;.    }..    re
ba10: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
ba20: 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
ba30: 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
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 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e  ---. *. * CTX_In
ba90: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20  it -- construct 
baa0: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  a SSL_CTX instan
bab0: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ce. *. * Results
bac0: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c  :. *.A valid SSL
bad0: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72  _CTX instance or
bae0: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64   NULL.. *. * Sid
baf0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
bb00: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e  nstructs SSL con
bb10: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb60: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53  ---. */.static S
bb70: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69  SL_CTX *.CTX_Ini
bb80: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
bb90: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
bba0: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
bbb0: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20   *keyfile, char 
bbc0: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75  *certfile,.    u
bbd0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
bbe0: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
bbf0: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f   *cert, int key_
bc00: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65  len, int cert_le
bc10: 6e 2c 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a  n, char *CAdir,.
bc20: 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65      char *CAfile
bc30: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  , char *ciphers,
bc40: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
bc50: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
bc60: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20  char *DHparams) 
bc70: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
bc80: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65   *interp = state
bc90: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
bca0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
bcb0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
bcc0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63  tring ds;.    Tc
bcd0: 6c 5f 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20  l_DString ds1;. 
bce0: 20 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a     int off = 0;.
bcf0: 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69      int load_pri
bd00: 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f  vate_key;.    co
bd10: 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a  nst SSL_METHOD *
bd20: 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72  method;..    dpr
bd30: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
bd40: 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29  .    if (!proto)
bd50: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
bd60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f  sult(interp, "no
bd70: 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20   valid protocol 
bd80: 73 65 6c 65 63 74 65 64 22 2c 20 4e 55 4c 4c 29  selected", NULL)
bd90: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
bda0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
bdb0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
bdc0: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
bdd0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
bde0: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
bdf0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
be00: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
be10: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
be20: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
be30: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
be40: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
be50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
be60: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
be70: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
be80: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
be90: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
bea0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
beb0: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
bec0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
bed0: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  L3).    if (ENAB
bee0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
bef0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54  ROTO_SSL3)) {..T
bf00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
bf10: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72  interp, "SSL3 pr
bf20: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
bf30: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
bf40: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
bf50: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
bf60: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
bf70: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
bf80: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66  _NO_TLS1).    if
bf90: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
bfa0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
bfb0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
bfc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
bfd0: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
bfe0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
bff0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
c000: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
c010: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
c020: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
c030: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
c040: 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45  LS1_1).    if (E
c050: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
c060: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29  S_PROTO_TLS1_1))
c070: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
c080: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
c090: 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.1 protocol n
c0a0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e  ot supported", N
c0b0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
c0c0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
c0d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
c0e0: 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e  TLS1_2) || defin
c0f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c100: 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_2).    if (EN
c110: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
c120: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20  _PROTO_TLS1_2)) 
c130: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
c140: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
c150: 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.2 protocol no
c160: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
c170: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
c180: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
c190: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
c1a0: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
c1b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
c1c0: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_3).    if (ENA
c1d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
c1e0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b  PROTO_TLS1_3)) {
c1f0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
c200: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
c210: 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.3 protocol not
c220: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c   supported", NUL
c230: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
c240: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c250: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
c260: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c  0) {../* Use ful
c270: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f  l range */..SSL_
c280: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
c290: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30  o_version(ctx, 0
c2a0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c2b0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
c2c0: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d  n(ctx, 0);.    }
c2d0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72  ..    switch (pr
c2e0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53  oto) {.#if OPENS
c2f0: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
c300: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
c310: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
c320: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
c330: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
c340: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
c350: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68  ROTO_SSL2:..meth
c360: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
c370: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv2_server_met
c380: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c  hod() : SSLv2_cl
c390: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
c3a0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
c3b0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
c3c0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
c3d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
c3e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c3f0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
c400: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
c410: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d  S_PROTO_SSL3:..m
c420: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
c430: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f   ? SSLv3_server_
c440: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33  method() : SSLv3
c450: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
c460: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
c470: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c480: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
c490: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
c4a0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
c4b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
c4c0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
c4d0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
c4e0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
c4f0: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76  ver ? TLSv1_serv
c500: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
c510: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Sv1_client_metho
c520: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
c530: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
c540: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
c550: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c560: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
c570: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c580: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
c590: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
c5a0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
c5b0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
c5c0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f   TLSv1_1_server_
c5d0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
c5e0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _1_client_method
c5f0: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
c600: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
c610: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
c620: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c630: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
c640: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c650: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
c660: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
c670: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68  TO_TLS1_2:..meth
c680: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
c690: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d  TLSv1_2_server_m
c6a0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
c6b0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
c6c0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
c6d0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
c6e0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
c6f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c700: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
c710: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
c720: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20  _3:../* Use the 
c730: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61  generic method a
c740: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61  nd constraint ra
c750: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78  nge after contex
c760: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  t is created */.
c770: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
c780: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
c790: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
c7a0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
c7b0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
c7c0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20     default:../* 
c7d0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73  Negotiate highes
c7e0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f  t available SSL/
c7f0: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09  TLS version */..
c800: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
c810: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
c820: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
c830: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23  ient_method();.#
c840: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
c850: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
c860: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
c870: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
c880: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c890: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c  _NO_SSL2)..off |
c8a0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
c8b0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
c8c0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
c8d0: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64  _NO_SSLv2);.#end
c8e0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
c8f0: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
c900: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c910: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL3)..off |= (E
c920: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
c930: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20  S_PROTO_SSL3)   
c940: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
c950: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv3);.#endif.#
c960: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
c970: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
c980: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
c990: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
c9a0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
c9b0: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20  OTO_TLS1)   ? 0 
c9c0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
c9d0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
c9e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
c9f0: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
ca00: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
ca10: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
ca20: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
ca30: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20  OTO_TLS1_1) ? 0 
ca40: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
ca50: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_1);.#endif.#if
ca60: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
ca70: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
ca80: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
ca90: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _2)..off |= (ENA
caa0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
cab0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
cac0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
cad0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
cae0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
caf0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
cb00: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
cb10: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_3)..off |= (E
cb20: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
cb30: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
cb40: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
cb50: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66  TLSv1_3);.#endif
cb60: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
cb70: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
cb80: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20  ror();..    ctx 
cb90: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
cba0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21  thod);.    if (!
cbb0: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e  ctx) {..return(N
cbc0: 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ULL);.    }..   
cbd0: 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b   if (getenv(SSLK
cbe0: 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53  EYLOGFILE)) {..S
cbf0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f  SL_CTX_set_keylo
cc00: 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20  g_callback(ctx, 
cc10: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b  KeyLogCallback);
cc20: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
cc30: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
cc40: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
cc50: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
cc60: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
cc70: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
cc80: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
cc90: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
cca0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
ccb0: 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54  ERSION);..SSL_CT
ccc0: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
ccd0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
cce0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  1_3_VERSION);.  
ccf0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
cd00: 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20  /* Force cipher 
cd10: 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20  selection order 
cd20: 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20  by server */.   
cd30: 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20   if (!isServer) 
cd40: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f  {..SSL_CTX_set_o
cd50: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f  ptions(ctx, SSL_
cd60: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52  OP_CIPHER_SERVER
cd70: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20  _PREFERENCE);.  
cd80: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
cd90: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
cda0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20  < 0x10100000L.  
cdb0: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c    OpenSSL_add_al
cdc0: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20  l_algorithms(); 
cdd0: 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20  /* Load ciphers 
cde0: 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23  and digests */.#
cdf0: 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43  endif..    SSL_C
ce00: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  TX_set_app_data(
ce10: 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65  ctx, (void*)inte
ce20: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72  rp);./* remember
ce30: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ce40: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
ce50: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ce60: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a   SSL_OP_ALL);./*
ce70: 20 61 6c 6c 20 53 53 4c 20 62 75 67 20 77 6f 72   all SSL bug wor
ce80: 6b 61 72 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20  karounds */.    
ce90: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
cea0: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
ceb0: 4e 4f 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b  NO_COMPRESSION);
cec0: 09 2f 2a 20 64 69 73 61 62 6c 65 20 63 6f 6d 70  ./* disable comp
ced0: 72 65 73 73 69 6f 6e 20 65 76 65 6e 20 69 66 20  ression even if 
cee0: 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20  supported */.   
cef0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
cf00: 69 6f 6e 73 28 63 74 78 2c 20 6f 66 66 29 3b 09  ions(ctx, off);.
cf10: 09 2f 2a 20 64 69 73 61 62 6c 65 20 70 72 6f 74  ./* disable prot
cf20: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f  ocol versions */
cf30: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
cf40: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
cf50: 31 30 31 30 31 30 30 30 4c 0a 20 20 20 20 53 53  10101000L.    SS
cf60: 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63  L_CTX_set_mode(c
cf70: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54  tx, SSL_MODE_AUT
cf80: 4f 5f 52 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e  O_RETRY);./* han
cf90: 64 6c 65 20 6e 65 77 20 68 61 6e 64 73 68 61 6b  dle new handshak
cfa0: 65 73 20 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64  es in background
cfb0: 2e 20 4f 6e 20 62 79 20 64 65 66 61 75 6c 74 20  . On by default 
cfc0: 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31  in OpenSSL 1.1.1
cfd0: 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20  . */.#endif.    
cfe0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
cff0: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c  _cache_size(ctx,
d000: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   128);..    /* S
d010: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  et user defined 
d020: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20  ciphers, cipher 
d030: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75  suites, and secu
d040: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
d050: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
d060: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
d070: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c  CTX_set_cipher_l
d080: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73  ist(ctx, ciphers
d090: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d0a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d0b0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c  Set ciphers fail
d0c0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
d0d0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
d0e0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
d0f0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
d100: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
d110: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75     if ((ciphersu
d120: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  ites != NULL) &&
d130: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
d140: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20  phersuites(ctx, 
d150: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b  ciphersuites)) {
d160: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d170: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
d180: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61  cipher suites fa
d190: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
d1a0: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
d1b0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
d1c0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
d1d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d1e0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63  ..    /* Set sec
d1f0: 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20  urity level */. 
d200: 20 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d     if (level > -
d210: 31 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20  1 && level < 6) 
d220: 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65  {../* SSL_set_se
d230: 63 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a  curity_level */.
d240: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63  .SSL_CTX_set_sec
d250: 75 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c  urity_level(ctx,
d260: 20 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a   level);.    }..
d270: 20 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20      /* set some 
d280: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20  callbacks */.   
d290: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
d2a0: 61 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63  ault_passwd_cb(c
d2b0: 74 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c  tx, PasswordCall
d2c0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43  back);.    SSL_C
d2d0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
d2e0: 61 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74  asswd_cb_userdat
d2f0: 61 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73  a(ctx, (void *)s
d300: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
d310: 2a 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d  * read a Diffie-
d320: 48 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65  Hellman paramete
d330: 72 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20  rs file, or use 
d340: 74 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65  the built-in one
d350: 20 2a 2f 0a 23 69 66 64 65 66 20 4f 50 45 4e 53   */.#ifdef OPENS
d360: 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20  SL_NO_DH.    if 
d370: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
d380: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
d390: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d3a0: 44 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70  DH parameter sup
d3b0: 70 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62  port not availab
d3c0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
d3d0: 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  LL);..SSL_CTX_fr
d3e0: 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e  ee(ctx);..return
d3f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c   NULL;.    }.#el
d400: 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68  se.    {..DH* dh
d410: 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20  ;..if (DHparams 
d420: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
d430: 42 49 4f 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54  BIO *bio;..    T
d440: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d450: 64 73 29 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20  ds);..    bio = 
d460: 42 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e  BIO_new_file(F2N
d470: 28 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c  (DHparams, &ds),
d480: 20 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28   "r");..    if (
d490: 21 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53  !bio) {...Tcl_DS
d4a0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
d4b0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d4c0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
d4d0: 64 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61  d not find DH pa
d4e0: 72 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20  rameters file", 
d4f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d500: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
d510: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
d520: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  LL;..    }...   
d530: 20 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62   dh = PEM_read_b
d540: 69 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c  io_DHparams(bio,
d550: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
d560: 4c 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65  L);..    BIO_fre
d570: 65 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c  e(bio);..    Tcl
d580: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
d590: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29  );..    if (!dh)
d5a0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
d5b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
d5c0: 6f 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48  ould not read DH
d5d0: 20 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d   parameters from
d5e0: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
d5f0: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
d600: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
d610: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
d620: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20   }..} else {..  
d630: 20 20 64 68 20 3d 20 67 65 74 5f 64 68 50 61 72    dh = get_dhPar
d640: 61 6d 73 28 29 3b 0a 09 7d 0a 09 53 53 4c 5f 43  ams();..}..SSL_C
d650: 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63 74  TX_set_tmp_dh(ct
d660: 78 2c 20 64 68 29 3b 0a 09 44 48 5f 66 72 65 65  x, dh);..DH_free
d670: 28 64 68 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  (dh);.    }.#end
d680: 69 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f  if..    /* set o
d690: 75 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  ur certificate *
d6a0: 2f 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61  /.    load_priva
d6b0: 74 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20  te_key = 0;.    
d6c0: 69 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20  if (certfile != 
d6d0: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
d6e0: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a  ivate_key = 1;..
d6f0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74  .Tcl_DStringInit
d700: 28 26 64 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c  (&ds);...if (SSL
d710: 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69  _CTX_use_certifi
d720: 63 61 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 46  cate_file(ctx, F
d730: 32 4e 28 63 65 72 74 66 69 6c 65 2c 20 26 64 73  2N(certfile, &ds
d740: 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  ), SSL_FILETYPE_
d750: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  PEM) <= 0) {..  
d760: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
d770: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
d780: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d790: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
d7a0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
d7b0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
d7c0: 65 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20  e, ": ",....    
d7d0: 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72   REASON(), (char
d7e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
d7f0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
d800: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e  );..    return N
d810: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
d820: 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e  se if (cert != N
d830: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
d840: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69  vate_key = 1;..i
d850: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
d860: 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28  ertificate_ASN1(
d870: 63 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63  ctx, cert_len, c
d880: 65 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20  ert) <= 0) {..  
d890: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
d8a0: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
d8b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d8c0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
d8d0: 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65   set certificate
d8e0: 3a 20 22 2c 0a 09 09 09 20 20 20 20 20 52 45 41  : ",....     REA
d8f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
d900: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
d910: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
d920: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
d930: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
d940: 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68  ..certfile = (ch
d950: 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66  ar*)X509_get_def
d960: 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29  ault_cert_file()
d970: 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f  ;...if (SSL_CTX_
d980: 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f  use_certificate_
d990: 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69  file(ctx, certfi
d9a0: 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  le, SSL_FILETYPE
d9b0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69  _PEM) <= 0) {.#i
d9c0: 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  f 0..    Tcl_DSt
d9d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
d9e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
d9f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
da00: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
da10: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
da20: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
da30: 2c 20 22 3a 20 22 2c 0a 09 09 09 20 20 20 20 20  , ": ",....     
da40: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
da50: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
da60: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
da70: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
da80: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20  LL;.#endif..}.  
da90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
daa0: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20  our private key 
dab0: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f  */.    if (load_
dac0: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09  private_key) {..
dad0: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
dae0: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55  ULL && key == NU
daf0: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69  LL) {..    keyfi
db00: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
db10: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20  }...if (keyfile 
db20: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
db30: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61  /* get the priva
db40: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  te key associate
db50: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74  d with this cert
db60: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
db70: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
db80: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65  ULL) {...keyfile
db90: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20   = certfile;..  
dba0: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53    }...    if (SS
dbb0: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
dbc0: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46  eKey_file(ctx, F
dbd0: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29  2N(keyfile, &ds)
dbe0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
dbf0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  EM) <= 0) {...Tc
dc00: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
dc10: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
dc20: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
dc30: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
dc40: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
dc50: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
dc60: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
dc70: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
dc80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
dc90: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
dca0: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
dcb0: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69  ey file ", keyfi
dcc0: 6c 65 2c 20 22 20 22 2c 0a 09 09 09 20 20 20 20  le, " ",....    
dcd0: 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20 28       REASON(), (
dce0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
dcf0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
dd00: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
dd10: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  L;..    }..    T
dd20: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
dd30: 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69 66  ds);...} else if
dd40: 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20 7b   (key != NULL) {
dd50: 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54  ..    if (SSL_CT
dd60: 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79  X_use_PrivateKey
dd70: 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f 52  _ASN1(EVP_PKEY_R
dd80: 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65 79  SA, ctx, key,key
dd90: 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _len) <= 0) {...
dda0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
ddb0: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
ddc0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
ddd0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
dde0: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
ddf0: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
de00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
de10: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
de20: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
de30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
de40: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
de50: 20 6b 65 79 3a 20 22 2c 20 52 45 41 53 4f 4e 28   key: ", REASON(
de60: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
de70: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
de80: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
de90: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d   NULL;..    }..}
dea0: 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77  ../* Now we know
deb0: 20 74 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20   that a key and 
dec0: 63 65 72 74 20 68 61 76 65 20 62 65 65 6e 20 73  cert have been s
ded0: 65 74 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74  et against.. * t
dee0: 68 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  he SSL context *
def0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f  /..if (!SSL_CTX_
df00: 63 68 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65  check_private_ke
df10: 79 28 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54  y(ctx)) {..    T
df20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
df30: 69 6e 74 65 72 70 2c 20 22 70 72 69 76 61 74 65  interp, "private
df40: 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61   key does not ma
df50: 74 63 68 20 74 68 65 20 63 65 72 74 69 66 69 63  tch the certific
df60: 61 74 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c  ate public key",
df70: 0a 09 09 09 20 20 20 20 20 28 63 68 61 72 20 2a  ....     (char *
df80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
df90: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
dfa0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
dfb0: 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  L;..}.    }..   
dfc0: 20 2f 2a 20 53 65 74 20 76 65 72 69 66 69 63 61   /* Set verifica
dfd0: 74 69 6f 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20  tion CAs */.    
dfe0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
dff0: 26 64 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  &ds);.    Tcl_DS
e000: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
e010: 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 69 73  .    /* There is
e020: 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 64 69 72   one default dir
e030: 65 63 74 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61  ectory, one defa
e040: 75 6c 74 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e  ult file, and on
e050: 65 20 64 65 66 61 75 6c 74 20 73 74 6f 72 65 2e  e default store.
e060: 0a 09 54 68 65 20 64 65 66 61 75 6c 74 20 43 41  ..The default CA
e070: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 64 69   certificates di
e080: 72 65 63 74 6f 72 79 20 28 61 6e 64 20 64 65 66  rectory (and def
e090: 61 75 6c 74 20 73 74 6f 72 65 29 20 69 73 20 69  ault store) is i
e0a0: 6e 20 74 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63  n the OpenSSL..c
e0b0: 65 72 74 73 20 64 69 72 65 63 74 6f 72 79 2e 20  erts directory. 
e0c0: 49 74 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69  It can be overri
e0d0: 64 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f  dden by the SSL_
e0e0: 43 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72  CERT_DIR env var
e0f0: 2e 20 54 68 65 0a 09 64 65 66 61 75 6c 74 20 43  . The..default C
e100: 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66  A certificates f
e110: 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65  ile is called ce
e120: 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65  rt.pem in the de
e130: 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64  fault OpenSSL..d
e140: 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e  irectory. It can
e150: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
e160: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46  y the SSL_CERT_F
e170: 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a  ILE env var. */.
e180: 09 2f 2a 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f  ./* int SSL_CTX_
e190: 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69  set_default_veri
e1a0: 66 79 5f 64 69 72 28 53 53 4c 5f 43 54 58 20 2a  fy_dir(SSL_CTX *
e1b0: 63 74 78 29 20 61 6e 64 20 69 6e 74 20 53 53 4c  ctx) and int SSL
e1c0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
e1d0: 5f 76 65 72 69 66 79 5f 66 69 6c 65 28 53 53 4c  _verify_file(SSL
e1e0: 5f 43 54 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20  _CTX *ctx) */.  
e1f0: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c    if (!SSL_CTX_l
e200: 6f 61 64 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74  oad_verify_locat
e210: 69 6f 6e 73 28 63 74 78 2c 20 46 32 4e 28 43 41  ions(ctx, F2N(CA
e220: 66 69 6c 65 2c 20 26 64 73 29 2c 20 46 32 4e 28  file, &ds), F2N(
e230: 43 41 64 69 72 2c 20 26 64 73 31 29 29 20 7c 7c  CAdir, &ds1)) ||
e240: 0a 09 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64  ..!SSL_CTX_set_d
e250: 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61  efault_verify_pa
e260: 74 68 73 28 63 74 78 29 29 20 7b 0a 23 69 66 20  ths(ctx)) {.#if 
e270: 30 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  0..Tcl_DStringFr
e280: 65 65 28 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53  ee(&ds);..Tcl_DS
e290: 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b  tringFree(&ds1);
e2a0: 0a 09 2f 2a 20 44 6f 6e 27 74 20 63 75 72 72 65  ../* Don't curre
e2b0: 6e 74 6c 79 20 63 61 72 65 20 69 66 20 74 68 69  ntly care if thi
e2c0: 73 20 66 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f  s fails */..Tcl_
e2d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e2e0: 65 72 70 2c 20 22 53 53 4c 20 64 65 66 61 75 6c  erp, "SSL defaul
e2f0: 74 20 76 65 72 69 66 79 20 70 61 74 68 73 3a 20  t verify paths: 
e300: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  ", REASON(), (ch
e310: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
e320: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e330: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23  ..return NULL;.#
e340: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
e350: 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72   /* https://sour
e360: 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c  ceforge.net/p/tl
e370: 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20 20  s/bugs/57/ */.  
e380: 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c    /* XXX:TODO: L
e390: 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70  et the user supp
e3a0: 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69  ly values here i
e3b0: 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68  nstead of someth
e3c0: 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20  ing that exists 
e3d0: 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  on the filesyste
e3e0: 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41 66  m */.    if (CAf
e3f0: 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
e400: 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
e410: 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d  ME) *certNames =
e420: 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74   SSL_load_client
e430: 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66  _CA_file(F2N(CAf
e440: 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66 20  ile, &ds));..if 
e450: 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55  (certNames != NU
e460: 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43  LL) {..    SSL_C
e470: 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41  TX_set_client_CA
e480: 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e  _list(ctx, certN
e490: 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ames);..}.    }.
e4a0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
e4b0: 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20 54  Free(&ds);.    T
e4c0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
e4d0: 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ds1);.    return
e4e0: 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   ctx;.}.../*. *-
e4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e530: 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f  --. *. * StatusO
e540: 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20  bjCmd -- return 
e550: 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
e560: 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a  connected peer..
e570: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
e580: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
e590: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
e5a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
e5b0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
e5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
e5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
e600: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74  */.static int.St
e610: 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  atusObjCmd(Clien
e620: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
e630: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
e640: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
e650: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
e660: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61  bjv[]) {.    Sta
e670: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20  te *statePtr;.  
e680: 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20    X509 *peer;.  
e690: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
e6a0: 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e  r;.    Tcl_Chann
e6b0: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61  el chan;.    cha
e6c0: 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20  r *channelName, 
e6d0: 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e  *ciphers;.    in
e6e0: 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73  t mode;.    cons
e6f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
e700: 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69  *proto;.    unsi
e710: 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  gned int len;.  
e720: 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a    int nid, res;.
e730: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
e740: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
e750: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a  (objc < 2 || obj
e760: 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d  c > 3 || (objc =
e770: 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54  = 3 && !strcmp(T
e780: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
e790: 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29  v[1]), "-local")
e7a0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
e7b0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
e7c0: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c  , objv, "?-local
e7d0: 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65  ? channel");..re
e7e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e7f0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
e800: 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a  t channel Id */.
e810: 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20      channelName 
e820: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
e830: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a  romObj(objv[(obj
e840: 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d  c == 2 ? 1 : 2)]
e850: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 63 68 61  , NULL);.    cha
e860: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
e870: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
e880: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
e890: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
e8a0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
e8b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
e8c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
e8d0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
e8e0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
e8f0: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
e900: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
e910: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
e920: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
e930: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
e940: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
e950: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
e960: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
e970: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
e980: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
e990: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
e9a0: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
e9b0: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
e9c0: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
e9d0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
e9e0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41  erp, "TLS", "STA
e9f0: 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  TUS", "CHANNEL",
ea00: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
ea10: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
ea20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ea30: 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74     }.    statePt
ea40: 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63  r = (State *) Tc
ea50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
ea60: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
ea70: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74  .    /* Get cert
ea80: 69 66 69 63 61 74 65 20 66 6f 72 20 70 65 65 72  ificate for peer
ea90: 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20   or self */.    
eaa0: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
eab0: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
eac0: 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63 61 74  _peer_certificat
ead0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
eae0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
eaf0: 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  peer = SSL_get_c
eb00: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
eb10: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
eb20: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 58 35 30  ..    /* Get X50
eb30: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e  9 certificate in
eb40: 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 65  fo */.    if (pe
eb50: 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20  er) {..objPtr = 
eb60: 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69  Tls_NewX509Obj(i
eb70: 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a 09 69  nterp, peer);..i
eb80: 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
eb90: 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
eba0: 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
ebb0: 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
ebc0: 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
ebd0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
ebe0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
ebf0: 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
ec00: 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
ec10: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
ec20: 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22  jPtr, "peername"
ec30: 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e  , SSL_get0_peern
ec40: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
ec50: 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  l), -1);.    LAP
ec60: 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
ec70: 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22   objPtr, "sbits"
ec80: 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  , SSL_get_cipher
ec90: 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
eca0: 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20  ssl, NULL));..  
ecb0: 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
ecc0: 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
ecd0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
ece0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
ecf0: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
ed00: 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68  , "cipher", ciph
ed10: 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  ers, -1);..    /
ed20: 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
ed30: 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
ed40: 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
ed50: 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  eer */.    LAPPE
ed60: 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
ed70: 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65  bjPtr, "verifyRe
ed80: 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72  sult",..X509_ver
ed90: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
eda0: 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
edb0: 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
edc0: 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
edd0: 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
ede0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64   mode */.    mod
edf0: 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  e = SSL_get_veri
ee00: 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  fy_mode(statePtr
ee10: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  ->ssl);.    if (
ee20: 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
ee30: 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50  FY_NONE) {..LAPP
ee40: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
ee50: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
ee60: 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ode", "none", -1
ee70: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
ee80: 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62  .Tcl_Obj *listOb
ee90: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
eea0: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
eeb0: 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
eec0: 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a  _VERIFY_PEER) {.
eed0: 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
eee0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
eef0: 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
ef00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
ef10: 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b  bj("peer", -1));
ef20: 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
ef30: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
ef40: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
ef50: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
ef60: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
ef70: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
ef80: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
ef90: 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20  ingObj("fail if 
efa0: 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d  no peer cert", -
efb0: 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
efc0: 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
efd0: 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09  CLIENT_ONCE) {..
efe0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
eff0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
f000: 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
f010: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
f020: 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c  j("client once",
f030: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
f040: 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
f050: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
f060: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
f070: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f080: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
f090: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
f0a0: 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
f0b0: 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
f0c0: 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
f0d0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
f0e0: 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
f0f0: 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
f100: 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
f110: 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
f120: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
f130: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
f140: 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
f150: 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
f160: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
f170: 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
f180: 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
f190: 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
f1a0: 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
f1b0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
f1c0: 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
f1d0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
f1e0: 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
f1f0: 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
f200: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f210: 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
f220: 29 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20 6c 65  )proto, (int) le
f230: 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  n);.    LAPPEND_
f240: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
f250: 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
f260: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
f270: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20  statePtr->ssl), 
f280: 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  -1);..    /* Val
f290: 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73  id for non-RSA s
f2a0: 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53  ignature and TLS
f2b0: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28   1.3 */.    if (
f2c0: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65  objc == 2) {..re
f2d0: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  s = SSL_get_peer
f2e0: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
f2f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
f300: 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  id);.    } else 
f310: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
f320: 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73  _signature_nid(s
f330: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
f340: 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
f350: 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
f360: 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
f370: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
f380: 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61  tr, "signatureHa
f390: 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42  shAlgorithm", OB
f3a0: 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d  J_nid2ln(nid), -
f3b0: 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  1);..    if (obj
f3c0: 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
f3d0: 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
f3e0: 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
f3f0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
f400: 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
f410: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
f420: 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  et_signature_typ
f430: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
f440: 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
f450: 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
f460: 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c  {nid = 0;}.    L
f470: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
f480: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e  p, objPtr, "sign
f490: 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f  atureType", OBJ_
f4a0: 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
f4b0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
f4c0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
f4d0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
f4e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
f4f0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
f500: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
f510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f550: 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74  --. *. * Connect
f560: 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d  ionInfoObjCmd --
f570: 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69   return connecti
f580: 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65  on info from Ope
f590: 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
f5a0: 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f  lts:. *.A list o
f5b0: 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  f connection inf
f5c0: 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  o.  *. *--------
f5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
f610: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e  .static int Conn
f620: 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
f630: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
f640: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
f650: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
f660: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
f670: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
f680: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
f690: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
f6a0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
f6b0: 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61  de on */.    Sta
f6c0: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
f6d0: 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
f6e0: 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
f6f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
f700: 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  jPtr, *listPtr;.
f710: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73      const SSL *s
f720: 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  sl;.    const SS
f730: 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  L_CIPHER *cipher
f740: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
f750: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
f760: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
f770: 4d 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20  MD *md;..    if 
f780: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54  (objc != 2) {..T
f790: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f7a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f7b0: 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65   "channel");..re
f7c0: 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
f7d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
f7e0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
f7f0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
f800: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
f810: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 4e  bjv[1], NULL), N
f820: 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
f830: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
f840: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
f850: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
f860: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
f870: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
f880: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
f890: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
f8a0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
f8b0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
f8c0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
f8d0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
f8e0: 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
f8f0: 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
f900: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
f910: 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
f920: 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
f930: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
f940: 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20  .    "\": not a 
f950: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55  TLS channel", NU
f960: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
f970: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
f980: 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f  TLS", "CONNECTIO
f990: 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  N", "CHANNEL", "
f9a0: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
f9b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
f9c0: 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20  n(TCL_ERROR);.  
f9d0: 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20    }..    objPtr 
f9e0: 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
f9f0: 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20  (0, NULL);..    
fa00: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  /* Connection in
fa10: 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50  fo */.    stateP
fa20: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
fa30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
fa40: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
fa50: 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74 65 50      ssl = stateP
fa60: 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20  tr->ssl;.    if 
fa70: 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl != NULL) {.
fa80: 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73  ./* connection s
fa90: 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  tate */..LAPPEND
faa0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
fab0: 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20 53 53  Ptr, "state", SS
fac0: 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c  L_state_string_l
fad0: 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  ong(ssl), -1);..
fae0: 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65 71 75  ./* Get SNI requ
faf0: 65 73 74 65 64 20 73 65 72 76 65 72 20 6e 61 6d  ested server nam
fb00: 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
fb10: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
fb20: 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22 2c 20  , "servername", 
fb30: 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e 61  SSL_get_serverna
fb40: 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e  me(ssl, TLSEXT_N
fb50: 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d  AMETYPE_host_nam
fb60: 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  e), -1);.../* Ge
fb70: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c  t protocol */..L
fb80: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
fb90: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
fba0: 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76  ocol", SSL_get_v
fbb0: 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29  ersion(ssl), -1)
fbc0: 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61  ;.../* Renegotia
fbd0: 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a  tion allowed */.
fbe0: 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
fbf0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
fc00: 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c  enegotiation_all
fc10: 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73  owed", SSL_get_s
fc20: 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69 61 74  ecure_renegotiat
fc30: 69 6f 6e 5f 73 75 70 70 6f 72 74 28 73 73 6c 29  ion_support(ssl)
fc40: 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75  );.../* Get secu
fc50: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c  rity level */..L
fc60: 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
fc70: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75  p, objPtr, "secu
fc80: 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c  rity_level", SSL
fc90: 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65  _get_security_le
fca0: 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  vel(ssl));.../* 
fcb0: 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  Session info */.
fcc0: 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
fcd0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
fce0: 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20  ession_reused", 
fcf0: 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73  SSL_session_reus
fd00: 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49  ed(ssl));.../* I
fd10: 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  s server info */
fd20: 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
fd30: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
fd40: 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f  is_server", SSL_
fd50: 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b  is_server(ssl));
fd60: 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f  .../* Is DTLS */
fd70: 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
fd80: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
fd90: 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73  is_dtls", SSL_is
fda0: 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20  _dtls(ssl));.   
fdb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65   }..    /* Ciphe
fdc0: 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69  r info */.    ci
fdd0: 70 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63  pher = SSL_get_c
fde0: 75 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73  urrent_cipher(ss
fdf0: 6c 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  l);.    if (ciph
fe00: 65 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63  er != NULL) {..c
fe10: 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20  har buf[BUFSIZ] 
fe20: 3d 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73  = {0};..int bits
fe30: 2c 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a  , alg_bits;.../*
fe40: 20 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a   Cipher name */.
fe50: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
fe60: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
fe70: 70 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45  pher", SSL_CIPHE
fe80: 52 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65  R_get_name(ciphe
fe90: 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46  r), -1);.../* RF
fea0: 43 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72  C name of cipher
feb0: 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
fec0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
fed0: 20 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22   "standard_name"
fee0: 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61  , SSL_CIPHER_sta
fef0: 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65  ndard_name(ciphe
ff00: 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70  r), -1);.../* Op
ff10: 65 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69  enSSL name of ci
ff20: 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  pher */..LAPPEND
ff30: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
ff40: 50 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61  Ptr, "openssl_na
ff50: 6d 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70  me", OPENSSL_cip
ff60: 68 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50  her_name(SSL_CIP
ff70: 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d  HER_standard_nam
ff80: 65 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  e(cipher)), -1);
ff90: 0a 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .../* number of 
ffa0: 73 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64  secret bits used
ffb0: 20 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09   for cipher */..
ffc0: 62 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45  bits = SSL_CIPHE
ffd0: 52 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65  R_get_bits(ciphe
ffe0: 72 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09  r, &alg_bits);..
fff0: 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
10000 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
10010 72 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29  ret_bits", bits)
10020 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  ;..LAPPEND_INT(i
10030 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10040 61 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c  algorithm_bits",
10050 20 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20   alg_bits);../* 
10060 61 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75  alg_bits is actu
10070 61 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69  al key secret bi
10080 74 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20  ts. If use bits 
10090 61 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f  and secret (algo
100a0 72 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66  rithm) bits diff
100b0 65 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74  er,..   the rest
100c0 20 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65   of the bits are
100d0 20 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72   fixed, i.e. for
100e0 20 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20   limited export 
100f0 63 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20  ciphers (bits < 
10100 35 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69  56) */.../* Indi
10110 63 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f  cates which SSL/
10120 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72  TLS protocol ver
10130 73 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e  sion first defin
10140 65 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f  ed the cipher */
10150 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10160 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d  terp, objPtr, "m
10170 69 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c  in_version", SSL
10180 5f 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73  _CIPHER_get_vers
10190 69 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29  ion(cipher), -1)
101a0 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49  ;.../* Cipher NI
101b0 44 2c 20 64 69 67 65 73 74 20 4e 49 44 20 28 6e  D, digest NID (n
101c0 6f 6e 65 20 66 6f 72 20 41 45 41 44 20 63 69 70  one for AEAD cip
101d0 68 65 72 20 73 75 69 74 65 73 29 2c 20 4b 65 79  her suites), Key
101e0 20 45 78 63 68 61 6e 67 65 20 4e 49 44 2c 20 61   Exchange NID, a
101f0 6e 64 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  nd authenticatio
10200 6e 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e  n NID */..LAPPEN
10210 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10220 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e 49 44  jPtr, "cipherNID
10230 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
10240 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
10250 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69 64 28  _get_cipher_nid(
10260 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09  cipher)), -1);..
10270 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10280 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 69 67  rp, objPtr, "dig
10290 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  estNID", (char *
102a0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
102b0 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67 65 73  CIPHER_get_diges
102c0 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  t_nid(cipher)), 
102d0 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
102e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
102f0 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65 4e 49  , "keyExchangeNI
10300 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
10310 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
10320 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63 69 70  R_get_kx_nid(cip
10330 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
10340 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10350 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68 65 6e   objPtr, "authen
10360 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20 28 63  ticationNID", (c
10370 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
10380 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
10390 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65 72 29  auth_nid(cipher)
103a0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d 65 73  ), -1);.../* mes
103b0 73 61 67 65 20 61 75 74 68 65 6e 74 69 63 61 74  sage authenticat
103c0 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70 68 65  ion code - Ciphe
103d0 72 20 69 73 20 41 45 41 44 20 28 65 2e 67 2e 20  r is AEAD (e.g. 
103e0 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32 30 2f  GCM or ChaCha20/
103f0 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e 6f 74  Poly1305) or not
10400 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e 74 69   */../* Authenti
10410 63 61 74 65 64 20 45 6e 63 72 79 70 74 69 6f 6e  cated Encryption
10420 20 77 69 74 68 20 61 73 73 6f 63 69 61 74 65 64   with associated
10430 20 64 61 74 61 20 28 41 45 41 44 29 20 63 68 65   data (AEAD) che
10440 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ck */..LAPPEND_B
10450 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
10460 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73 5f 61  tr, "cipher_is_a
10470 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  ead", SSL_CIPHER
10480 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65 72 29  _is_aead(cipher)
10490 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e  );.../* Get Open
104a0 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c  SSL-specific ID,
104b0 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a   not IANA ID */.
104c0 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
104d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
104e0 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20  pher_id", (int) 
104f0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
10500 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
10510 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65   Two-byte ID use
10520 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f  d in the TLS pro
10530 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76  tocol of the giv
10540 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  en cipher */..LA
10550 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
10560 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f  , objPtr, "proto
10570 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  col_id", (int) S
10580 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72  SL_CIPHER_get_pr
10590 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72  otocol_id(cipher
105a0 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c  ));.../* Textual
105b0 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
105c0 74 68 65 20 63 69 70 68 65 72 2e 20 49 6e 63 6c  the cipher. Incl
105d0 75 64 65 73 3a 20 63 69 70 68 65 72 20 6e 61 6d  udes: cipher nam
105e0 65 2c 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  e, protocol vers
105f0 69 6f 6e 2c 20 6b 65 79 0a 09 20 20 20 65 78 63  ion, key..   exc
10600 68 61 6e 67 65 2c 20 61 75 74 68 65 6e 74 69 63  hange, authentic
10610 61 74 69 6f 6e 2c 20 73 79 6d 6d 65 74 72 69 63  ation, symmetric
10620 20 65 6e 63 72 79 70 74 69 6f 6e 20 6d 65 74 68   encryption meth
10630 6f 64 2c 20 6d 65 73 73 61 67 65 20 61 75 74 68  od, message auth
10640 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
10650 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43 49 50 48  */..if (SSL_CIPH
10660 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e 28 63  ER_description(c
10670 69 70 68 65 72 2c 20 62 75 66 2c 20 73 69 7a 65  ipher, buf, size
10680 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
10690 29 20 7b 0a 09 20 20 20 20 4c 41 50 50 45 4e 44  ) {..    LAPPEND
106a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
106b0 50 74 72 2c 20 22 64 65 73 63 72 69 70 74 69 6f  Ptr, "descriptio
106c0 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b 0a 09 7d  n", buf, -1);..}
106d0 0a 0a 09 2f 2a 20 44 69 67 65 73 74 20 75 73 65  .../* Digest use
106e0 64 20 64 75 72 69 6e 67 20 74 68 65 20 53 53 4c  d during the SSL
106f0 2f 54 4c 53 20 68 61 6e 64 73 68 61 6b 65 20 77  /TLS handshake w
10700 68 65 6e 20 75 73 69 6e 67 20 74 68 65 20 63 69  hen using the ci
10710 70 68 65 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53  pher. */..md = S
10720 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 68 61  SL_CIPHER_get_ha
10730 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 28 63  ndshake_digest(c
10740 69 70 68 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44  ipher);..LAPPEND
10750 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10760 50 74 72 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f  Ptr, "handshake_
10770 64 69 67 65 73 74 22 2c 20 28 63 68 61 72 20 2a  digest", (char *
10780 29 45 56 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29  )EVP_MD_name(md)
10790 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  , -1);.    }..  
107a0 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66    /* Session inf
107b0 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  o */.    session
107c0 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69   = SSL_get_sessi
107d0 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  on(ssl);.    if 
107e0 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c  (session != NULL
107f0 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  ) {..const unsig
10800 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74  ned char *ticket
10810 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a  ;..size_t len2;.
10820 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c  .unsigned int ul
10830 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67  en;..const unsig
10840 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
10850 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63  n_id, *proto;..c
10860 68 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d  har buffer[SSL_M
10870 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45  AX_MASTER_KEY_LE
10880 4e 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f  NGTH];.../* Repo
10890 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  rt the selected 
108a0 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65  protocol as a re
108b0 73 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e  sult of the ALPN
108c0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
108d0 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
108e0 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
108f0 73 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c  session, &proto,
10900 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
10910 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10920 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
10930 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69  har *) proto, (i
10940 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  nt) len2);.../* 
10950 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
10960 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
10970 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
10980 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
10990 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
109a0 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
109b0 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
109c0 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
109d0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
109e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
109f0 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72  tr, "npn", (char
10a00 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29   *) proto, (int)
10a10 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a   ulen);.#endif..
10a20 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65  ./* Resumable se
10a30 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e  ssion */..LAPPEN
10a40 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
10a50 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c  bjPtr, "resumabl
10a60 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
10a70 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73  is_resumable(ses
10a80 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73  sion));.../* Ses
10a90 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20  sion start time 
10aa0 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65  (seconds since e
10ab0 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e  poch) */..LAPPEN
10ac0 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f  D_LONG(interp, o
10ad0 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69  bjPtr, "start_ti
10ae0 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e  me", SSL_SESSION
10af0 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f  _get_time(sessio
10b00 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75  n));.../* Timeou
10b10 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54  t value - SSL_CT
10b20 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69  X_get_timeout (i
10b30 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c  n seconds) */..L
10b40 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
10b50 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d  rp, objPtr, "tim
10b60 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49  eout", SSL_SESSI
10b70 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73  ON_get_timeout(s
10b80 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
10b90 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76  ession id - TLSv
10ba0 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e  1.2 and below on
10bb0 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69  ly */..session_i
10bc0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
10bd0 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20  get_id(session, 
10be0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
10bf0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
10c00 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
10c10 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  _id", session_id
10c20 2c 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a  , (int) ulen);..
10c30 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74  ./* Session cont
10c40 65 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f  ext */..session_
10c50 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
10c60 5f 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74  _get0_id_context
10c70 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
10c80 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
10c90 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
10ca0 2c 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65  , "session_conte
10cb0 78 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  xt", session_id,
10cc0 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09   (int) ulen);...
10cd0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
10ce0 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
10cf0 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
10d00 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
10d10 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
10d20 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
10d30 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
10d40 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74  jPtr, "session_t
10d50 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20  icket", ticket, 
10d60 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  (int) len2);.../
10d70 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
10d80 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28   lifetime hint (
10d90 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09  in seconds) */..
10da0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
10db0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69  erp, objPtr, "li
10dc0 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53  fetime", SSL_SES
10dd0 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
10de0 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
10df0 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69  ssion));.../* Ti
10e00 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f  cket app data */
10e10 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
10e20 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74  t0_ticket_appdat
10e30 61 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  a(session, &tick
10e40 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
10e50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
10e60 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63  rp, objPtr, "tic
10e70 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74  ket_app_data", t
10e80 69 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e  icket, (int) len
10e90 32 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73  2);.../* Get mas
10ea0 74 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32  ter key */..len2
10eb0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
10ec0 65 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65  et_master_key(se
10ed0 73 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53  ssion, buffer, S
10ee0 53 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45  SL_MAX_MASTER_KE
10ef0 59 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50  Y_LENGTH);..LAPP
10f00 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
10f10 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74  p, objPtr, "mast
10f20 65 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c  er_key", buffer,
10f30 20 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09   (int) len2);...
10f40 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
10f50 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69  d */..unsigned i
10f60 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  nt id = SSL_SESS
10f70 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73  ION_get_compress
10f80 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c  _id(session);..L
10f90 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10fa0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
10fb0 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20  ression_id", id 
10fc0 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20  == 1 ? "zlib" : 
10fd0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
10fe0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
10ff0 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
11000 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
11010 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
11020 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
11030 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
11040 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
11050 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
11060 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
11070 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
11080 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
11090 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
110a0 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53  sl);...LAPPEND_S
110b0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
110c0 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
110d0 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d  , comp ? SSL_COM
110e0 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29  P_get_name(comp)
110f0 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
11100 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11110 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
11120 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f  pansion", expn ?
11130 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
11140 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65  me(expn) : "none
11150 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c  ", -1);.#else..L
11160 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11170 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
11180 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  ression", "none"
11190 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
111a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
111b0 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c  tr, "expansion",
111c0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
111d0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
111e0 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
111f0 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f  /.    {..long mo
11200 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
11210 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
11220 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
11230 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a  x);..char *msg;.
11240 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  ..if (mode & SSL
11250 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
11260 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f   {..    msg = "o
11270 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ff";..} else if 
11280 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
11290 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b  _CACHE_CLIENT) {
112a0 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69  ..    msg = "cli
112b0 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ent";..} else if
112c0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
112d0 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
112e0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65  {..    msg = "se
112f0 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69  rver";..} else i
11300 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
11310 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b  SS_CACHE_BOTH) {
11320 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74  ..    msg = "bot
11330 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  h";..} else {.. 
11340 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77     msg = "unknow
11350 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  n";..}..LAPPEND_
11360 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11370 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63  tr, "session_cac
11380 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d  he_mode", msg, -
11390 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
113a0 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20  * CA List */.   
113b0 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72   /* IF not a ser
113c0 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c  ver, same as SSL
113d0 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69  _get0_peer_CA_li
113e0 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61  st. If server sa
113f0 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65  me as SSL_CTX_ge
11400 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
11410 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20   */.    listPtr 
11420 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
11430 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53  (0, NULL);.    S
11440 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
11450 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20  E) *ca_list;.   
11460 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20   if ((ca_list = 
11470 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  SSL_get_client_C
11480 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20  A_list(ssl)) != 
11490 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
114a0 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 0a 09  ffer[BUFSIZ];...
114b0 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
114c0 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  i < sk_X509_NAME
114d0 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69  _num(ca_list); i
114e0 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f  ++) {..    X509_
114f0 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f  NAME *name = sk_
11500 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28  X509_NAME_value(
11510 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20  ca_list, i);..  
11520 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09    if (name) {...
11530 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e  X509_NAME_onelin
11540 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20  e(name, buffer, 
11550 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c  BUFSIZ);...Tcl_L
11560 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
11570 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
11580 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
11590 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31  ngObj(buffer, -1
115a0 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20  ));..    }..}.  
115b0 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f    }.    LAPPEND_
115c0 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OBJ(interp, objP
115d0 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69  tr, "caList", li
115e0 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50  stPtr);.    LAPP
115f0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
11600 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43  objPtr, "caListC
11610 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e  ount", sk_X509_N
11620 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29  AME_num(ca_list)
11630 29 3b 0a 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  );...    Tcl_Set
11640 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11650 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
11660 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
11670 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
11680 6e 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ntData;.}.../*. 
11690 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
116a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
116d0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
116e0 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
116f0 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
11700 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
11710 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
11720 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
11730 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
11740 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
11750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11780 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
11790 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
117a0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
117b0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
117c0 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
117d0 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
117e0 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
117f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
11800 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
11810 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
11820 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
11830 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
11840 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
11850 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
11860 20 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b   int cmd, isStr;
11870 0a 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72  .    char buffer
11880 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70  [16384];..    dp
11890 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
118a0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
118b0 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   2) {..Tcl_Wrong
118c0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
118d0 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d  1, objv, "subcom
118e0 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09  mand ?args?");..
118f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11900 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11910 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
11920 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
11930 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22  [1], commands, "
11940 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d  command", 0, &cm
11950 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  d) != TCL_OK) {.
11960 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11970 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
11980 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
11990 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63  ..    isStr = (c
119a0 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b  md == C_STRREQ);
119b0 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
119c0 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29  um command) cmd)
119d0 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a   {..case C_REQ:.
119e0 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20  .case C_STRREQ: 
119f0 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20  {..    EVP_PKEY 
11a00 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *pkey=NULL;..   
11a10 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c   X509 *cert=NULL
11a20 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  ;..    X509_NAME
11a30 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20   *name=NULL;..  
11a40 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74    Tcl_Obj **list
11a50 76 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74  v;..    int list
11a60 63 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  c,i;...    BIO *
11a70 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
11a80 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
11a90 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
11aa0 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
11ab0 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
11ac0 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
11ad0 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
11ae0 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
11af0 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
11b00 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50  ays=365;..#if OP
11b10 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
11b20 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
11b30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a  0L..    BIGNUM *
11b40 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  bne = NULL;..   
11b50 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
11b60 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50  ;.#else..    EVP
11b70 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d  _PKEY_CTX *ctx =
11b80 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09   NULL;.#endif...
11b90 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
11ba0 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
11bb0 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
11bc0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
11bd0 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
11be0 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
11bf0 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
11c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
11c10 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
11c20 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
11c30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
11c40 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
11c50 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
11c60 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
11c70 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
11c80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11c90 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
11ca0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
11cb0 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69  objv[4]);..    i
11cc0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63  f (isStr) {...Tc
11cd0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
11ce0 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09  keyout,"",0);...
11cf0 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
11d00 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,pemout,"",0);.
11d10 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
11d20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66  (objc>=6) {...if
11d30 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
11d40 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
11d50 20 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69   objv[5],....&li
11d60 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
11d70 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
11d80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11d90 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
11da0 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
11db0 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
11dc0 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
11dd0 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
11de0 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
11df0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
11e00 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
11e10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
11e20 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
11e30 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
11e40 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
11e50 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
11e60 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
11e70 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
11e80 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
11e90 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
11ea0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
11eb0 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
11ec0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
11ed0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
11ee0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
11ef0 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
11f00 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
11f10 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
11f20 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
11f30 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
11f40 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
11f50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
11f60 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
11f70 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
11f80 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
11f90 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
11fa0 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
11fb0 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
11fc0 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
11fd0 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
11fe0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
11ff0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
12000 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
12010 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
12020 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
12030 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
12040 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
12050 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
12060 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
12070 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
12080 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
12090 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
120a0 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
120b0 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
120c0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
120d0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
120e0 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
120f0 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
12100 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
12110 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
12120 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
12130 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
12140 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
12150 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
12160 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
12170 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
12180 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
12190 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
121a0 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
121b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
121c0 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
121d0 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
121e0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
121f0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
12200 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
12210 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
12220 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
12230 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
12240 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
12250 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
12260 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
12270 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
12280 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
12290 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
122a0 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
122b0 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
122c0 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
122d0 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
122e0 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
122f0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
12300 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
12310 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
12320 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
12330 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
12340 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
12350 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
12360 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
12370 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
12380 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
12390 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
123a0 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
123b0 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
123c0 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
123d0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
123e0 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
123f0 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
12400 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
12410 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
12420 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
12430 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
12440 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
12450 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
12460 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
12470 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
12480 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
12490 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
124a0 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
124b0 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
124c0 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
124d0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
124e0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
124f0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
12500 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
12510 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
12520 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
12530 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
12540 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
12550 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
12560 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
12570 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
12580 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
12590 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
125a0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
125b0 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
125c0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
125d0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
125e0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
125f0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
12600 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
12610 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
12620 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
12630 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
12640 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
12650 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
12660 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
12670 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
12680 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
12690 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
126a0 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
126b0 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
126c0 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
126d0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
126e0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
126f0 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
12700 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
12710 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
12720 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
12730 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
12740 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
12750 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
12760 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
12770 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
12780 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12790 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
127a0 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
127b0 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
127c0 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f   return(TCL_ERRO
127d0 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  R);...}....X509_
127e0 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74  set_version(cert
127f0 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45  ,2);...ASN1_INTE
12800 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74  GER_set(X509_get
12810 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65  _serialNumber(ce
12820 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58  rt),serial);...X
12830 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
12840 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f  509_getm_notBefo
12850 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
12860 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
12870 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65  509_getm_notAfte
12880 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30  r(cert),(long)60
12890 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09  *60*24*days);...
128a0 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28  X509_set_pubkey(
128b0 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e  cert,pkey);....n
128c0 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62  ame=X509_get_sub
128d0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b  ject_name(cert);
128e0 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ....X509_NAME_ad
128f0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
12900 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e  ame,"C", MBSTRIN
12910 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
12920 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
12930 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _C, -1, -1, 0);.
12940 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
12950 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
12960 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47  e,"ST", MBSTRING
12970 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
12980 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
12990 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  ST, -1, -1, 0);.
129a0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
129b0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
129c0 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"L", MBSTRING_
129d0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
129e0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c  gned char *) k_L
129f0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
12a00 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
12a10 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
12a20 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "O", MBSTRING_AS
12a30 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
12a40 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20  ed char *) k_O, 
12a50 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
12a60 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
12a70 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
12a80 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  U", MBSTRING_ASC
12a90 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
12aa0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20  d char *) k_OU, 
12ab0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
12ac0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
12ad0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
12ae0 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  N", MBSTRING_ASC
12af0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
12b00 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20  d char *) k_CN, 
12b10 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
12b20 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
12b30 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45  y_by_txt(name,"E
12b40 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  mail", MBSTRING_
12b50 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
12b60 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45  gned char *) k_E
12b70 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  mail, -1, -1, 0)
12b80 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75  ;....X509_set_su
12b90 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c  bject_name(cert,
12ba0 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58  name);....if (!X
12bb0 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b  509_sign(cert,pk
12bc0 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29  ey,EVP_sha256())
12bd0 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66  ) {...    X509_f
12be0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20  ree(cert);...   
12bf0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
12c00 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
12c10 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
12c20 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
12c30 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
12c40 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
12c50 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
12c60 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e  terp,"Error sign
12c70 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22  ing certificate"
12c80 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
12c90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12ca0 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72  ..}....if (isStr
12cb0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
12cc0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
12cd0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
12ce0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
12cf0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d  ,cert);...    i=
12d00 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
12d10 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
12d20 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
12d30 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
12d40 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
12d50 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
12d60 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
12d70 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
12d80 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
12d90 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
12da0 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
12db0 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
12dc0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
12dd0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
12de0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
12df0 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20  t,pemout);...   
12e00 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58   PEM_write_bio_X
12e10 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09  509(out,cert);..
12e20 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c  .    BIO_free_al
12e30 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58  l(out);...}....X
12e40 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
12e50 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
12e60 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
12e70 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12e80 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12e90 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
12ea0 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d  #endif..    }..}
12eb0 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ..break;.    def
12ec0 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20  ault:..break;.  
12ed0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
12ee0 43 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61  CL_OK;..clientDa
12ef0 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b  ta = clientData;
12f00 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
12f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
12f20 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
12f30 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
12f40 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
12f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12f90 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
12fa0 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
12fb0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
12fc0 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
12fd0 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
12fe0 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
12ff0 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
13000 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
13010 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
13020 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
13030 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13040 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
13050 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
13060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
130a0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
130b0 46 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b  Free(char *block
130c0 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
130d0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
130e0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
130f0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13100 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
13110 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
13120 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
13130 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
13140 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13180 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
13190 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
131a0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
131b0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
131c0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
131d0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
131e0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
131f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
13200 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
13210 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
13220 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
13230 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
13240 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
13250 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
13260 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
13270 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
13280 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
13290 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
132a0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
132b0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132f0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
13300 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
13310 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
13320 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13330 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
13340 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
13350 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
13360 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
13370 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
13380 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
13390 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
133a0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
133b0 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
133c0 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
133d0 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
133e0 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
133f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
13400 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
13410 29 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74  ) {..ckfree(stat
13420 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09  ePtr->protos);..
13430 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
13440 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
13450 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
13460 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73  >bio) {../* This
13470 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73   will call SSL_s
13480 68 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31  hutdown. Bug 141
13490 34 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66  4045 */..dprintf
134a0 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25  ("BIO_free_all(%
134b0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62  p)", statePtr->b
134c0 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61  io);..BIO_free_a
134d0 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ll(statePtr->bio
134e0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69  );..statePtr->bi
134f0 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  o = NULL;.    }.
13500 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
13510 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
13520 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
13530 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
13540 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
13550 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
13560 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
13570 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
13580 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20  (statePtr->ctx) 
13590 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  {..SSL_CTX_free(
135a0 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
135b0 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d  .statePtr->ctx =
135c0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
135d0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
135e0 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f  allback) {..Tcl_
135f0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
13600 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
13610 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  ;..statePtr->cal
13620 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  lback = NULL;.  
13630 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
13640 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20  ePtr->password) 
13650 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  {..Tcl_DecrRefCo
13660 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61  unt(statePtr->pa
13670 73 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50  ssword);..stateP
13680 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e  tr->password = N
13690 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
136a0 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
136b0 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
136c0 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
136d0 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74  >vcmd);..statePt
136e0 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a  r->vcmd = NULL;.
136f0 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e      }..    dprin
13700 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b  tf("Returning");
13710 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
13720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13760 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
13770 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
13780 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
13790 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
137a0 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
137b0 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
137c0 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
137d0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
137e0 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
137f0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
13800 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
13810 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
13820 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
13830 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
13840 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
13850 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
13860 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
13870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c  ---------. */.DL
138b0 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
138c0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
138d0 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63  *interp) {.    c
138e0 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
138f0 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
13900 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
13910 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
13920 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  };..    dprintf(
13930 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
13940 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
13950 4e 20 3e 20 38 0a 23 69 66 64 65 66 20 55 53 45  N > 8.#ifdef USE
13960 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69  _TCL_STUBS.    i
13970 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  f (Tcl_InitStubs
13980 28 69 6e 74 65 72 70 2c 20 22 39 2e 30 22 2c 20  (interp, "9.0", 
13990 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  0) == NULL) {..r
139a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
139b0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
139c0 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71    if (Tcl_PkgReq
139d0 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63  uire(interp, "Tc
139e0 6c 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29 20 3d  l", "9.0-", 0) =
139f0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
13a00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
13a10 20 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20   }.#else.#ifdef 
13a20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20  USE_TCL_STUBS.  
13a30 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74    if (Tcl_InitSt
13a40 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 35  ubs(interp, "8.5
13a50 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ", 0) == NULL) {
13a60 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13a70 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
13a80 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67  .    if (Tcl_Pkg
13a90 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
13aa0 22 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c 20 30  "Tcl", "8.5-", 0
13ab0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
13ac0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13ad0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
13ae0 20 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74    if (TlsLibInit
13af0 28 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  (0) != TCL_OK) {
13b00 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
13b10 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
13b20 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  d not initialize
13b30 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e   SSL library", N
13b40 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
13b50 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
13b60 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
13b70 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
13b80 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f   "tls::connectio
13b90 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
13ba0 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
13bb0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
13bc0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
13bd0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
13be0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13bf0 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61  interp, "tls::ha
13c00 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
13c10 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  akeObjCmd, (Clie
13c20 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
13c30 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
13c40 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
13c50 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
13c60 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69  (interp, "tls::i
13c70 6d 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62  mport", ImportOb
13c80 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
13c90 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
13ca0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
13cb0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
13cc0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
13cd0 72 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c  rp, "tls::misc",
13ce0 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c   MiscObjCmd, (Cl
13cf0 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63  ientData) 0, (Tc
13d00 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
13d10 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
13d20 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
13d30 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
13d40 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d  :unimport", Unim
13d50 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
13d60 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
13d70 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
13d80 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
13d90 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
13da0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
13db0 73 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f  status", StatusO
13dc0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
13dd0 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44  ta) 0, (Tcl_CmdD
13de0 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
13df0 4c 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 44 69 67  L);..    Tls_Dig
13e00 65 73 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65  estCommands(inte
13e10 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 45 6e 63  rp);.    Tls_Enc
13e20 72 79 70 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74  ryptCommands(int
13e30 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e  erp);.    Tls_In
13e40 66 6f 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72  foCommands(inter
13e50 70 29 3b 0a 20 20 20 20 54 6c 73 5f 4b 65 79 43  p);.    Tls_KeyC
13e60 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29 3b  ommands(interp);
13e70 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72 70  ..    if (interp
13e80 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69 6e  ) {..Tcl_Eval(in
13e90 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74  terp, tlsTclInit
13ea0 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a 0a  Script);.    }..
13eb0 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 50      return Tcl_P
13ec0 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72 70  kgProvide(interp
13ed0 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20  , PACKAGE_NAME, 
13ee0 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 29  PACKAGE_VERSION)
13ef0 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
13f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f30 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65  *. *. *.Tls_Safe
13f40 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d  Init --. *. *.--
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 2a 0a  --------------*.
13f80 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f 63   *.Standard proc
13f90 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20 62  edure required b
13fa0 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e 69  y 'load'.. *.Ini
13fb0 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65 78  tializes this ex
13fc0 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73 61  tension for a sa
13fd0 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  fe interpreter..
13fe0 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *.-------------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20  ---*. *. *.Side 
14020 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73 20  effects:. *..As 
14030 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
14040 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
14050 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 65  A standard Tcl e
14060 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a  rror code.. *. *
14070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140a0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45  ------*. */.DLLE
140b0 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61  XPORT int Tls_Sa
140c0 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  feInit(Tcl_Inter
140d0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
140e0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
140f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54  ");.    return(T
14100 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 29  ls_Init(interp))
14110 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14150 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e  *. *. *.TlsLibIn
14160 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d  it --. *. *.----
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
141a0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c  .Initializes SSL
141b0 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65   library once pe
141c0 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a  r application. *
141d0 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .---------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14200 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65 66  -*. *. *.Side ef
14210 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74 69  fects:. *..initi
14220 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
14230 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a  ry. *. *.Result:
14240 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  . *..none. *. *-
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14280 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69  -----*. */.stati
14290 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74  c int TlsLibInit
142a0 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a  (int uninitializ
142b0 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  e) {.    static 
142c0 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
142d0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74 61  = 0;.    int sta
142e0 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23 69  tus = TCL_OK;.#i
142f0 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  f defined(OPENSS
14300 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65  L_THREADS) && de
14310 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44  fined(TCL_THREAD
14320 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e 75  S).    size_t nu
14330 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66 0a  m_locks;.#endif.
14340 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74 69  .    if (uniniti
14350 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21 69  alize) {..if (!i
14360 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 20  nitialized) {.. 
14370 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b 65     dprintf("Aske
14380 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69 7a  d to uninitializ
14390 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e 6f  e, but we are no
143a0 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29 3b  t initialized");
143b0 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54 43  ...    return(TC
143c0 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72 69  L_OK);..}...dpri
143d0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
143e0 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23  initialize");..#
143f0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
14400 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14410 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14420 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  DS)..Tcl_MutexLo
14430 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09  ck(&init_mx);...
14440 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20  if (locks) {..  
14450 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09    free(locks);..
14460 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c      locks = NULL
14470 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  ;..    locksCoun
14480 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66  t = 0;..}.#endif
14490 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ..initialized = 
144a0 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
144b0 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
144c0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
144d0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
144e0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
144f0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
14500 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20 20  turn(TCL_OK);.  
14510 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69    }..    if (ini
14520 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72  tialized) {..dpr
14530 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75  intf("Called, bu
14540 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76  t using cached v
14550 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 28  alue");..return(
14560 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a 0a  status);.    }..
14570 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14580 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
14590 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
145a0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
145b0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
145c0 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26   Tcl_MutexLock(&
145d0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
145e0 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64  .    initialized
145f0 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 1;..#if defin
14600 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
14610 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
14620 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
14630 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20  num_locks = 1;. 
14640 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20     locksCount = 
14650 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  (int) num_locks;
14660 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c  .    locks = mal
14670 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b  loc(sizeof(*lock
14680 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
14690 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b  .    memset(lock
146a0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f  s, 0, sizeof(*lo
146b0 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73  cks) * num_locks
146c0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
146d0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54  * Initialize BOT
146e0 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20  H libcrypto and 
146f0 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f  libssl. */.    O
14700 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28  PENSSL_init_ssl(
14710 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
14720 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20  D_SSL_STRINGS | 
14730 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41  OPENSSL_INIT_LOA
14740 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53  D_CRYPTO_STRINGS
14750 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ..| OPENSSL_INIT
14760 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53  _ADD_ALL_CIPHERS
14770 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f   | OPENSSL_INIT_
14780 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c  ADD_ALL_DIGESTS,
14790 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f   NULL);..    BIO
147a0 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30  _new_tcl(NULL, 0
147b0 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a  );..#if 0.    /*
147c0 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f  .     * XXX:TODO
147d0 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f  : Remove this co
147e0 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69  de and replace i
147f0 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20  t with a check. 
14800 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68      * for enough
14810 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20   entropy and do 
14820 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61 74  not try to creat
14830 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a  e our own.     *
14840 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70   terrible entrop
14850 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a  y.     */.    /*
14860 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68 65  .     * Seed the
14870 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67   random number g
14880 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20  enerator in the 
14890 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20  SSL library,.   
148a0 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f    * using the do
148b0 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74  /while construct
148c0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
148d0 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a  bug note in the.
148e0 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46       * OpenSSL F
148f0 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77  AQ at http://www
14900 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70  .openssl.org/sup
14910 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53  port/faq.html#US
14920 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ER1.     *.     
14930 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74 68  * The crux of th
14940 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61  e problem is tha
14950 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73  t Solaris 7 does
14960 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20   not have a.    
14970 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f   * /dev/random o
14980 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64  r /dev/urandom d
14990 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e  evice so it cann
149a0 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68  ot gather enough
149b0 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20  .     * entropy 
149c0 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65  from the RAND_se
149d0 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e  ed() when TLS in
149e0 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65  itializes and re
149f0 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20  fuses.     * to 
14a00 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c  go further. Earl
14a10 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ier versions of 
14a20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20  OpenSSL carried 
14a30 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20  on regardless.. 
14a40 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64      */.    srand
14a50 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20  ((unsigned int) 
14a60 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20  time((time_t *) 
14a70 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b  NULL));.    do {
14a80 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20  ..for (i = 0; i 
14a90 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20  < 16; i++) {..  
14aa0 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20    rnd_seed[i] = 
14ab0 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e  1 + (char) (255.
14ac0 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44  0 * rand()/(RAND
14ad0 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09  _MAX+1.0));..}..
14ae0 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65  RAND_seed(rnd_se
14af0 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73  ed, sizeof(rnd_s
14b00 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69  eed));.    } whi
14b10 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28  le (RAND_status(
14b20 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a  ) != 1);.#endif.
14b30 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
14b40 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
14b50 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
14b60 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78  EADS)..Tcl_Mutex
14b70 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  Unlock(&init_mx)
14b80 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72  ;.#endif...retur
14b90 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a           n(status);.}.