Hex Artifact Content

Artifact 0db9f8be2414d78db9bb7475c8c7637f93bb7ab796c8b15c9803334a247034d8:


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 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
74c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7500: 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d   ImportObjCmd --
7510: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
7520: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
7530: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
7540: 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  "ssl" command. *
7550: 0a 20 2a 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d  . *.The ssl comm
7560: 61 6e 64 20 70 75 73 68 65 73 20 53 53 4c 20 6f  and pushes SSL o
7570: 76 65 72 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e  ver a (newly con
7580: 6e 65 63 74 65 64 29 20 74 63 70 20 73 6f 63 6b  nected) tcp sock
7590: 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  et. *. * Results
75a0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
75b0: 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
75c0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
75d0: 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68   *.May modify th
75e0: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e  e behavior of an
75f0: 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a   IO channel.. *.
7600: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7640: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
7650: 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d   int.ImportObjCm
7660: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
7670: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
7680: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
7690: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
76a0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
76b0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
76c0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
76d0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
76e0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53  ode on. */.    S
76f0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09  tate *statePtr;.
7700: 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65  ./* client state
7710: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
7720: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a  */.    SSL_CTX *
7730: 63 74 78 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ctx.        = NU
7740: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
7750: 2a 73 63 72 69 70 74 09 20 20 20 20 20 20 20 20  *script.        
7760: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
7770: 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 20 20  Obj *password.  
7780: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
7790: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09    Tcl_Obj *vcmd.
77a0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
77b0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
77c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
77d0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
77e0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
77f0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
7800: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
7810: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
7820: 74 20 69 64 78 2c 20 6c 65 6e 3b 0a 20 20 20 20  t idx, len;.    
7830: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20  int flags..     
7840: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49     = TLS_TCL_INI
7850: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
7860: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09  r..        = 0;.
7870: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
7880: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
7890: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
78a0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20  ar *keyfile.    
78b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
78c0: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20  char *certfile. 
78d0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
78e0: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
78f0: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a   *key  .= NULL;.
7900: 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20      int key_len 
7910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7920: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
7930: 64 20 63 68 61 72 20 2a 63 65 72 74 20 20 20 20  d char *cert    
7940: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
7950: 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 20 20 20   int cert_len   
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 20 30               = 0
7970: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
7980: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
7990: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  LL;.    char *ci
79a0: 70 68 65 72 73 75 69 74 65 73 09 20 20 20 20 20  phersuites.     
79b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
79c0: 68 61 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20  har *CAfile.    
79d0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
79e0: 63 68 61 72 20 2a 43 41 64 69 72 09 09 20 20 20  char *CAdir..   
79f0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
7a00: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09   char *DHparams.
7a10: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
7a20: 20 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09      char *model.
7a30: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
7a40: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76 65  .    char *serve
7a50: 72 6e 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20  rname.        = 
7a60: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
7a70: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
7a80: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
7a90: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
7aa0: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
7ab0: 5f 69 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  _id = NULL;.    
7ac0: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d  Tcl_Obj *alpn..=
7ad0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
7ae0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
7af0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
7b00: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
7b10: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
7b20: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
7b30: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65   proto = 0, leve
7b40: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  l = -1;.    int 
7b50: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75  verify = 0, requ
7b60: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74  ire = 0, request
7b70: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73   = 1, post_hands
7b80: 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64  hake = 0;..    d
7b90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
7ba0: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  ;..#if defined(N
7bb0: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
7bc0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7bd0: 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20 30  S1).    tls1 = 0
7be0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
7bf0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
7c00: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
7c10: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20  SL_NO_TLS1_1).  
7c20: 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65    tls1_1 = 0;.#e
7c30: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
7c40: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
7c50: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7c60: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c  O_TLS1_2).    tl
7c70: 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66  s1_2 = 0;.#endif
7c80: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7c90: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
7ca0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7cb0: 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f 33  S1_3).    tls1_3
7cc0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
7cd0: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20    if (objc < 2) 
7ce0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
7cf0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
7d00: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f  bjv, "channel ?o
7d10: 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75  ptions?");..retu
7d20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7d30: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7d40: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7d50: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
7d60: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
7d70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
7d80: 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c  Obj(objv[1], NUL
7d90: 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  L), NULL);.    i
7da0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
7db0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
7dc0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7dd0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
7de0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
7df0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
7e00: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
7e10: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
7e20: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
7e30: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
7e40: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
7e50: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
7e60: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
7e70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7e80: 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b  bjv[idx], NULL);
7e90: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
7ea0: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
7eb0: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
7ec0: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
7ed0: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64  TR("-cadir", CAd
7ee0: 69 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  ir);..OPTSTR("-c
7ef0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
7f00: 0a 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74  ..OPTBYTE("-cert
7f10: 22 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65  ", cert, cert_le
7f20: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65  n);..OPTSTR("-ce
7f30: 72 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c  rtfile", certfil
7f40: 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69  e);..OPTSTR("-ci
7f50: 70 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b  pher", ciphers);
7f60: 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65  ..OPTSTR("-ciphe
7f70: 72 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  rs", ciphers);..
7f80: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
7f90: 75 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75  uites", ciphersu
7fa0: 69 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  ites);..OPTOBJ("
7fb0: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70  -command", scrip
7fc0: 74 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68  t);..OPTSTR("-dh
7fd0: 70 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d  params", DHparam
7fe0: 73 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b  s);..OPTBYTE("-k
7ff0: 65 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65  ey", key, key_le
8000: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65  n);..OPTSTR("-ke
8010: 79 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29  yfile", keyfile)
8020: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65  ;..OPTSTR("-mode
8030: 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54  l", model);..OPT
8040: 4f 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c  OBJ("-password",
8050: 20 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54   password);..OPT
8060: 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64  BOOL("-post_hand
8070: 73 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e  shake", post_han
8080: 64 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f  dshake);..OPTBOO
8090: 4c 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65  L("-request", re
80a0: 71 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c  quest);..OPTBOOL
80b0: 28 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71  ("-require", req
80c0: 75 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22  uire);..OPTINT("
80d0: 2d 73 65 63 75 72 69 74 79 6c 65 76 65 6c 22 2c  -securitylevel",
80e0: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
80f0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
8100: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
8110: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
8120: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
8130: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
8140: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
8150: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
8160: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
8170: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
8180: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
8190: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
81a0: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
81b0: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
81c0: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
81d0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
81e0: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
81f0: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
8200: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
8210: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
8220: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
8230: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
8240: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
8250: 61 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63  afile, -cert, -c
8260: 65 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72  ertfile, -cipher
8270: 2c 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c  , -ciphersuites,
8280: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61   -command, -dhpa
8290: 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79  rams, -key, -key
82a0: 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70  file, -model, -p
82b0: 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68  assword, -post_h
82c0: 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65  andshake, -reque
82d0: 73 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73  st, -require, -s
82e0: 65 63 75 72 69 74 79 6c 65 76 65 6c 2c 20 2d 73  ecuritylevel, -s
82f0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
8300: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
8310: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
8320: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
8330: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
8340: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
8350: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
8360: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8370: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
8380: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53  t)..verify |= SS
8390: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
83a0: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
83b0: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
83c0: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
83d0: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  re).verify |= SS
83e0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
83f0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
8400: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
8410: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
8420: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ).verify |= SSL_
8430: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
8440: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
8450: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72  erify == 0)..ver
8460: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
8470: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
8480: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
8490: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
84a0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
84b0: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
84c0: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
84d0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
84e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
84f0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
8500: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
8510: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
8520: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
8530: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
8540: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
8550: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
8560: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
8570: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
8580: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
8590: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
85a0: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
85b0: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
85c0: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
85d0: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
85e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
85f0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
8600: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
8610: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
8620: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
8630: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
8640: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
8650: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
8660: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
8670: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
8680: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
8690: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
86a0: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
86b0: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
86c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
86d0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
86e0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
86f0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
8700: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
8710: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
8720: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
8730: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
8740: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
8750: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
8760: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
8770: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
8780: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
8790: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
87a0: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
87b0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
87c0: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
87d0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
87e0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
87f0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
8800: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
8810: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
8820: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
8830: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
8840: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
8850: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
8860: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
8870: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
8880: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
8890: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
88a0: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
88b0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
88c0: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
88d0: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
88e0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
88f0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
8900: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
8910: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
8920: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
8930: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
8940: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
8950: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
8960: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
8970: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
8980: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
8990: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
89a0: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
89b0: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
89c0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
89d0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
89e0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
89f0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
8a00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
8a10: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
8a20: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
8a30: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
8a40: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
8a50: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
8a60: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
8a70: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
8a80: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
8a90: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
8aa0: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
8ab0: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
8ac0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
8ad0: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
8ae0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
8af0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
8b00: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
8b10: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
8b20: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
8b30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
8b40: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
8b50: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
8b60: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
8b70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
8b80: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
8b90: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
8ba0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8bb0: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
8bc0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
8bd0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
8be0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
8bf0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
8c00: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
8c10: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
8c20: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
8c30: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
8c40: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
8c50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8c60: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
8c70: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
8c80: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
8c90: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
8ca0: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
8cb0: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
8cc0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
8cd0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
8ce0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
8cf0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
8d00: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
8d10: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
8d20: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
8d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
8d40: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
8d50: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
8d60: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
8d70: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
8d80: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
8d90: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
8da0: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
8db0: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
8dc0: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
8dd0: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
8de0: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 64 69    cert_len, CAdi
8df0: 72 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  r, CAfile, ciphe
8e00: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
8e10: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
8e20: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
8e30: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
8e40: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
8e50: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
8e60: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
8e70: 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
8e80: 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20  ctx = ctx;..    
8e90: 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65 65  /*.     * We nee
8ea0: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
8eb0: 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  hat the channel 
8ec0: 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20  works in binary 
8ed0: 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20  (for the.     * 
8ee0: 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74  encryption not t
8ef0: 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29  o get goofed up)
8f00: 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c 79  ..     * We only
8f10: 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74 20   want to adjust 
8f20: 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69 6e  the buffering in
8f30: 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c 73   pre-v2 channels
8f40: 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20 65  , where.     * e
8f50: 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20 74  ach channel in t
8f60: 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61 69  he stack maintai
8f70: 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66 66  ned its own buff
8f80: 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ers..     */.   
8f90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
8fa0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
8fb0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
8fc0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
8fd0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
8fe0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
8ff0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
9000: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
9010: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
9020: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
9030: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
9040: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
9050: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
9060: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
9070: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
9080: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
9090: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
90a0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
90b0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
90c0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
90d0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
90e0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
90f0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
9100: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
9110: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
9120: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
9130: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
9140: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
9150: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
9160: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
9170: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
9180: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
9190: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
91a0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
91b0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
91c0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
91d0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
91e0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
91f0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
9200: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
9210: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
9220: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
9230: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
9240: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
9250: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
9260: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
9270: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
9280: 61 29 20 73 74 61 74 65 50 74 72 2c 20 28 54 43  a) statePtr, (TC
9290: 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c  L_READABLE | TCL
92a0: 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e  _WRITABLE), chan
92b0: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
92c0: 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20  Created channel 
92d0: 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47  named %s", Tcl_G
92e0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
92f0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
9300: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
9310: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43  ->self == (Tcl_C
9320: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
9330: 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f  ./*.. * No use o
9340: 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79  f Tcl_Eventually
9350: 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20  Free because no 
9360: 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65  possible Tcl_Pre
9370: 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73  serve... */..Tls
9380: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
9390: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
93a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
93b0: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
93c0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
93d0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
93e0: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
93f0: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
9400: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
9410: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
9420: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
9430: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9440: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
9450: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
9460: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
9470: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
9480: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
9490: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
94a0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
94b0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
94c0: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
94d0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
94e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
94f0: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
9500: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9510: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
9520: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
9530: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
9540: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
9550: 6b 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a  king));..    /*.
9560: 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74 69       * SSL Initi
9570: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a  alization.     *
9580: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
9590: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74  ssl = SSL_new(st
95a0: 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20  atePtr->ctx);.  
95b0: 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72 2d    if (!statePtr-
95c0: 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20  >ssl) {../* SSL 
95d0: 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a 2f  library error */
95e0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
95f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c  lt(interp, "coul
9600: 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20 73  dn't construct s
9610: 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20 52  sl session: ", R
9620: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
9630: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
9640: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
9650: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
9660: 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20  MPORT", "INIT", 
9670: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
9680: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46  *) NULL);..Tls_F
9690: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
96a0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20  tePtr);..return 
96b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
96c0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f 73  ..    /* Set hos
96d0: 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f  t server name */
96e0: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 6e  .    if (servern
96f0: 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73 20  ame) {../* Sets 
9700: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
9710: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
9720: 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20   in ClientHello 
9730: 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f 2a  extension */../*
9740: 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20 68   Per RFC 6066, h
9750: 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53 43  ostname is a ASC
9760: 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69 6e  II encoded strin
9770: 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34 33  g, though RFC 43
9780: 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20 2a  66 says UTF-8. *
9790: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74 5f  /..if (!SSL_set_
97a0: 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d 65  tlsext_host_name
97b0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
97c0: 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20 72  servername) && r
97d0: 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20 54  equire) {..    T
97e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
97f0: 69 6e 74 65 72 70 2c 20 22 73 65 74 74 69 6e 67  interp, "setting
9800: 20 54 4c 53 20 68 6f 73 74 20 6e 61 6d 65 20 65   TLS host name e
9810: 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c 65 64 22  xtension failed"
9820: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9830: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
9840: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
9850: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
9860: 20 22 53 4e 49 22 2c 20 22 46 41 49 4c 45 44 22   "SNI", "FAILED"
9870: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9880: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
9890: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
98a0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
98b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
98c0: 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65 20  /* Set hostname 
98d0: 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66 69  for peer certifi
98e0: 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76 65  cate hostname ve
98f0: 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63 6c  rification in cl
9900: 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27 74  ients...   Don't
9910: 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68 6f   use SSL_set1_ho
9920: 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73 20  st since it has 
9930: 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f 0a  limitations. */.
9940: 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f 68  .if (!SSL_add1_h
9950: 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ost(statePtr->ss
9960: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29 20  l, servername)) 
9970: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
9980: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9990: 22 73 65 74 74 69 6e 67 20 44 4e 53 20 68 6f 73  "setting DNS hos
99a0: 74 20 6e 61 6d 65 20 66 61 69 6c 65 64 22 2c 20  t name failed", 
99b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
99c0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
99d0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
99e0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
99f0: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c  HOSTNAME", "FAIL
9a00: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
9a10: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
9a20: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
9a30: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
9a40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
9a50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
9a60: 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64  esume session id
9a70: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73   */.    if (sess
9a80: 69 6f 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e  ion_id && strlen
9a90: 28 73 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20  (session_id) <= 
9aa0: 53 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f  SSL_MAX_SID_CTX_
9ab0: 4c 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53  LENGTH) {../* SS
9ac0: 4c 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20  L_set_session() 
9ad0: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53  */..if (!SSL_SES
9ae0: 53 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e  SION_set1_id_con
9af0: 74 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73  text(SSL_get_ses
9b00: 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
9b10: 73 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  sl), session_id,
9b20: 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20   (unsigned int) 
9b30: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
9b40: 64 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  d))) {..    Tcl_
9b50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9b60: 65 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73  erp, "Resume ses
9b70: 73 69 6f 6e 20 69 64 20 22 2c 20 73 65 73 73 69  sion id ", sessi
9b80: 6f 6e 5f 69 64 2c 20 22 20 66 61 69 6c 65 64 22  on_id, " failed"
9b90: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
9ba0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
9bb0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
9bc0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
9bd0: 20 22 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49   "SESSION", "FAI
9be0: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
9bf0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
9c00: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
9c10: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
9c20: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
9c30: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
9c40: 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69  Enable Applicati
9c50: 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f  on-Layer Protoco
9c60: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45  l Negotiation. E
9c70: 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74  xamples are: htt
9c80: 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31  p/1.0,..http/1.1
9c90: 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69  , h2, h3, ftp, i
9ca0: 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d  map, pop3, xmpp-
9cb0: 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72  client, xmpp-ser
9cc0: 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20  ver, mqtt, irc, 
9cd0: 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  etc. */.    if (
9ce0: 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76  alpn) {../* Conv
9cf0: 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69  ert a TCL list i
9d00: 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c  nto a protocol-l
9d10: 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d  ist in wire-form
9d20: 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20  at */..unsigned 
9d30: 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70  char *protos, *p
9d40: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
9d50: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
9d60: 09 69 6e 74 20 69 2c 20 6c 65 6e 2c 20 63 6e 74  .int i, len, cnt
9d70: 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73  ;..Tcl_Obj **lis
9d80: 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73  t;...if (Tcl_Lis
9d90: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
9da0: 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63  interp, alpn, &c
9db0: 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43  nt, &list) != TC
9dc0: 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73  L_OK) {..    Tls
9dd0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
9de0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
9df0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e00: 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69  ..}.../* Determi
9e10: 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65  ne the memory re
9e20: 71 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70  quired for the p
9e30: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
9e40: 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c  .for (i = 0; i <
9e50: 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20   cnt; i++) {..  
9e60: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
9e70: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20  romObj(list[i], 
9e80: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28  &len);..    if (
9e90: 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54  len > 255) {...T
9ea0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9eb0: 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72  interp, "ALPN pr
9ec0: 6f 74 6f 63 6f 6c 20 6e 61 6d 65 20 74 6f 6f 20  otocol name too 
9ed0: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20  long", (char *) 
9ee0: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74  NULL);...Tcl_Set
9ef0: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
9f00: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
9f10: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
9f20: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
9f30: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
9f40: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
9f50: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  r);...return TCL
9f60: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
9f70: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b      protos_len +
9f80: 3d 20 31 20 2b 20 6c 65 6e 3b 0a 09 7d 0a 0a 09  = 1 + len;..}...
9f90: 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d  /* Build the com
9fa0: 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  plete protocol-l
9fb0: 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d  ist */..protos =
9fc0: 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f   ckalloc(protos_
9fd0: 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63  len);../* protoc
9fe0: 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74  ol-lists consist
9ff0: 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68   of 8-bit length
a000: 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20  -prefixed, byte 
a010: 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20  strings */..for 
a020: 28 69 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74  (i = 0, p = prot
a030: 6f 73 3b 20 69 20 3c 20 63 6e 74 3b 20 69 2b 2b  os; i < cnt; i++
a040: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73  ) {..    char *s
a050: 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  tr = Tcl_GetStri
a060: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69  ngFromObj(list[i
a070: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a  ], &len);..    *
a080: 70 2b 2b 20 3d 20 6c 65 6e 3b 0a 09 20 20 20 20  p++ = len;..    
a090: 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 6c  memcpy(p, str, l
a0a0: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c  en);..    p += l
a0b0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f  en;..}.../* SSL_
a0c0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20  set_alpn_protos 
a0d0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
a0e0: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
a0f0: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54  t */../* Note: T
a100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
a110: 76 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72  verses the retur
a120: 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69  n value conventi
a130: 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73  on */..if (SSL_s
a140: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73  et_alpn_protos(s
a150: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72  tatePtr->ssl, pr
a160: 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e  otos, protos_len
a170: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a180: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a190: 70 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 73 65  p, "failed to se
a1a0: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73  t ALPN protocols
a1b0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a1c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
a1d0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
a1e0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
a1f0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
a200: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
a210: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
a220: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a230: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65  Ptr);..    ckfre
a240: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20  e(protos);..    
a250: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a260: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20  ;..}.../* Store 
a270: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a  protocols list *
a280: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  /..statePtr->pro
a290: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73  tos = protos;..s
a2a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
a2b0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e  len = protos_len
a2c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
a2d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
a2e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50   = NULL;..stateP
a2f0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
a300: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
a310: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c  *.     * SSL Cal
a320: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20  lbacks.     */. 
a330: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64     SSL_set_app_d
a340: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ata(statePtr->ss
a350: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  l, (void *)state
a360: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62  Ptr);./* point b
a370: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 0a 20 20  ack to us */..  
a380: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79    SSL_set_verify
a390: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
a3a0: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61  verify, VerifyCa
a3b0: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c  llback);.    SSL
a3c0: 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61  _set_info_callba
a3d0: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ck(statePtr->ssl
a3e0: 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b  , InfoCallback);
a3f0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  ..    /* Callbac
a400: 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20  k for observing 
a410: 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65  protocol message
a420: 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  s */.#ifndef OPE
a430: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
a440: 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53  E.    /* void SS
a450: 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61  L_CTX_set_msg_ca
a460: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
a470: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
a480: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
a490: 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65   void SSL_CTX_se
a4a0: 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73  t_msg_callback(s
a4b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65  tatePtr->ctx, Me
a4c0: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20  ssageCallback); 
a4d0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d  */.    SSL_set_m
a4e0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
a4f0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28  statePtr->ssl, (
a500: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
a510: 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73  ;.    SSL_set_ms
a520: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
a530: 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67  Ptr->ssl, Messag
a540: 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64  eCallback);.#end
a550: 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  if..    /* Creat
a560: 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49  e Tcl_Channel BI
a570: 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20  O Handler */.   
a580: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
a590: 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73  .= BIO_new_tcl(s
a5a0: 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43  tatePtr, BIO_NOC
a5b0: 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65  LOSE);.    state
a5c0: 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e  Ptr->bio.= BIO_n
a5d0: 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b  ew(BIO_f_ssl());
a5e0: 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  ..    if (server
a5f0: 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63  ) {../* Server c
a600: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c  allbacks */..SSL
a610: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
a620: 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73  servername_arg(s
a630: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76  tatePtr->ctx, (v
a640: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
a650: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
a660: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
a670: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
a680: 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62  r->ctx, SNICallb
a690: 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ack);..SSL_CTX_s
a6a0: 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f  et_client_hello_
a6b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
a6c0: 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c  , HelloCallback,
a6d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
a6e0: 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74  r);..if (statePt
a6f0: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
a700: 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  L) {..    SSL_CT
a710: 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63  X_set_alpn_selec
a720: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  t_cb(statePtr->c
a730: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  tx, ALPNCallback
a740: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
a750: 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f  tr);.#ifdef USE_
a760: 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73  NPN..    if (tls
a770: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
a780: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c  _3 == 0) {...SSL
a790: 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72  _CTX_set_next_pr
a7a0: 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f  otos_advertised_
a7b0: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
a7c0: 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28  , NPNCallback, (
a7d0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
a7e0: 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  ;..    }.#endif.
a7f0: 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73  .}.../* Enable s
a800: 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65  erver to send ce
a810: 72 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72  rt request after
a820: 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20   handshake (TLS 
a830: 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a  1.3 only) */../*
a840: 20 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69   A write operati
a850: 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61  on must take pla
a860: 63 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69  ce for the Certi
a870: 66 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74  ficate Request t
a880: 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f  o be..   sent to
a890: 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69   the client, thi
a8a0: 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69  s can be done wi
a8b0: 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68  th SSL_do_handsh
a8c0: 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72  ake(). */..if (r
a8d0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
a8e0: 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31  andshake && tls1
a8f0: 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76  _3) {..    SSL_v
a900: 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73  erify_client_pos
a910: 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74  t_handshake(stat
a920: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a  ePtr->ssl);..}..
a930: 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69  ./* set automati
a940: 63 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f  c curve selectio
a950: 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63  n */..SSL_set_ec
a960: 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72  dh_auto(statePtr
a970: 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20  ->ssl, 1);.../* 
a980: 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20  Set server mode 
a990: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c  */..statePtr->fl
a9a0: 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53  ags |= TLS_TCL_S
a9b0: 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f  ERVER;..SSL_set_
a9c0: 61 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61  accept_state(sta
a9d0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
a9e0: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c   } else {../* Cl
a9f0: 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a  ient callbacks *
aa00: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
aa10: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e  ..if (statePtr->
aa20: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26  protos != NULL &
aa30: 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26  & tls1_2 == 0 &&
aa40: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
aa50: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
aa60: 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65  _next_proto_sele
aa70: 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ct_cb(statePtr->
aa80: 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63  ctx, ALPNCallbac
aa90: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
aaa0: 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a  Ptr);..}.#endif.
aab0: 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63  ../* Session cac
aac0: 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  hing */..SSL_CTX
aad0: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63  _set_session_cac
aae0: 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  he_mode(statePtr
aaf0: 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f  ->ctx, SSL_SESS_
ab00: 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53  CACHE_CLIENT | S
ab10: 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f  SL_SESS_CACHE_NO
ab20: 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29  _INTERNAL_STORE)
ab30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f  ;..SSL_CTX_sess_
ab40: 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65  set_new_cb(state
ab50: 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f  Ptr->ctx, Sessio
ab60: 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a  nCallback);.../*
ab70: 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e   Enable post han
ab80: 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63  dshake Authentic
ab90: 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e  ation extension.
aba0: 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e   TLS 1.3 only, n
abb0: 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69  ot http/2. */..i
abc0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
abd0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a  st_handshake) {.
abe0: 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73  .    SSL_set_pos
abf0: 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68  t_handshake_auth
ac00: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
ac10: 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  1);..}.../* Set 
ac20: 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09  client mode */..
ac30: 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f  SSL_set_connect_
ac40: 73 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  state(statePtr->
ac50: 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
ac60: 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74  SSL_set_bio(stat
ac70: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65  ePtr->ssl, state
ac80: 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74  Ptr->p_bio, stat
ac90: 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20  ePtr->p_bio);.  
aca0: 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74    BIO_set_ssl(st
acb0: 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61  atePtr->bio, sta
acc0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f  tePtr->ssl, BIO_
acd0: 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f  NOCLOSE);..    /
ace0: 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20  *.     * End of 
acf0: 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f  SSL Init.     */
ad00: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65  .    dprintf("Re
ad10: 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c  turning %s", Tcl
ad20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
ad30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29  statePtr->self))
ad40: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
ad50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
ad60: 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  r *) Tcl_GetChan
ad70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
ad80: 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c  ->self), TCL_VOL
ad90: 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74  ATILE);..    ret
ada0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c 69  urn TCL_OK;..cli
adb0: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74  entData = client
adc0: 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Data;.}.../*. *-
add0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ade0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae10: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72  --. *. * Unimpor
ae20: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
ae30: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
ae40: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65  is invoked to re
ae50: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74  move the topmost
ae60: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e   channel filter.
ae70: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
ae80: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
ae90: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
aea0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
aeb0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
aec0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
aed0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
aee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
af20: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
af30: 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  nt.UnimportObjCm
af40: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
af50: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
af60: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
af70: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
af80: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
af90: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
afa0: 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68  chan;../* The ch
afb0: 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d  annel to set a m
afc0: 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20  ode on. */..    
afd0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
afe0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
aff0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72   != 2) {..Tcl_Wr
b000: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
b010: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
b020: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20  nnel");..return 
b030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b040: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
b050: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
b060: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
b070: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  g(objv[1]), NULL
b080: 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20  );.    if (chan 
b090: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
b0a0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
b0b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b0c0: 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  }..    /* Make s
b0d0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
b0e0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
b0f0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61  annel */.    cha
b100: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
b110: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20  annel(chan);..  
b120: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
b130: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
b140: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
b150: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
b160: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b170: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
b180: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
b190: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
b1a0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
b1b0: 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09  annel", NULL);..
b1c0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b1d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b1e0: 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20  S", "UNIMPORT", 
b1f0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
b200: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
b210: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
b220: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
b230: 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74      if (Tcl_Unst
b240: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
b250: 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f  p, chan) == TCL_
b260: 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e  ERROR) {..return
b270: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b280: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  }..    return TC
b290: 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
b2a0: 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
b2b0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
b2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b2f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
b300: 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63   * CTX_Init -- c
b310: 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f 43  onstruct a SSL_C
b320: 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20  TX instance. *. 
b330: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
b340: 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69 6e  valid SSL_CTX in
b350: 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a  stance or NULL..
b360: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
b370: 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74  ts:. *.construct
b380: 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43  s SSL context (C
b390: 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  TX). *. *-------
b3a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
b3e0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
b3f0: 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65  *.CTX_Init(State
b400: 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20   *statePtr, int 
b410: 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72  isServer, int pr
b420: 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66 69  oto, char *keyfi
b430: 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66 69  le, char *certfi
b440: 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  le,.    unsigned
b450: 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69   char *key, unsi
b460: 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74 2c  gned char *cert,
b470: 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69 6e   int key_len, in
b480: 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61 72  t cert_len, char
b490: 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68 61   *CAdir,.    cha
b4a0: 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72 20  r *CAfile, char 
b4b0: 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20 2a  *ciphers, char *
b4c0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69 6e  ciphersuites, in
b4d0: 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a 44  t level, char *D
b4e0: 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20 54  Hparams) {.    T
b4f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
b500: 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p = statePtr->in
b510: 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54  terp;.    SSL_CT
b520: 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  X *ctx = NULL;. 
b530: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
b540: 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  s;.    Tcl_DStri
b550: 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74 20  ng ds1;.    int 
b560: 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  off = 0;.    int
b570: 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65   load_private_ke
b580: 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  y;.    const SSL
b590: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
b5a0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
b5b0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
b5c0: 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c   (!proto) {..Tcl
b5d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b5e0: 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20  terp, "no valid 
b5f0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
b600: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  d", NULL);..retu
b610: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
b620: 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53      /* create SS
b630: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66  L context */.#if
b640: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
b650: 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31  _NUMBER >= 0x101
b660: 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65  00000L || define
b670: 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65  d(NO_SSL2) || de
b680: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
b690: 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45  _SSL2).    if (E
b6a0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
b6b0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b  S_PROTO_SSL2)) {
b6c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b6d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32  lt(interp, "SSL2
b6e0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
b6f0: 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b  pported", NULL);
b700: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
b710: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
b720: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
b730: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
b740: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
b750: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
b760: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
b770: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
b780: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b790: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
b7a0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
b7b0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
b7c0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
b7d0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
b7e0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
b7f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
b800: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
b810: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
b820: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
b830: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b840: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20  nterp, "TLS 1.0 
b850: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
b860: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
b870: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
b880: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
b890: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
b8a0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
b8b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
b8c0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
b8d0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
b8e0: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
b8f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b900: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
b910: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
b920: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
b930: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
b940: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
b950: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
b960: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
b970: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
b980: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
b990: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
b9a0: 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f  TLS1_2)) {..Tcl_
b9b0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b9c0: 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72  erp, "TLS 1.2 pr
b9d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
b9e0: 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72  rted", NULL);..r
b9f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
ba00: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
ba10: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
ba20: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
ba30: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
ba40: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
ba50: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
ba60: 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_3)) {..Tcl_A
ba70: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ba80: 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f  rp, "TLS 1.3 pro
ba90: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
baa0: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  ted", NULL);..re
bab0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
bac0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28  .#endif.    if (
bad0: 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f  proto == 0) {../
bae0: 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65  * Use full range
baf0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
bb00: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
bb10: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c  on(ctx, 0);..SSL
bb20: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
bb30: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
bb40: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  0);.    }..    s
bb50: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a  witch (proto) {.
bb60: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
bb70: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
bb80: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
bb90: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
bba0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
bbb0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
bbc0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
bbd0: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L2:..method = is
bbe0: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73  Server ? SSLv2_s
bbf0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
bc00: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv2_client_me
bc10: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
bc20: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
bc30: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
bc40: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
bc50: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
bc60: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
bc70: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
bc80: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
bc90: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL3:..method =
bca0: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
bcb0: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  3_server_method(
bcc0: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74  ) : SSLv3_client
bcd0: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
bce0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
bcf0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
bd00: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
bd10: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
bd20: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
bd30: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
bd40: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
bd50: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f  OTO_TLS1:..metho
bd60: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
bd70: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  LSv1_server_meth
bd80: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69  od() : TLSv1_cli
bd90: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
bda0: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
bdb0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
bdc0: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
bdd0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
bde0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
bdf0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
be00: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
be10: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
be20: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_1:..method = i
be30: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
be40: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
be50: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65  ) : TLSv1_1_clie
be60: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
be70: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
be80: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
be90: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
bea0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
beb0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
bec0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
bed0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
bee0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
bef0: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  _2:..method = is
bf00: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32  Server ? TLSv1_2
bf10: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
bf20: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e   : TLSv1_2_clien
bf30: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
bf40: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
bf50: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
bf60: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
bf70: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
bf80: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
bf90: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a  ROTO_TLS1_3:../*
bfa0: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63   Use the generic
bfb0: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73   method and cons
bfc0: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74  traint range aft
bfd0: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72  er context is cr
bfe0: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64  eated */..method
bff0: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
c000: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
c010: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
c020: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
c030: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
c040: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61  ult:../* Negotia
c050: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c  te highest avail
c060: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72  able SSL/TLS ver
c070: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  sion */..method 
c080: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
c090: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
c0a0: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65   : TLS_client_me
c0b0: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e  thod();.#if OPEN
c0c0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
c0d0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
c0e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
c0f0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
c100: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
c110: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
c120: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
c130: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30  ROTO_SSL2)   ? 0
c140: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
c150: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v2);.#endif.#if 
c160: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
c170: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c180: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09  ENSSL_NO_SSL3)..
c190: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
c1a0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
c1b0: 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53  _SSL3)   ? 0 : S
c1c0: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
c1d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c1e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
c1f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c200: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20  L_NO_TLS1)..off 
c210: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
c220: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c230: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1)   ? 0 : SSL_O
c240: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e  P_NO_TLSv1);.#en
c250: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
c260: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
c270: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
c280: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20  NO_TLS1_1)..off 
c290: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
c2a0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c2b0: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_1) ? 0 : SSL_O
c2c0: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23  P_NO_TLSv1_1);.#
c2d0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
c2e0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
c2f0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
c300: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66  L_NO_TLS1_2)..of
c310: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
c320: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
c330: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_2) ? 0 : SSL
c340: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b  _OP_NO_TLSv1_2);
c350: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
c360: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
c370: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
c380: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
c390: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
c3a0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
c3b0: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53  _TLS1_3) ? 0 : S
c3c0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33  SL_OP_NO_TLSv1_3
c3d0: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b  );.#endif..break
c3e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
c3f0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
c400: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
c410: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a  TX_new(method);.
c420: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a      if (!ctx) {.
c430: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20  .return(NULL);. 
c440: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65     }..    if (ge
c450: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
c460: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  LE)) {..SSL_CTX_
c470: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62  set_keylog_callb
c480: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43  ack(ctx, KeyLogC
c490: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
c4a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
c4b0: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
c4c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
c4d0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
c4e0: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f  proto == TLS_PRO
c4f0: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53  TO_TLS1_3) {..SS
c500: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
c510: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
c520: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
c530: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
c540: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
c550: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
c560: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  SION);.    }.#en
c570: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63  dif..    /* Forc
c580: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69  e cipher selecti
c590: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76  on order by serv
c5a0: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69  er */.    if (!i
c5b0: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f  sServer) {..SSL_
c5c0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
c5d0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48  ctx, SSL_OP_CIPH
c5e0: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52  ER_SERVER_PREFER
c5f0: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  ENCE);.    }..#i
c600: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
c610: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
c620: 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53  00000L.    OpenS
c630: 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72  SL_add_all_algor
c640: 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64  ithms(); /* Load
c650: 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 67   ciphers and dig
c660: 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ests */.#endif..
c670: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c680: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76  app_data(ctx, (v
c690: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a  oid*)interp);./*
c6a0: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e   remember the in
c6b0: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20  terpreter */.   
c6c0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
c6d0: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
c6e0: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53  _ALL);./* all SS
c6f0: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
c700: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
c710: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
c720: 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50  , SSL_OP_NO_COMP
c730: 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73  RESSION);./* dis
c740: 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e  able compression
c750: 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74   even if support
c760: 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ed */.    SSL_CT
c770: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
c780: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73  x, off);../* dis
c790: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65  able protocol ve
c7a0: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50  rsions */.#if OP
c7b0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
c7c0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30  MBER < 0x1010100
c7d0: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  0L.    SSL_CTX_s
c7e0: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c  et_mode(ctx, SSL
c7f0: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59  _MODE_AUTO_RETRY
c800: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77  );./* handle new
c810: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62   handshakes in b
c820: 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79  ackground. On by
c830: 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e   default in Open
c840: 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65  SSL 1.1.1. */.#e
c850: 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58  ndif.    SSL_CTX
c860: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
c870: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a  size(ctx, 128);.
c880: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72  .    /* Set user
c890: 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73   defined ciphers
c8a0: 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c  , cipher suites,
c8b0: 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65   and security le
c8c0: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  vel */.    if ((
c8d0: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
c8e0: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
c8f0: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
c900: 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54  , ciphers)) {..T
c910: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c920: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
c930: 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20  hers failed: No 
c940: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20  valid ciphers", 
c950: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c960: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
c970: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
c980: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
c990: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d  (ciphersuites !=
c9a0: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
c9b0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69  TX_set_ciphersui
c9c0: 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73  tes(ctx, ciphers
c9d0: 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41  uites)) {..Tcl_A
c9e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c9f0: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20  rp, "Set cipher 
ca00: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e  suites failed: N
ca10: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22  o valid ciphers"
ca20: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ca30: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
ca40: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
ca50: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
ca60: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Set security l
ca70: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
ca80: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65  level > -1 && le
ca90: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53  vel < 6) {../* S
caa0: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_set_security_
cab0: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54  level */..SSL_CT
cac0: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  X_set_security_l
cad0: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29  evel(ctx, level)
cae0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
caf0: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63  set some callbac
cb00: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ks */.    SSL_CT
cb10: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
cb20: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73  sswd_cb(ctx, Pas
cb30: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a  swordCallback);.
cb40: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
cb50: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
cb60: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20  b_userdata(ctx, 
cb70: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
cb80: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20  );..    /* read 
cb90: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e  a Diffie-Hellman
cba0: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
cbb0: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69  , or use the bui
cbc0: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66  lt-in one */.#if
cbd0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
cbe0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
cbf0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
cc00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
cc10: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
cc20: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
cc30: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
cc40: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
cc50: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
cc60: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
cc70: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
cc80: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
cc90: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
cca0: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
ccb0: 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  o;..    Tcl_DStr
ccc0: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20  ingInit(&ds);.. 
ccd0: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77     bio = BIO_new
cce0: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61  _file(F2N(DHpara
ccf0: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a  ms, &ds), "r");.
cd00: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b  .    if (!bio) {
cd10: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
cd20: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41  ee(&ds);...Tcl_A
cd30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
cd40: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66  rp, "Could not f
cd50: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72  ind DH parameter
cd60: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  s file", (char *
cd70: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
cd80: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
cd90: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
cda0: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50    }...    dh = P
cdb0: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61  EM_read_bio_DHpa
cdc0: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20  rams(bio, NULL, 
cdd0: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  NULL, NULL);..  
cde0: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b    BIO_free(bio);
cdf0: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
ce00: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
ce10: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63   if (!dh) {...Tc
ce20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ce30: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
ce40: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65  t read DH parame
ce50: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c  ters from file",
ce60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ce70: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ce80: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ce90: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 20 65  ULL;..    }..} e
cea0: 6c 73 65 20 7b 0a 09 20 20 20 20 64 68 20 3d 20  lse {..    dh = 
ceb0: 67 65 74 5f 64 68 50 61 72 61 6d 73 28 29 3b 0a  get_dhParams();.
cec0: 09 7d 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  .}..SSL_CTX_set_
ced0: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b  tmp_dh(ctx, dh);
cee0: 0a 09 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 20  ..DH_free(dh);. 
cef0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
cf00: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74   /* set our cert
cf10: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c  ificate */.    l
cf20: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
cf30: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72  = 0;.    if (cer
cf40: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  tfile != NULL) {
cf50: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
cf60: 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53  ey = 1;...Tcl_DS
cf70: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
cf80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
cf90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
cfa0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74  le(ctx, F2N(cert
cfb0: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
cfc0: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
cfd0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44   0) {..    Tcl_D
cfe0: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
cff0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
d000: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d010: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
d020: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22  rtificate file "
d030: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22  , certfile, ": "
d040: 2c 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e  ,....     REASON
d050: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
d060: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
d070: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
d080: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
d090: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
d0a0: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  cert != NULL) {.
d0b0: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
d0c0: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f  y = 1;..if (SSL_
d0d0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
d0e0: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65  ate_ASN1(ctx, ce
d0f0: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d  rt_len, cert) <=
d100: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44   0) {..    Tcl_D
d110: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
d120: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
d130: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d140: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
d150: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09  rtificate: ",...
d160: 09 20 20 20 20 20 52 45 41 53 4f 4e 28 29 2c 20  .     REASON(), 
d170: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d180: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
d190: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
d1a0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20  urn NULL;..}.   
d1b0: 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72 74 66   } else {..certf
d1c0: 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58 35 30  ile = (char*)X50
d1d0: 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 63 65  9_get_default_ce
d1e0: 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69 66 20  rt_file();...if 
d1f0: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
d200: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
d210: 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53 53 4c  x, certfile, SSL
d220: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
d230: 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09 20 20  = 0) {.#if 0..  
d240: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
d250: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c  e(&ds);..    Tcl
d260: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d270: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
d280: 20 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72   use default cer
d290: 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c  tificate file ",
d2a0: 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c   certfile, ": ",
d2b0: 0a 09 09 09 20 20 20 20 20 52 45 41 53 4f 4e 28  ....     REASON(
d2c0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
d2d0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
d2e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
d2f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e  return NULL;.#en
d300: 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  dif..}.    }..  
d310: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72 69    /* set our pri
d320: 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20  vate key */.    
d330: 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74 65  if (load_private
d340: 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65 79  _key) {..if (key
d350: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20  file == NULL && 
d360: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  key == NULL) {..
d370: 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63 65      keyfile = ce
d380: 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20  rtfile;..}...if 
d390: 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  (keyfile != NULL
d3a0: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74 20  ) {..    /* get 
d3b0: 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79 20  the private key 
d3c0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
d3d0: 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74 65  this certificate
d3e0: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65 79   */..    if (key
d3f0: 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  file == NULL) {.
d400: 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74  ..keyfile = cert
d410: 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  file;..    }... 
d420: 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75     if (SSL_CTX_u
d430: 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66 69  se_PrivateKey_fi
d440: 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79 66  le(ctx, F2N(keyf
d450: 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46  ile, &ds), SSL_F
d460: 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20  ILETYPE_PEM) <= 
d470: 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  0) {...Tcl_DStri
d480: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f  ngFree(&ds);.../
d490: 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73  * flush the pass
d4a0: 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67  phrase which mig
d4b0: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ht be left in th
d4c0: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63  e result */...Tc
d4d0: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
d4e0: 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54  rp, NULL, TCL_ST
d4f0: 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70  ATIC);...Tcl_App
d500: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
d510: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
d520: 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c 65   public key file
d530: 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20 22   ", keyfile, " "
d540: 2c 0a 09 09 09 20 20 20 20 20 20 20 20 20 52 45  ,....         RE
d550: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
d560: 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
d570: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72  X_free(ctx);...r
d580: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
d590: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
d5a0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09  ingFree(&ds);...
d5b0: 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21  } else if (key !
d5c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69  = NULL) {..    i
d5d0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
d5e0: 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45  rivateKey_ASN1(E
d5f0: 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78  VP_PKEY_RSA, ctx
d600: 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c  , key,key_len) <
d610: 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  = 0) {...Tcl_DSt
d620: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
d630: 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61  ./* flush the pa
d640: 73 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d  ssphrase which m
d650: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
d660: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09  the result */...
d670: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
d680: 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f  terp, NULL, TCL_
d690: 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41  STATIC);...Tcl_A
d6a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d6b0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
d6c0: 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a 20 22  et public key: "
d6d0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  , REASON(), (cha
d6e0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
d6f0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
d700: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
d710: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f  .    }..}../* No
d720: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  w we know that a
d730: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61   key and cert ha
d740: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69  ve been set agai
d750: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20  nst.. * the SSL 
d760: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28  context */..if (
d770: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70  !SSL_CTX_check_p
d780: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29  rivate_key(ctx))
d790: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
d7a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
d7b0: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f   "private key do
d7c0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
d7d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62   certificate pub
d7e0: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20  lic key",....   
d7f0: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29    (char *) NULL)
d800: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
d810: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
d820: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
d830: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
d840: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41   verification CA
d850: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74  s */.    Tcl_DSt
d860: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20  ringInit(&ds);. 
d870: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
d880: 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f 2a  it(&ds1);.    /*
d890: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64 65   There is one de
d8a0: 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 2c  fault directory,
d8b0: 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69 6c   one default fil
d8c0: 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61 75  e, and one defau
d8d0: 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20 64  lt store...The d
d8e0: 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66  efault CA certif
d8f0: 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 79  icates directory
d900: 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73 74   (and default st
d910: 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 20 4f  ore) is in the O
d920: 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64 69  penSSL..certs di
d930: 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20  rectory. It can 
d940: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
d950: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49   the SSL_CERT_DI
d960: 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 09  R env var. The..
d970: 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69  default CA certi
d980: 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 20  ficates file is 
d990: 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d 20  called cert.pem 
d9a0: 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 4f  in the default O
d9b0: 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f 72  penSSL..director
d9c0: 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65  y. It can be ove
d9d0: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
d9e0: 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76  SL_CERT_FILE env
d9f0: 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e 74   var. */../* int
da00: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
da10: 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72 28  ault_verify_dir(
da20: 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61 6e  SSL_CTX *ctx) an
da30: 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65  d int SSL_CTX_se
da40: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79  t_default_verify
da50: 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a 63  _file(SSL_CTX *c
da60: 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  tx) */.    if (!
da70: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
da80: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74  ify_locations(ct
da90: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
daa0: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20  ds), F2N(CAdir, 
dab0: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f  &ds1)) ||..!SSL_
dac0: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
dad0: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
dae0: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f  )) {.#if 0..Tcl_
daf0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
db00: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
db10: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f  ee(&ds1);../* Do
db20: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61  n't currently ca
db30: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73  re if this fails
db40: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52   */..Tcl_AppendR
db50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
db60: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66  SL default verif
db70: 79 20 70 61 74 68 73 3a 20 22 2c 20 52 45 41 53  y paths: ", REAS
db80: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
db90: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
dba0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
dbb0: 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20  n NULL;.#endif. 
dbc0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 68 74 74     }..    /* htt
dbd0: 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
dbe0: 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
dbf0: 35 37 2f 20 2a 2f 0a 20 20 20 20 2f 2a 20 58 58  57/ */.    /* XX
dc00: 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20  X:TODO: Let the 
dc10: 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75  user supply valu
dc20: 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64 20  es here instead 
dc30: 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61  of something tha
dc40: 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20  t exists on the 
dc50: 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20  filesystem */.  
dc60: 20 20 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20    if (CAfile != 
dc70: 4e 55 4c 4c 29 20 7b 0a 09 53 54 41 43 4b 5f 4f  NULL) {..STACK_O
dc80: 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65  F(X509_NAME) *ce
dc90: 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f  rtNames = SSL_lo
dca0: 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c  ad_client_CA_fil
dcb0: 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  e(F2N(CAfile, &d
dcc0: 73 29 29 3b 0a 09 69 66 20 28 63 65 72 74 4e 61  s));..if (certNa
dcd0: 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
dce0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
dcf0: 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63  client_CA_list(c
dd00: 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a  tx, certNames);.
dd10: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  .}.    }..    Tc
dd20: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
dd30: 73 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  s);.    Tcl_DStr
dd40: 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 20  ingFree(&ds1);. 
dd50: 20 20 20 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d     return ctx;.}
dd60: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
dd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
dda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
ddb0: 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d  * StatusObjCmd -
ddc0: 2d 20 72 65 74 75 72 6e 20 63 65 72 74 69 66 69  - return certifi
ddd0: 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74  cate for connect
dde0: 65 64 20 70 65 65 72 2e 0a 20 2a 0a 20 2a 20 52  ed peer.. *. * R
ddf0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
de00: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
de10: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
de20: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
de30: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
de40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
de70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
de80: 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a  ic int.StatusObj
de90: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
dea0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
deb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
dec0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
ded0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
dee0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
def0: 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20  tePtr;.    X509 
df00: 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f  *peer;.    Tcl_O
df10: 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20  bj *objPtr;.    
df20: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
df30: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e  ;.    char *chan
df40: 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72  nelName, *cipher
df50: 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b  s;.    int mode;
df60: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
df70: 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b  ned char *proto;
df80: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
df90: 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e  t len;.    int n
dfa0: 69 64 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70  id, res;..    dp
dfb0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
dfc0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
dfd0: 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c   2 || objc > 3 |
dfe0: 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20  | (objc == 3 && 
dff0: 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53  !strcmp(Tcl_GetS
e000: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
e010: 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54  "-local"))) {..T
e020: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e030: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
e040: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e   "?-local? chann
e050: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
e060: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
e070: 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e      /* Get chann
e080: 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61  el Id */.    cha
e090: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  nnelName = Tcl_G
e0a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
e0b0: 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20  objv[(objc == 2 
e0c0: 3f 20 31 20 3a 20 32 29 5d 2c 20 4e 55 4c 4c 29  ? 1 : 2)], NULL)
e0d0: 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ;.    chan = Tcl
e0e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
e0f0: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  rp, channelName,
e100: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
e110: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
e120: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
e130: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
e140: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e150: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
e160: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
e170: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
e180: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
e190: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
e1a0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
e1b0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
e1c0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
e1d0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
e1e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e1f0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
e200: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
e210: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
e220: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
e230: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
e240: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
e250: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
e260: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
e270: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
e280: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
e290: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
e2a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
e2b0: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
e2c0: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
e2d0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
e2e0: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  a(chan);..    /*
e2f0: 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65   Get certificate
e300: 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c   for peer or sel
e310: 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  f */.    if (obj
e320: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20  c == 2) {..peer 
e330: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63  = SSL_get_peer_c
e340: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
e350: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
e360: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20   else {..peer = 
e370: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63  SSL_get_certific
e380: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
e390: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  l);.    }..    /
e3a0: 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69  * Get X509 certi
e3b0: 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20  ficate info */. 
e3c0: 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09     if (peer) {..
e3d0: 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77  objPtr = Tls_New
e3e0: 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20  X509Obj(interp, 
e3f0: 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63  peer);..if (objc
e400: 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35   == 2) {..    X5
e410: 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09  09_free(peer);..
e420: 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b      peer = NULL;
e430: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ..}.    } else {
e440: 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e  ..objPtr = Tcl_N
e450: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
e460: 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  L);.    }..    /
e470: 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20  * Peer name */. 
e480: 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
e490: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
e4a0: 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67  peername", SSL_g
e4b0: 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61  et0_peername(sta
e4c0: 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
e4d0: 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
e4e0: 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
e4f0: 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67  , "sbits", SSL_g
e500: 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73  et_cipher_bits(s
e510: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55  tatePtr->ssl, NU
e520: 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65  LL));..    ciphe
e530: 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f  rs = (char*)SSL_
e540: 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65  get_cipher(state
e550: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c  Ptr->ssl);.    L
e560: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
e570: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
e580: 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31  er", ciphers, -1
e590: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
e5a0: 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69  y the X509 certi
e5b0: 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64  ficate presented
e5c0: 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a   by the peer */.
e5d0: 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
e5e0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
e5f0: 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a  "verifyResult",.
e600: 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72  .X509_verify_cer
e610: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53  t_error_string(S
e620: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
e630: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
e640: 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  sl)), -1);..    
e650: 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a  /* Verify mode *
e660: 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c  /.    mode = SSL
e670: 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65  _get_verify_mode
e680: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
e690: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26  .    if (mode &&
e6a0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45   SSL_VERIFY_NONE
e6b0: 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  ) {..LAPPEND_STR
e6c0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
e6d0: 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22   "verifyMode", "
e6e0: 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
e6f0: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62  } else {..Tcl_Ob
e700: 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20  j *listObjPtr = 
e710: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
e720: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f  , NULL);..if (mo
e730: 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
e740: 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63  _PEER) {..    Tc
e750: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
e760: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
e770: 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
e780: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65  ewStringObj("pee
e790: 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  r", -1));..}..if
e7a0: 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
e7b0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
e7c0: 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20  PEER_CERT) {..  
e7d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
e7e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
e7f0: 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
e800: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e810: 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72  "fail if no peer
e820: 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d   cert", -1));..}
e830: 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
e840: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
e850: 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  ONCE) {..    Tcl
e860: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
e870: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
e880: 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
e890: 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65  wStringObj("clie
e8a0: 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a  nt once", -1));.
e8b0: 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20  .}..if (mode && 
e8c0: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f  SSL_VERIFY_POST_
e8d0: 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20  HANDSHAKE) {..  
e8e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
e8f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
e900: 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
e910: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
e920: 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22  "post handshake"
e930: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50  , -1));..}..LAPP
e940: 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20  END_OBJ(interp, 
e950: 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
e960: 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72  ode", listObjPtr
e970: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ).    }..    /* 
e980: 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74  Verify mode dept
e990: 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44  h */.    LAPPEND
e9a0: 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
e9b0: 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74  Ptr, "verifyDept
e9c0: 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  h", SSL_get_veri
e9d0: 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74  fy_depth(statePt
e9e0: 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f  r->ssl));..    /
e9f0: 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
ea00: 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
ea10: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
ea20: 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f  e negotiation */
ea30: 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c  .    SSL_get0_al
ea40: 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74  pn_selected(stat
ea50: 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74  ePtr->ssl, &prot
ea60: 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41  o, &len);.    LA
ea70: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
ea80: 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22  , objPtr, "alpn"
ea90: 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c  , (char *)proto,
eaa0: 20 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20   (int) len);.   
eab0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
eac0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
ead0: 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
eae0: 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74  _version(statePt
eaf0: 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20  r->ssl), -1);.. 
eb00: 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
eb10: 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
eb20: 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
eb30: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
eb40: 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
eb50: 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
eb60: 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
eb70: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
eb80: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
eb90: 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  = SSL_get_signat
eba0: 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
ebb0: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
ebc0: 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
ebd0: 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20  ) {nid = 0;}.   
ebe0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
ebf0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69  erp, objPtr, "si
ec00: 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72  gnatureHashAlgor
ec10: 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ithm", OBJ_nid2l
ec20: 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
ec30: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
ec40: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
ec50: 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
ec60: 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
ec70: 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
ec80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
ec90: 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
eca0: 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73  ature_type_nid(s
ecb0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
ecc0: 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
ecd0: 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
ece0: 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
ecf0: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
ed00: 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79  tr, "signatureTy
ed10: 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  pe", OBJ_nid2ln(
ed20: 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  nid), -1);..    
ed30: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
ed40: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
ed50: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
ed60: 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74 61  _OK;..clientData
ed70: 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 7d   = clientData;.}
ed80: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
ed90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
edd0: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f  * ConnectionInfo
ede0: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
edf0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
ee00: 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
ee10: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
ee20: 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65  .A list of conne
ee30: 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20  ction info.  *. 
ee40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
ee50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee80: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
ee90: 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49   int ConnectionI
eea0: 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  nfoObjCmd(Client
eeb0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
eec0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
eed0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
eee0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
eef0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
ef00: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
ef10: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
ef20: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a   set a mode on *
ef30: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
ef40: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
ef50: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
ef60: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63  socket */.    Tc
ef70: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a  l_Obj *objPtr, *
ef80: 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e  listPtr;.    con
ef90: 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20  st SSL *ssl;.   
efa0: 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45   const SSL_CIPHE
efb0: 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63  R *cipher;.    c
efc0: 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e  onst SSL_SESSION
efd0: 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63   *session;.    c
efe0: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b  onst EVP_MD *md;
eff0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
f000: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
f010: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
f020: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
f030: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43  el");..return(TC
f040: 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a  L_ERROR);.    }.
f050: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
f060: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
f070: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
f080: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
f090: 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20   NULL), NULL);. 
f0a0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
f0b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
f0c0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c  L) {..return(TCL
f0d0: 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a  _ERROR);.    }..
f0e0: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
f0f0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
f100: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
f110: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
f120: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
f130: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
f140: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
f150: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
f160: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
f170: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
f180: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
f190: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
f1a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
f1b0: 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c  e(chan),..    "\
f1c0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
f1d0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54  nnel", NULL);..T
f1e0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
f1f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
f200: 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48  CONNECTION", "CH
f210: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
f220: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
f230: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
f240: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
f250: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
f260: 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
f270: 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e  L);..    /* Conn
f280: 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ection info */. 
f290: 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53     statePtr = (S
f2a0: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
f2b0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
f2c0: 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c  a(chan);.    ssl
f2d0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   = statePtr->ssl
f2e0: 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d  ;.    if (ssl !=
f2f0: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e   NULL) {../* con
f300: 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f  nection state */
f310: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
f320: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
f330: 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65  tate", SSL_state
f340: 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c  _string_long(ssl
f350: 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74  ), -1);.../* Get
f360: 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73   SNI requested s
f370: 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c  erver name */..L
f380: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
f390: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76  p, objPtr, "serv
f3a0: 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74  ername", SSL_get
f3b0: 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
f3c0: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
f3d0: 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29  _host_name), -1)
f3e0: 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
f3f0: 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
f400: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
f410: 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
f420: 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
f430: 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
f440: 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
f450: 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
f460: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
f470: 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
f480: 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
f490: 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
f4a0: 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
f4b0: 70 6f 72 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  port(ssl));.../*
f4c0: 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c 65   Get security le
f4d0: 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  vel */..LAPPEND_
f4e0: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
f4f0: 74 72 2c 20 22 73 65 63 75 72 69 74 79 6c 65 76  tr, "securitylev
f500: 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63  el", SSL_get_sec
f510: 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29  urity_level(ssl)
f520: 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
f530: 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  info */..LAPPEND
f540: 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
f550: 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72  jPtr, "session_r
f560: 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73  eused", SSL_sess
f570: 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29  ion_reused(ssl))
f580: 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72  ;.../* Is server
f590: 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e   info */..LAPPEN
f5a0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
f5b0: 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65  bjPtr, "is_serve
f5c0: 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65  r", SSL_is_serve
f5d0: 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  r(ssl));.../* Is
f5e0: 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e   DTLS */..LAPPEN
f5f0: 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
f600: 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22  bjPtr, "is_dtls"
f610: 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73  , SSL_is_dtls(ss
f620: 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
f630: 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
f640: 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
f650: 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
f660: 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
f670: 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
f680: 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
f690: 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
f6a0: 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
f6b0: 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
f6c0: 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
f6d0: 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
f6e0: 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
f6f0: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
f700: 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
f710: 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
f720: 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
f730: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
f740: 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
f750: 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
f760: 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
f770: 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
f780: 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
f790: 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
f7a0: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
f7b0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
f7c0: 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
f7d0: 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
f7e0: 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
f7f0: 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
f800: 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
f810: 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
f820: 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
f830: 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
f840: 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
f850: 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
f860: 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
f870: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
f880: 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
f890: 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
f8a0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
f8b0: 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
f8c0: 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
f8d0: 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
f8e0: 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
f8f0: 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
f900: 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
f910: 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
f920: 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
f930: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
f940: 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
f950: 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
f960: 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
f970: 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
f980: 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
f990: 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
f9a0: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
f9b0: 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
f9c0: 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
f9d0: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
f9e0: 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
f9f0: 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
fa00: 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
fa10: 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
fa20: 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
fa30: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
fa40: 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
fa50: 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
fa60: 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
fa70: 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
fa80: 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
fa90: 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
faa0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
fab0: 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
fac0: 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
fad0: 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
fae0: 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
faf0: 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
fb00: 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
fb10: 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
fb20: 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
fb30: 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
fb40: 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
fb50: 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
fb60: 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
fb70: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
fb80: 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
fb90: 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
fba0: 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
fbb0: 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
fbc0: 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
fbd0: 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
fbe0: 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
fbf0: 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
fc00: 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
fc10: 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
fc20: 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
fc30: 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
fc40: 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
fc50: 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
fc60: 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
fc70: 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
fc80: 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
fc90: 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
fca0: 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
fcb0: 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
fcc0: 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
fcd0: 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
fce0: 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
fcf0: 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
fd00: 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
fd10: 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
fd20: 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
fd30: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
fd40: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
fd50: 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
fd60: 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
fd70: 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
fd80: 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
fd90: 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
fda0: 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
fdb0: 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
fdc0: 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
fdd0: 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
fde0: 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
fdf0: 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
fe00: 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
fe10: 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
fe20: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
fe30: 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
fe40: 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
fe50: 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
fe60: 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
fe70: 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
fe80: 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
fe90: 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
fea0: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
feb0: 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
fec0: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
fed0: 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
fee0: 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
fef0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
ff00: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
ff10: 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
ff20: 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
ff30: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
ff40: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
ff50: 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
ff60: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
ff70: 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
ff80: 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
ff90: 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
ffa0: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
ffb0: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
ffc0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
ffd0: 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
ffe0: 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
fff0: 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68  _id, *proto;..ch
10000 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
10010 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
10020 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
10030 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
10040 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
10050 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
10060 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
10070 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
10080 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
10090 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
100a0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
100b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
100c0 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
100d0 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e  ar *) proto, (in
100e0 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52  t) len2);.../* R
100f0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
10100 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
10110 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e   result of the N
10120 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
10130 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
10140 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f  ..SSL_get0_next_
10150 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64  proto_negotiated
10160 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75  (ssl, &proto, &u
10170 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
10180 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10190 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20  r, "npn", (char 
101a0 2a 29 20 70 72 6f 74 6f 2c 20 28 69 6e 74 29 20  *) proto, (int) 
101b0 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  ulen);.#endif...
101c0 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20 73 65 73  /* Resumable ses
101d0 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  sion */..LAPPEND
101e0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
101f0 6a 50 74 72 2c 20 22 72 65 73 75 6d 61 62 6c 65  jPtr, "resumable
10200 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 69  ", SSL_SESSION_i
10210 73 5f 72 65 73 75 6d 61 62 6c 65 28 73 65 73 73  s_resumable(sess
10220 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ion));.../* Sess
10230 69 6f 6e 20 73 74 61 72 74 20 74 69 6d 65 20 28  ion start time (
10240 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 65 70  seconds since ep
10250 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  och) */..LAPPEND
10260 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62  _LONG(interp, ob
10270 6a 50 74 72 2c 20 22 73 74 61 72 74 5f 74 69 6d  jPtr, "start_tim
10280 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  e", SSL_SESSION_
10290 67 65 74 5f 74 69 6d 65 28 73 65 73 73 69 6f 6e  get_time(session
102a0 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 6f 75 74  ));.../* Timeout
102b0 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f 43 54 58   value - SSL_CTX
102c0 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20 28 69 6e  _get_timeout (in
102d0 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c 41   seconds) */..LA
102e0 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
102f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 6d 65  p, objPtr, "time
10300 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  out", SSL_SESSIO
10310 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74 28 73 65  N_get_timeout(se
10320 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53 65  ssion));.../* Se
10330 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c 53 76 31  ssion id - TLSv1
10340 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20 6f 6e 6c  .2 and below onl
10350 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  y */..session_id
10360 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
10370 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
10380 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
10390 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
103a0 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
103b0 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c  id", session_id,
103c0 20 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09   (int) ulen);...
103d0 2f 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65  /* Session conte
103e0 78 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69  xt */..session_i
103f0 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  d = SSL_SESSION_
10400 67 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28  get0_id_context(
10410 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
10420 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
10430 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10440 20 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78   "session_contex
10450 74 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20  t", session_id, 
10460 28 69 6e 74 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  (int) ulen);.../
10470 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
10480 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
10490 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
104a0 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
104b0 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
104c0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
104d0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
104e0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69  Ptr, "session_ti
104f0 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28  cket", ticket, (
10500 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  int) len2);.../*
10510 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
10520 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20 28 69  lifetime hint (i
10530 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a 09 4c  n seconds) */..L
10540 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
10550 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c 69 66  rp, objPtr, "lif
10560 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53  etime", SSL_SESS
10570 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c  ION_get_ticket_l
10580 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65 73  ifetime_hint(ses
10590 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 63  sion));.../* Tic
105a0 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a 2f 0a  ket app data */.
105b0 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74  .SSL_SESSION_get
105c0 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61  0_ticket_appdata
105d0 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65  (session, &ticke
105e0 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50  t, &len2);..LAPP
105f0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
10600 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b  p, objPtr, "tick
10610 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69  et_app_data", ti
10620 63 6b 65 74 2c 20 28 69 6e 74 29 20 6c 65 6e 32  cket, (int) len2
10630 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74  );.../* Get mast
10640 65 72 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20  er key */..len2 
10650 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
10660 74 5f 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73  t_master_key(ses
10670 73 69 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53  sion, buffer, SS
10680 4c 5f 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59  L_MAX_MASTER_KEY
10690 5f 4c 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45  _LENGTH);..LAPPE
106a0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
106b0 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65  , objPtr, "maste
106c0 72 5f 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20  r_key", buffer, 
106d0 28 69 6e 74 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  (int) len2);.../
106e0 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64  * Compression id
106f0 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   */..unsigned in
10700 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  t id = SSL_SESSI
10710 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f  ON_get_compress_
10720 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41  id(session);..LA
10730 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10740 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
10750 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d  ession_id", id =
10760 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22  = 1 ? "zlib" : "
10770 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
10780 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  }..    /* Compre
10790 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
107a0 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
107b0 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45  L) {.#ifdef HAVE
107c0 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _SSL_COMPRESSION
107d0 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54  ..const COMP_MET
107e0 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e  HOD *comp, *expn
107f0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65  ;..comp = SSL_ge
10800 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65  t_current_compre
10810 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70  ssion(ssl);..exp
10820 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  n = SSL_get_curr
10830 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73  ent_expansion(ss
10840 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l);...LAPPEND_ST
10850 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10860 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  , "compression",
10870 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50   comp ? SSL_COMP
10880 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
10890 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  : "none", -1);..
108a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
108b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
108c0 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20  ansion", expn ? 
108d0 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
108e0 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22  e(expn) : "none"
108f0 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41  , -1);.#else..LA
10900 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10910 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
10920 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ession", "none",
10930 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
10940 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10950 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
10960 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e  "none", -1);.#en
10970 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
10980 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  * Server info */
10990 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64  .    {..long mod
109a0 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f  e = SSL_CTX_get_
109b0 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
109c0 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
109d0 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a  );..char *msg;..
109e0 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
109f0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20  SESS_CACHE_OFF) 
10a00 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66  {..    msg = "of
10a10 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  f";..} else if (
10a20 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
10a30 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
10a40 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65  .    msg = "clie
10a50 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  nt";..} else if 
10a60 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
10a70 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b  _CACHE_SERVER) {
10a80 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72  ..    msg = "ser
10a90 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
10aa0 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
10ab0 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a  S_CACHE_BOTH) {.
10ac0 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68  .    msg = "both
10ad0 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ";..} else {..  
10ae0 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e    msg = "unknown
10af0 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53  ";..}..LAPPEND_S
10b00 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10b10 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  r, "session_cach
10b20 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31  e_mode", msg, -1
10b30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10b40 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20   CA List */.    
10b50 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76  /* IF not a serv
10b60 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  er, same as SSL_
10b70 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73  get0_peer_CA_lis
10b80 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d  t. If server sam
10b90 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74  e as SSL_CTX_get
10ba0 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20  _client_CA_list 
10bb0 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d  */.    listPtr =
10bc0 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
10bd0 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54  0, NULL);.    ST
10be0 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
10bf0 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20  ) *ca_list;.    
10c00 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53  if ((ca_list = S
10c10 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  SL_get_client_CA
10c20 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e  _list(ssl)) != N
10c30 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
10c40 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 0a 09 66  fer[BUFSIZ];...f
10c50 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
10c60 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
10c70 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b  num(ca_list); i+
10c80 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e  +) {..    X509_N
10c90 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58  AME *name = sk_X
10ca0 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63  509_NAME_value(c
10cb0 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20  a_list, i);..   
10cc0 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58   if (name) {...X
10cd0 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65  509_NAME_oneline
10ce0 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42  (name, buffer, B
10cf0 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69  UFSIZ);...Tcl_Li
10d00 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10d10 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
10d20 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
10d30 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
10d40 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
10d50 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f   }.    LAPPEND_O
10d60 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
10d70 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73  r, "caList", lis
10d80 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45  tPtr);.    LAPPE
10d90 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
10da0 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f  bjPtr, "caListCo
10db0 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41  unt", sk_X509_NA
10dc0 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29  ME_num(ca_list))
10dd0 3b 0a 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ;...    Tcl_SetO
10de0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10df0 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
10e00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63 6c  turn TCL_OK;..cl
10e10 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e  ientData = clien
10e20 74 44 61 74 61 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  tData;.}.../*. *
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10e70 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
10e80 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
10e90 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
10ea0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
10eb0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
10ec0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
10ed0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
10ee0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
10ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10f20 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
10f30 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43  int.MiscObjCmd(C
10f40 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
10f50 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
10f60 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
10f70 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
10f80 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
10f90 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
10fa0 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
10fb0 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
10fc0 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
10fd0 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
10fe0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
10ff0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
11000 69 6e 74 20 63 6d 64 2c 20 69 73 53 74 72 3b 0a  int cmd, isStr;.
11010 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
11020 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20 64 70 72  16384];..    dpr
11030 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
11040 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
11050 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
11060 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11070 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
11080 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
11090 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
110a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
110b0 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
110c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
110d0 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
110e0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
110f0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
11100 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11110 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
11120 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
11130 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
11140 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
11150 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
11160 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
11170 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
11180 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
11190 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
111a0 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
111b0 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
111c0 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
111d0 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
111e0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
111f0 3b 0a 09 20 20 20 20 69 6e 74 20 6c 69 73 74 63  ;..    int listc
11200 2c 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f  ,i;...    BIO *o
11210 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63  ut=NULL;...    c
11220 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53  har *k_C="",*k_S
11230 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f  T="",*k_L="",*k_
11240 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b  O="",*k_OU="",*k
11250 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d  _CN="",*k_Email=
11260 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b  "";..    char *k
11270 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73  eyout,*pemout,*s
11280 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79  tr;..    int key
11290 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61  size,serial=0,da
112a0 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45  ys=365;..#if OPE
112b0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
112c0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
112d0 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62  L..    BIGNUM *b
112e0 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ne = NULL;..    
112f0 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b  RSA *rsa = NULL;
11300 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f  .#else..    EVP_
11310 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20  PKEY_CTX *ctx = 
11320 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20  NULL;.#endif... 
11330 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20     if ((objc<5) 
11340 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09  || (objc>6)) {..
11350 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
11360 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
11370 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66  v, "keysize keyf
11380 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e  ile certfile ?in
11390 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20  fo?");...return 
113a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
113b0 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f  }...    if (Tcl_
113c0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
113d0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
113e0 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f  keysize) != TCL_
113f0 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54  OK) {...return T
11400 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
11410 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c  ..    keyout=Tcl
11420 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11430 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74  3]);..    pemout
11440 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
11450 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66  bjv[4]);..    if
11460 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c   (isStr) {...Tcl
11470 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b  _SetVar(interp,k
11480 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54  eyout,"",0);...T
11490 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
114a0 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,pemout,"",0);..
114b0 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
114c0 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20  objc>=6) {...if 
114d0 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45  (Tcl_ListObjGetE
114e0 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
114f0 6f 62 6a 76 5b 35 5d 2c 0a 09 09 09 26 6c 69 73  objv[5],....&lis
11500 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54  tc, &listv) != T
11510 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72  CL_OK) {...    r
11520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11530 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73  ...}....if ((lis
11540 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09  tc%2) != 0) {...
11550 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
11560 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d  t(interp,"Inform
11570 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20  ation list must 
11580 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72  have even number
11590 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e   of arguments",N
115a0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
115b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
115c0 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  }...for (i=0; i<
115d0 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09  listc; i+=2) {..
115e0 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74  .    str=Tcl_Get
115f0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29  String(listv[i])
11600 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ;...    if (strc
11610 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d  mp(str,"days")==
11620 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
11630 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
11640 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
11650 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a  &days)!=TCL_OK).
11660 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
11670 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
11680 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
11690 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d  (str,"serial")==
116a0 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
116b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
116c0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
116d0 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b  &serial)!=TCL_OK
116e0 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
116f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
11700 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
11710 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20  mp(str,"C")==0) 
11720 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74  {....k_C=Tcl_Get
11730 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
11740 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
11750 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
11760 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "ST")==0) {....k
11770 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _ST=Tcl_GetStrin
11780 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
11790 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
117a0 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d  strcmp(str,"L")=
117b0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c  =0) {....k_L=Tcl
117c0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
117d0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
117e0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
117f0 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09  str,"O")==0) {..
11800 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_O=Tcl_GetStr
11810 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
11820 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
11830 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55   (strcmp(str,"OU
11840 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55  ")==0) {....k_OU
11850 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
11860 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
11870 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
11880 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30  cmp(str,"CN")==0
11890 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f  ) {....k_CN=Tcl_
118a0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
118b0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
118c0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
118d0 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20  tr,"Email")==0) 
118e0 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c  {....k_Email=Tcl
118f0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
11900 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
11910 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65  else {....Tcl_Se
11920 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
11930 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65  Unknown paramete
11940 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74  r",NULL);....ret
11950 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
11960 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
11970 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
11980 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
11990 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
119a0 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b   bne = BN_new();
119b0 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f  ..    rsa = RSA_
119c0 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79  new();..    pkey
119d0 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28   = EVP_PKEY_new(
119e0 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20  );..    if (bne 
119f0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d  == NULL || rsa =
11a00 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d  = NULL || pkey =
11a10 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65  = NULL || !BN_se
11a20 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46  t_word(bne,RSA_F
11a30 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e  4) ||...!RSA_gen
11a40 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61  erate_key_ex(rsa
11a50 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20  , keysize, bne, 
11a60 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b  NULL) || !EVP_PK
11a70 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b  EY_assign_RSA(pk
11a80 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56  ey, rsa)) {...EV
11a90 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
11aa0 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65  );.../* RSA_free
11ab0 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20  (rsa); freed by 
11ac0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f  EVP_PKEY_free */
11ad0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
11ae0 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79  .#else..    pkey
11af0 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28   = EVP_RSA_gen((
11b00 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65  unsigned int) ke
11b10 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78  ysize);..    ctx
11b20 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
11b30 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a  new(pkey,NULL);.
11b40 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d  .    if (pkey ==
11b50 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20   NULL || ctx == 
11b60 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45  NULL || !EVP_PKE
11b70 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74  Y_keygen_init(ct
11b80 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45  x) ||...!EVP_PKE
11b90 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65  Y_CTX_set_rsa_ke
11ba0 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b  ygen_bits(ctx, k
11bb0 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f  eysize) || !EVP_
11bc0 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c  PKEY_keygen(ctx,
11bd0 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50   &pkey)) {...EVP
11be0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
11bf0 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58  ;...EVP_PKEY_CTX
11c00 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64  _free(ctx);.#end
11c10 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  if...Tcl_SetResu
11c20 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
11c30 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
11c40 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
11c50 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
11c60 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
11c70 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  {...if (isStr) {
11c80 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
11c90 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
11ca0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
11cb0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
11cc0 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
11cd0 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
11ce0 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
11cf0 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
11d00 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
11d10 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
11d20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
11d30 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
11d40 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
11d50 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66  terp,keyout,buff
11d60 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
11d70 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
11d80 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
11d90 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
11da0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
11db0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
11dc0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
11dd0 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75  lename(out,keyou
11de0 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
11df0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
11e00 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
11e10 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
11e20 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d  L);...    /* PEM
11e30 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72  _write_bio_RSAPr
11e40 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73  ivateKey(out, rs
11e50 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  a, NULL, NULL, 0
11e60 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a  , NULL, NULL); *
11e70 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  /...    BIO_free
11e80 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a  _all(out);.. .}.
11e90 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30  ...if ((cert=X50
11ea0 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20  9_new())==NULL) 
11eb0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
11ec0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
11ed0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ror generating c
11ee0 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65  ertificate reque
11ef0 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  st",NULL);...   
11f00 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
11f10 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
11f20 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
11f30 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
11f40 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
11f50 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
11f60 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
11f70 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73  );...}....X509_s
11f80 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c  et_version(cert,
11f90 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47  2);...ASN1_INTEG
11fa0 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f  ER_set(X509_get_
11fb0 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72  serialNumber(cer
11fc0 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35  t),serial);...X5
11fd0 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
11fe0 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72  09_getm_notBefor
11ff0 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35  e(cert),0);...X5
12000 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35  09_gmtime_adj(X5
12010 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72  09_getm_notAfter
12020 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a  (cert),(long)60*
12030 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58  60*24*days);...X
12040 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63  509_set_pubkey(c
12050 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61  ert,pkey);....na
12060 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a  me=X509_get_subj
12070 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a  ect_name(cert);.
12080 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
12090 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
120a0 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47  me,"C", MBSTRING
120b0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
120c0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
120d0 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  C, -1, -1, 0);..
120e0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
120f0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
12100 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f  ,"ST", MBSTRING_
12110 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
12120 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53  gned char *) k_S
12130 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  T, -1, -1, 0);..
12140 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
12150 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
12160 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"L", MBSTRING_A
12170 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
12180 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c  ned char *) k_L,
12190 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
121a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
121b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
121c0 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  O", MBSTRING_ASC
121d0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
121e0 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d  d char *) k_O, -
121f0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
12200 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12210 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55  _by_txt(name,"OU
12220 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
12230 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
12240 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d   char *) k_OU, -
12250 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
12260 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
12270 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e  _by_txt(name,"CN
12280 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
12290 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
122a0 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d   char *) k_CN, -
122b0 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
122c0 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
122d0 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d  _by_txt(name,"Em
122e0 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ail", MBSTRING_A
122f0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
12300 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d  ned char *) k_Em
12310 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  ail, -1, -1, 0);
12320 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62  ....X509_set_sub
12330 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e  ject_name(cert,n
12340 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35  ame);....if (!X5
12350 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65  09_sign(cert,pke
12360 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29  y,EVP_sha256()))
12370 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72   {...    X509_fr
12380 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20  ee(cert);...    
12390 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
123a0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
123b0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
123c0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
123d0 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
123e0 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54  ;.#endif...    T
123f0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
12400 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69  erp,"Error signi
12410 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c  ng certificate",
12420 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
12430 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
12440 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29  .}....if (isStr)
12450 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
12460 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29  _new(BIO_s_mem()
12470 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
12480 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
12490 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42  cert);...    i=B
124a0 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66  IO_read(out,buff
124b0 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72  er,sizeof(buffer
124c0 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69  )-1);...    i=(i
124d0 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20  <0) ? 0 : i;... 
124e0 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30     buffer[i]='\0
124f0 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74  ';...    Tcl_Set
12500 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75  Var(interp,pemou
12510 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20  t,buffer,0);... 
12520 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74     BIO_flush(out
12530 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  );...    BIO_fre
12540 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65  e(out);...} else
12550 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f   {...    out=BIO
12560 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28  _new(BIO_s_file(
12570 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72  ));...    BIO_wr
12580 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74  ite_filename(out
12590 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20  ,pemout);...    
125a0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
125b0 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
125c0 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
125d0 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35  (out);...}....X5
125e0 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09  09_free(cert);..
125f0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
12600 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
12610 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
12620 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
12630 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
12640 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a  endif..    }..}.
12650 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61  .break;.    defa
12660 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ult:..break;.   
12670 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
12680 4c 5f 4f 4b 3b 0a 09 63 6c 69 65 6e 74 44 61 74  L_OK;..clientDat
12690 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  a = clientData;.
126a0 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
126b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e  *********/./* In
126c0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2a  it             *
126d0 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
126e0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
126f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65  --. *. * Tls_Fre
12740 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  e --. *. *.This 
12750 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
12760 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
12770 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
12780 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
12790 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
127a0 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
127b0 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73  elow 1. *. * Res
127c0 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a  ults:. *.none. *
127d0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
127e0 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74  :. *.Frees all t
127f0 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d  he state. *. *--
12800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12840 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46  -. */.void.Tls_F
12850 72 65 65 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50  ree(char *blockP
12860 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  tr) {.    State 
12870 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
12880 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a  te *)blockPtr;..
12890 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
128a0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f  led");..    Tls_
128b0 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b  Clean(statePtr);
128c0 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63  .    ckfree(bloc
128d0 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  kPtr);.}.../*. *
128e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
128f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12920 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c  ---. *. * Tls_Cl
12930 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  ean --. *. *.Thi
12940 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61  s procedure clea
12950 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c  ns up when a SSL
12960 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68   socket based ch
12970 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73  annel. *.is clos
12980 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72  ed and its refer
12990 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73  ence count falls
129a0 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20   below 1.  This 
129b0 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c  should. *.be cal
129c0 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c  led synchronousl
129d0 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72  y by the ClosePr
129e0 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20  oc, not in the. 
129f0 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65  *.EventuallyFree
12a00 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a   callback.. *. *
12a10 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
12a20 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
12a30 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
12a40 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
12a50 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a90 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54  -----. */.void T
12aa0 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a  ls_Clean(State *
12ab0 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20  statePtr) {.    
12ac0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
12ad0 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  );..    /*.     
12ae0 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67  * we're assuming
12af0 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65   here that we're
12b00 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64   single-threaded
12b10 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20  .     */.    if 
12b20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72  (statePtr->timer
12b30 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f   != (Tcl_TimerTo
12b40 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ken) NULL) {..Tc
12b50 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e  l_DeleteTimerHan
12b60 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74  dler(statePtr->t
12b70 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72  imer);..statePtr
12b80 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a  ->timer = NULL;.
12b90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
12ba0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
12bb0 20 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65   {..ckfree(state
12bc0 50 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73  Ptr->protos);..s
12bd0 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
12be0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
12bf0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
12c00 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20  bio) {../* This 
12c10 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68  will call SSL_sh
12c20 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34  utdown. Bug 1414
12c30 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  045 */..dprintf(
12c40 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70  "BIO_free_all(%p
12c50 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69  )", statePtr->bi
12c60 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c  o);..BIO_free_al
12c70 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  l(statePtr->bio)
12c80 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ;..statePtr->bio
12c90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
12ca0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
12cb0 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66  >ssl) {..dprintf
12cc0 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22 2c  ("SSL_free(%p)",
12cd0 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b   statePtr->ssl);
12ce0 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74 65  ..SSL_free(state
12cf0 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74  Ptr->ssl);..stat
12d00 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c  ePtr->ssl = NULL
12d10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
12d20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b  statePtr->ctx) {
12d30 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73  ..SSL_CTX_free(s
12d40 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
12d50 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20  statePtr->ctx = 
12d60 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
12d70 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
12d80 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44  llback) {..Tcl_D
12d90 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
12da0 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
12db0 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  ..statePtr->call
12dc0 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  back = NULL;.   
12dd0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
12de0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b  Ptr->password) {
12df0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
12e00 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
12e10 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74  sword);..statePt
12e20 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55  r->password = NU
12e30 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
12e40 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
12e50 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
12e60 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
12e70 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72  vcmd);..statePtr
12e80 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  ->vcmd = NULL;. 
12e90 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
12ea0 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  f("Returning");.
12eb0 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
12ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
12f00 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20   * Tls_Init --. 
12f10 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70  *. *.This is a p
12f20 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a  ackage initializ
12f30 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c  ation procedure,
12f40 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64   which is called
12f50 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20  . *.by Tcl when 
12f60 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20  this package is 
12f70 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  to be added to a
12f80 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  n interpreter.. 
12f90 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53  *. * Results:  S
12fa0 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  sl configured an
12fb0 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53  d loaded. *. * S
12fc0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
12fd0 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20   create the ssl 
12fe0 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c  command, initial
12ff0 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a  ize ssl context.
13000 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13040 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c  --------. */.DLL
13050 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49  EXPORT int Tls_I
13060 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
13070 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f  interp) {.    co
13080 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
13090 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
130a0 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
130b0 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d  l.h"..0x00.    }
130c0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
130d0 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 54  Called");..#if T
130e0 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
130f0 20 3e 20 38 0a 23 69 66 64 65 66 20 55 53 45 5f   > 8.#ifdef USE_
13100 54 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66  TCL_STUBS.    if
13110 20 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28   (Tcl_InitStubs(
13120 69 6e 74 65 72 70 2c 20 22 39 2e 30 22 2c 20 30  interp, "9.0", 0
13130 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
13140 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13150 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13160 20 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75   if (Tcl_PkgRequ
13170 69 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c  ire(interp, "Tcl
13180 22 2c 20 22 39 2e 30 2d 22 2c 20 30 29 20 3d 3d  ", "9.0-", 0) ==
13190 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
131a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
131b0 7d 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20 55  }.#else.#ifdef U
131c0 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
131d0 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
131e0 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 35 22  bs(interp, "8.5"
131f0 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  , 0) == NULL) {.
13200 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13210 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  R;.    }.#endif.
13220 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67 52      if (Tcl_PkgR
13230 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20 22  equire(interp, "
13240 54 63 6c 22 2c 20 22 38 2e 35 2d 22 2c 20 30 29  Tcl", "8.5-", 0)
13250 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
13260 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13270 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
13280 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28   if (TlsLibInit(
13290 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
132a0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
132b0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
132c0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20   not initialize 
132d0 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 4e 55  SSL library", NU
132e0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
132f0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
13300 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
13310 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
13320 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
13330 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
13340 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
13350 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
13360 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
13370 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
13380 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
13390 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e  nterp, "tls::han
133a0 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
133b0 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
133c0 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43  tData) 0, (Tcl_C
133d0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
133e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
133f0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
13400 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 69 6d  interp, "tls::im
13410 70 6f 72 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a  port", ImportObj
13420 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
13430 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ) 0, (Tcl_CmdDel
13440 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
13450 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
13460 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
13470 70 2c 20 22 74 6c 73 3a 3a 6d 69 73 63 22 2c 20  p, "tls::misc", 
13480 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  MiscObjCmd, (Cli
13490 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c  entData) 0, (Tcl
134a0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
134b0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
134c0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
134d0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
134e0 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70  unimport", Unimp
134f0 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
13500 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f  ntData) 0, (Tcl_
13510 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
13520 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
13530 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
13540 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73  (interp, "tls::s
13550 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62  tatus", StatusOb
13560 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
13570 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65  a) 0, (Tcl_CmdDe
13580 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
13590 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 44 69 67 65  );..    Tls_Dige
135a0 73 74 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72  stCommands(inter
135b0 70 29 3b 0a 20 20 20 20 54 6c 73 5f 49 6e 66 6f  p);.    Tls_Info
135c0 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65 72 70 29  Commands(interp)
135d0 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65 72  ;..    if (inter
135e0 70 29 20 7b 0a 09 54 63 6c 5f 45 76 61 6c 28 69  p) {..Tcl_Eval(i
135f0 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69  nterp, tlsTclIni
13600 74 53 63 72 69 70 74 29 3b 0a 20 20 20 20 7d 0a  tScript);.    }.
13610 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
13620 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
13630 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c  p, PACKAGE_NAME,
13640 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
13650 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13690 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66  -*. *. *.Tls_Saf
136a0 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d  eInit --. *. *.-
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
136e0 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72 6f  . *.Standard pro
136f0 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64 20  cedure required 
13700 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49 6e  by 'load'.. *.In
13710 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20 65  itializes this e
13720 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20 73  xtension for a s
13730 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  afe interpreter.
13740 0a 20 2a 09 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 2d 2d 2d  ----------------
13760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13770 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65  ----*. *. *.Side
13780 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41 73   effects:. *..As
13790 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20   of 'Tls_Init'. 
137a0 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09  *. *.Result:. *.
137b0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
137c0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a 20  error code.. *. 
137d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
137e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13800 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c 4c  -------*. */.DLL
13810 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53  EXPORT int Tls_S
13820 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
13830 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20  rp *interp) {.  
13840 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
13850 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 28  d");.    return(
13860 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Tls_Init(interp)
13870 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
138b0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49  -*. *. *.TlsLibI
138c0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
138d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
138f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
13900 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  *.Initializes SS
13910 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70  L library once p
13920 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  er application. 
13930 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
13940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13960 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
13970 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74  ffects:. *..init
13980 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
13990 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  ary. *. *.Result
139a0 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  :. *..none. *. *
139b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139e0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74  ------*. */.stat
139f0 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69  ic int TlsLibIni
13a00 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69  t(int uninitiali
13a10 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ze) {.    static
13a20 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   int initialized
13a30 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74   = 0;.    int st
13a40 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23  atus = TCL_OK;.#
13a50 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
13a60 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
13a70 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
13a80 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e  DS).    size_t n
13a90 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66  um_locks;.#endif
13aa0 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74  ..    if (uninit
13ab0 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21  ialize) {..if (!
13ac0 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
13ad0 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b      dprintf("Ask
13ae0 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
13af0 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e  ze, but we are n
13b00 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29  ot initialized")
13b10 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 28 54  ;...    return(T
13b20 43 4c 5f 4f 4b 29 3b 0a 09 7d 0a 0a 09 64 70 72  CL_OK);..}...dpr
13b30 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75  intf("Asked to u
13b40 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a  ninitialize");..
13b50 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
13b60 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
13b70 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
13b80 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c  ADS)..Tcl_MutexL
13b90 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a  ock(&init_mx);..
13ba0 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20  .if (locks) {.. 
13bb0 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a     free(locks);.
13bc0 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c  .    locks = NUL
13bd0 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75  L;..    locksCou
13be0 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69  nt = 0;..}.#endi
13bf0 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  f..initialized =
13c00 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   0;..#if defined
13c10 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
13c20 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
13c30 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d  _THREADS)..Tcl_M
13c40 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74  utexUnlock(&init
13c50 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72  _mx);.#endif...r
13c60 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 20  eturn(TCL_OK);. 
13c70 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e     }..    if (in
13c80 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70  itialized) {..dp
13c90 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62  rintf("Called, b
13ca0 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64 20  ut using cached 
13cb0 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e  value");..return
13cc0 28 73 74 61 74 75 73 29 3b 0a 20 20 20 20 7d 0a  (status);.    }.
13cd0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
13ce0 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66  lled");..#if def
13cf0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
13d00 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
13d10 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
13d20 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28    Tcl_MutexLock(
13d30 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
13d40 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65  f.    initialize
13d50 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69  d = 1;..#if defi
13d60 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
13d70 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
13d80 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
13d90 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a   num_locks = 1;.
13da0 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d      locksCount =
13db0 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73   (int) num_locks
13dc0 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61  ;.    locks = ma
13dd0 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63  lloc(sizeof(*loc
13de0 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
13df0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63  ;.    memset(loc
13e00 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c  ks, 0, sizeof(*l
13e10 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b  ocks) * num_lock
13e20 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  s);.#endif..    
13e30 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f  /* Initialize BO
13e40 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64  TH libcrypto and
13e50 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20   libssl. */.    
13e60 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c  OPENSSL_init_ssl
13e70 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f  (OPENSSL_INIT_LO
13e80 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c  AD_SSL_STRINGS |
13e90 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f   OPENSSL_INIT_LO
13ea0 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47  AD_CRYPTO_STRING
13eb0 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  S..| OPENSSL_INI
13ec0 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52  T_ADD_ALL_CIPHER
13ed0 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
13ee0 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53  _ADD_ALL_DIGESTS
13ef0 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49  , NULL);..    BI
13f00 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20  O_new_tcl(NULL, 
13f10 30 29 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f  0);..#if 0.    /
13f20 2a 0a 20 20 20 20 20 2a 20 58 58 58 3a 54 4f 44  *.     * XXX:TOD
13f30 4f 3a 20 52 65 6d 6f 76 65 20 74 68 69 73 20 63  O: Remove this c
13f40 6f 64 65 20 61 6e 64 20 72 65 70 6c 61 63 65 20  ode and replace 
13f50 69 74 20 77 69 74 68 20 61 20 63 68 65 63 6b 0a  it with a check.
13f60 20 20 20 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67       * for enoug
13f70 68 20 65 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f  h entropy and do
13f80 20 6e 6f 74 20 74 72 79 20 74 6f 20 63 72 65 61   not try to crea
13f90 74 65 20 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20  te our own.     
13fa0 2a 20 74 65 72 72 69 62 6c 65 20 65 6e 74 72 6f  * terrible entro
13fb0 70 79 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f  py.     */.    /
13fc0 2a 0a 20 20 20 20 20 2a 20 53 65 65 64 20 74 68  *.     * Seed th
13fd0 65 20 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20  e random number 
13fe0 67 65 6e 65 72 61 74 6f 72 20 69 6e 20 74 68 65  generator in the
13ff0 20 53 53 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20   SSL library,.  
14000 20 20 20 2a 20 75 73 69 6e 67 20 74 68 65 20 64     * using the d
14010 6f 2f 77 68 69 6c 65 20 63 6f 6e 73 74 72 75 63  o/while construc
14020 74 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  t because of the
14030 20 62 75 67 20 6e 6f 74 65 20 69 6e 20 74 68 65   bug note in the
14040 0a 20 20 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20  .     * OpenSSL 
14050 46 41 51 20 61 74 20 68 74 74 70 3a 2f 2f 77 77  FAQ at http://ww
14060 77 2e 6f 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75  w.openssl.org/su
14070 70 70 6f 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55  pport/faq.html#U
14080 53 45 52 31 0a 20 20 20 20 20 2a 0a 20 20 20 20  SER1.     *.    
14090 20 2a 20 54 68 65 20 63 72 75 78 20 6f 66 20 74   * The crux of t
140a0 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 68  he problem is th
140b0 61 74 20 53 6f 6c 61 72 69 73 20 37 20 64 6f 65  at Solaris 7 doe
140c0 73 20 6e 6f 74 20 68 61 76 65 20 61 0a 20 20 20  s not have a.   
140d0 20 20 2a 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20    * /dev/random 
140e0 6f 72 20 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20  or /dev/urandom 
140f0 64 65 76 69 63 65 20 73 6f 20 69 74 20 63 61 6e  device so it can
14100 6e 6f 74 20 67 61 74 68 65 72 20 65 6e 6f 75 67  not gather enoug
14110 68 0a 20 20 20 20 20 2a 20 65 6e 74 72 6f 70 79  h.     * entropy
14120 20 66 72 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73   from the RAND_s
14130 65 65 64 28 29 20 77 68 65 6e 20 54 4c 53 20 69  eed() when TLS i
14140 6e 69 74 69 61 6c 69 7a 65 73 20 61 6e 64 20 72  nitializes and r
14150 65 66 75 73 65 73 0a 20 20 20 20 20 2a 20 74 6f  efuses.     * to
14160 20 67 6f 20 66 75 72 74 68 65 72 2e 20 45 61 72   go further. Ear
14170 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lier versions of
14180 20 4f 70 65 6e 53 53 4c 20 63 61 72 72 69 65 64   OpenSSL carried
14190 20 6f 6e 20 72 65 67 61 72 64 6c 65 73 73 2e 0a   on regardless..
141a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e       */.    sran
141b0 64 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  d((unsigned int)
141c0 20 74 69 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29   time((time_t *)
141d0 20 4e 55 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20   NULL));.    do 
141e0 7b 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  {..for (i = 0; i
141f0 20 3c 20 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20   < 16; i++) {.. 
14200 20 20 20 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d     rnd_seed[i] =
14210 20 31 20 2b 20 28 63 68 61 72 29 20 28 32 35 35   1 + (char) (255
14220 2e 30 20 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e  .0 * rand()/(RAN
14230 44 5f 4d 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a  D_MAX+1.0));..}.
14240 09 52 41 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73  .RAND_seed(rnd_s
14250 65 65 64 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f  eed, sizeof(rnd_
14260 73 65 65 64 29 29 3b 0a 20 20 20 20 7d 20 77 68  seed));.    } wh
14270 69 6c 65 20 28 52 41 4e 44 5f 73 74 61 74 75 73  ile (RAND_status
14280 28 29 20 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66  () != 1);.#endif
14290 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
142a0 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
142b0 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
142c0 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
142d0 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  xUnlock(&init_mx
142e0 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65 74 75  );.#endif...retu
142f0 72 6e 28 73 74 61 74 75 73 29 3b 0a 7d 0a        rn(status);.}.