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 22 74 6c 73 55 75 69 64 2e  nclude "tlsUuid.
0390: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h".#include <ope
03a0: 6e 73 73 6c 2f 72 73 61 2e 68 3e 0a 23 69 6e 63  nssl/rsa.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 61  lude <openssl/sa
03c0: 66 65 73 74 61 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d  festack.h>../* M
03d0: 69 6e 20 4f 70 65 6e 53 53 4c 20 76 65 72 73 69  in OpenSSL versi
03e0: 6f 6e 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  on */.#if OPENSS
03f0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
0400: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 23   < 0x10101000L.#
0410: 65 72 72 6f 72 20 22 4f 6e 6c 79 20 4f 70 65 6e  error "Only Open
0420: 53 53 4c 20 76 31 2e 31 2e 31 20 6f 72 20 6c 61  SSL v1.1.1 or la
0430: 74 65 72 20 69 73 20 73 75 70 70 6f 72 74 65 64  ter is supported
0440: 22 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 20 2a  ".#endif.../*. *
0450: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
0460: 74 69 6f 6e 73 0a 20 2a 2f 0a 0a 23 64 65 66 69  tions. */..#defi
0470: 6e 65 20 46 32 4e 28 6b 65 79 2c 20 64 73 70 29  ne F2N(key, dsp)
0480: 20 5c 0a 09 28 28 28 6b 65 79 29 20 3d 3d 20 4e   \..(((key) == N
0490: 55 4c 4c 29 20 3f 20 28 63 68 61 72 20 2a 29 4e  ULL) ? (char *)N
04a0: 55 4c 4c 20 3a 20 5c 0a 09 09 54 63 6c 5f 54 72  ULL : \...Tcl_Tr
04b0: 61 6e 73 6c 61 74 65 46 69 6c 65 4e 61 6d 65 28  anslateFileName(
04c0: 69 6e 74 65 72 70 2c 20 28 6b 65 79 29 2c 20 28  interp, (key), (
04d0: 64 73 70 29 29 29 0a 0a 73 74 61 74 69 63 20 53  dsp)))..static S
04e0: 53 4c 5f 43 54 58 20 2a 43 54 58 5f 49 6e 69 74  SL_CTX *CTX_Init
04f0: 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72  (State *statePtr
0500: 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20  , int isServer, 
0510: 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20  int proto, char 
0520: 2a 6b 65 79 2c 0a 09 09 63 68 61 72 20 2a 63 65  *key,...char *ce
0530: 72 74 66 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64  rtfile, unsigned
0540: 20 63 68 61 72 20 2a 6b 65 79 5f 61 73 6e 31 2c   char *key_asn1,
0550: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0560: 63 65 72 74 5f 61 73 6e 31 2c 0a 09 09 69 6e 74  cert_asn1,...int
0570: 20 6b 65 79 5f 61 73 6e 31 5f 6c 65 6e 2c 20 69   key_asn1_len, i
0580: 6e 74 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65 6e  nt cert_asn1_len
0590: 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 20  , char *CApath, 
05a0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 0a 09 09  char *CAfile,...
05b0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
05c0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
05d0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
05e0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
05f0: 73 74 61 74 69 63 20 69 6e 74 09 54 6c 73 4c 69  static int.TlsLi
0600: 62 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74  bInit(int uninit
0610: 69 61 6c 69 7a 65 29 3b 0a 0a 23 64 65 66 69 6e  ialize);..#defin
0620: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  e TLS_PROTO_SSL2
0630: 09 09 30 78 30 31 0a 23 64 65 66 69 6e 65 20 54  ..0x01.#define T
0640: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 09 09 30  LS_PROTO_SSL3..0
0650: 78 30 32 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x02.#define TLS_
0660: 50 52 4f 54 4f 5f 54 4c 53 31 09 09 30 78 30 34  PROTO_TLS1..0x04
0670: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0680: 54 4f 5f 54 4c 53 31 5f 31 09 30 78 30 38 0a 23  TO_TLS1_1.0x08.#
0690: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
06a0: 5f 54 4c 53 31 5f 32 09 30 78 31 30 0a 23 64 65  _TLS1_2.0x10.#de
06b0: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  fine TLS_PROTO_T
06c0: 4c 53 31 5f 33 09 30 78 32 30 0a 23 64 65 66 69  LS1_3.0x20.#defi
06d0: 6e 65 20 45 4e 41 42 4c 45 44 28 66 6c 61 67 2c  ne ENABLED(flag,
06e0: 20 6d 61 73 6b 29 09 28 28 28 66 6c 61 67 29 20   mask).(((flag) 
06f0: 26 20 28 6d 61 73 6b 29 29 20 3d 3d 20 28 6d 61  & (mask)) == (ma
0700: 73 6b 29 29 0a 0a 23 64 65 66 69 6e 65 20 53 53  sk))..#define SS
0710: 4c 4b 45 59 4c 4f 47 46 49 4c 45 09 09 22 53 53  LKEYLOGFILE.."SS
0720: 4c 4b 45 59 4c 4f 47 46 49 4c 45 22 0a 0a 2f 2a  LKEYLOGFILE"../*
0730: 0a 20 2a 20 54 68 72 65 61 64 2d 53 61 66 65 20  . * Thread-Safe 
0740: 54 4c 53 20 43 6f 64 65 0a 20 2a 2f 0a 0a 23 69  TLS Code. */..#i
0750: 66 64 65 66 20 54 43 4c 5f 54 48 52 45 41 44 53  fdef TCL_THREADS
0760: 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 53 53 4c  .#define OPENSSL
0770: 5f 54 48 52 45 41 44 5f 44 45 46 49 4e 45 53 0a  _THREAD_DEFINES.
0780: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0790: 6c 2f 6f 70 65 6e 73 73 6c 63 6f 6e 66 2e 68 3e  l/opensslconf.h>
07a0: 0a 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  ..#ifdef OPENSSL
07b0: 5f 54 48 52 45 41 44 53 0a 23 69 6e 63 6c 75 64  _THREADS.#includ
07c0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72 79 70 74  e <openssl/crypt
07d0: 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f  o.h>.#include <o
07e0: 70 65 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 0a 2f  penssl/ssl.h>../
07f0: 2a 0a 20 2a 20 54 68 72 65 61 64 65 64 20 6f 70  *. * Threaded op
0800: 65 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 73  eration requires
0810: 20 6c 6f 63 6b 69 6e 67 20 63 61 6c 6c 62 61 63   locking callbac
0820: 6b 73 0a 20 2a 20 42 61 73 65 64 20 66 72 6f 6d  ks. * Based from
0830: 20 2f 63 72 79 70 74 6f 2f 63 72 79 70 74 6c 69   /crypto/cryptli
0840: 62 2e 63 20 6f 66 20 4f 70 65 6e 53 53 4c 20 61  b.c of OpenSSL a
0850: 6e 64 20 4e 53 4f 70 65 6e 53 53 4c 2e 0a 20 2a  nd NSOpenSSL.. *
0860: 2f 0a 0a 73 74 61 74 69 63 20 54 63 6c 5f 4d 75  /..static Tcl_Mu
0870: 74 65 78 20 2a 6c 6f 63 6b 73 20 3d 20 4e 55 4c  tex *locks = NUL
0880: 4c 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  L;.static int lo
0890: 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 73 74  cksCount = 0;.st
08a0: 61 74 69 63 20 54 63 6c 5f 4d 75 74 65 78 20 69  atic Tcl_Mutex i
08b0: 6e 69 74 5f 6d 78 3b 0a 23 65 6e 64 69 66 20 2f  nit_mx;.#endif /
08c0: 2a 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  * OPENSSL_THREAD
08d0: 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 54  S */.#endif /* T
08e0: 43 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 0a 0c  CL_THREADS */...
08f0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
0900: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 61 6c 6c 62  ******/./* Callb
0910: 61 63 6b 73 20 20 20 20 20 20 20 20 2a 2f 0a 2f  acks        */./
0920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0930: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0980: 20 2a 0a 20 2a 20 45 76 61 6c 20 43 61 6c 6c 62   *. * Eval Callb
0990: 61 63 6b 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20  ack Command --. 
09a0: 2a 0a 20 2a 09 45 76 61 6c 20 63 61 6c 6c 62 61  *. *.Eval callba
09b0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 63  ck command and c
09c0: 61 74 63 68 20 61 6e 79 20 65 72 72 6f 72 73 0a  atch any errors.
09d0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
09e0: 2a 09 30 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65  *.0 = Command re
09f0: 74 75 72 6e 65 64 20 66 61 69 6c 20 6f 72 20 65  turned fail or e
0a00: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
0a10: 5f 45 52 52 4f 52 0a 20 2a 09 31 20 3d 20 43 6f  _ERROR. *.1 = Co
0a20: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 73  mmand returned s
0a30: 75 63 63 65 73 73 20 6f 72 20 65 76 61 6c 20 72  uccess or eval r
0a40: 65 74 75 72 6e 65 64 20 54 43 4c 5f 4f 4b 0a 20  eturned TCL_OK. 
0a50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
0a60: 73 3a 0a 20 2a 09 45 76 61 6c 75 61 74 65 73 20  s:. *.Evaluates 
0a70: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
0a80: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
0ad0: 61 74 69 63 20 69 6e 74 0a 45 76 61 6c 43 61 6c  atic int.EvalCal
0ae0: 6c 62 61 63 6b 28 54 63 6c 5f 49 6e 74 65 72 70  lback(Tcl_Interp
0af0: 20 2a 69 6e 74 65 72 70 2c 20 53 74 61 74 65 20   *interp, State 
0b00: 2a 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f  *statePtr, Tcl_O
0b10: 62 6a 20 2a 63 6d 64 50 74 72 29 20 7b 0a 20 20  bj *cmdPtr) {.  
0b20: 20 20 69 6e 74 20 63 6f 64 65 2c 20 6f 6b 20 3d    int code, ok =
0b30: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
0b40: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
0b50: 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76   Tcl_Preserve((v
0b60: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a  oid *) interp);.
0b70: 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65      Tcl_Preserve
0b80: 28 28 76 6f 69 64 20 2a 29 20 73 74 61 74 65 50  ((void *) stateP
0b90: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  tr);..    /* Eva
0ba0: 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l callback with 
0bb0: 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f  success for ok o
0bc0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31  r return value 1
0bd0: 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72  , fail for error
0be0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65   or return value
0bf0: 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65   0 */.    Tcl_Re
0c00: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0c10: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
0c20: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
0c30: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
0c40: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
0c50: 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43    dprintf("EvalC
0c60: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f  allback: %d", co
0c70: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  de);.    if (cod
0c80: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
0c90: 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20  /* Check result 
0ca0: 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  for return value
0cb0: 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65   */..Tcl_Obj *re
0cc0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
0cd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
0ce0: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20  ..if (result == 
0cf0: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49  NULL || Tcl_GetI
0d00: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
0d10: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21  , result, &ok) !
0d20: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
0d30: 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72   ok = 1;..}..dpr
0d40: 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64  intf("Result: %d
0d50: 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c  ", ok);.    } el
0d60: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d  se {../* Error -
0d70: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74   reject the cert
0d80: 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69  ificate */..dpri
0d90: 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f  ntf("Tcl_Backgro
0da0: 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20  undError");.#if 
0db0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
0dc0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
0dd0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
0de0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
0df0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
0e00: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
0e10: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
0e20: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
0e30: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
0e40: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76    Tcl_Release((v
0e50: 6f 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29  oid *) statePtr)
0e60: 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ;.    Tcl_Releas
0e70: 65 28 28 76 6f 69 64 20 2a 29 20 69 6e 74 65 72  e((void *) inter
0e80: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6f  p);.    return o
0e90: 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  k;.}.../*. *----
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0ee0: 20 2a 0a 20 2a 20 49 6e 66 6f 43 61 6c 6c 62 61   *. * InfoCallba
0ef0: 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69  ck --. *. *.Moni
0f00: 74 6f 72 73 20 53 53 4c 20 63 6f 6e 6e 65 63 74  tors SSL connect
0f10: 69 6f 6e 20 70 72 6f 63 65 73 73 0a 20 2a 0a 20  ion process. *. 
0f20: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
0f30: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
0f40: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
0f50: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
0f60: 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ined). *. *-----
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0fb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 49  */.static void.I
0fc0: 6e 66 6f 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  nfoCallback(cons
0fd0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  t SSL *ssl, int 
0fe0: 77 68 65 72 65 2c 20 69 6e 74 20 72 65 74 29 0a  where, int ret).
0ff0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
1000: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
1010: 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61 74 61  SSL_get_app_data
1020: 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a 20 20  ((SSL *)ssl);.  
1030: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1040: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
1050: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
1060: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
1070: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 61    const char *ma
1080: 6a 6f 72 2c 20 2a 6d 69 6e 6f 72 3b 0a 0a 20 20  jor, *minor;..  
1090: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
10a0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
10b0: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
10c0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
10d0: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
10e0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
10f0: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53  L_CB_HANDSHAKE_S
1100: 54 41 52 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d  TART) {..major =
1110: 20 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d   "handshake";..m
1120: 69 6e 6f 72 20 3d 20 22 73 74 61 72 74 22 3b 0a  inor = "start";.
1130: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 77      } else if (w
1140: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41  here & SSL_CB_HA
1150: 4e 44 53 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a  NDSHAKE_DONE) {.
1160: 09 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68  .major = "handsh
1170: 61 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22  ake";..minor = "
1180: 64 6f 6e 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73  done";.    } els
1190: 65 20 7b 0a 09 69 66 20 28 77 68 65 72 65 20 26  e {..if (where &
11a0: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09   SSL_CB_ALERT)..
11b0: 6d 61 6a 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b  major = "alert";
11c0: 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65  ..else if (where
11d0: 20 26 20 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43   & SSL_ST_CONNEC
11e0: 54 29 09 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e  T).major = "conn
11f0: 65 63 74 22 3b 0a 09 65 6c 73 65 20 69 66 20 28  ect";..else if (
1200: 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f 41  where & SSL_ST_A
1210: 43 43 45 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20  CCEPT)..major = 
1220: 22 61 63 63 65 70 74 22 3b 0a 09 65 6c 73 65 09  "accept";..else.
1230: 09 09 09 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b  ....major = "unk
1240: 6e 6f 77 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65  nown";...if (whe
1250: 72 65 20 26 20 53 53 4c 5f 43 42 5f 52 45 41 44  re & SSL_CB_READ
1260: 29 09 09 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64  )..minor = "read
1270: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
1280: 72 65 20 26 20 53 53 4c 5f 43 42 5f 57 52 49 54  re & SSL_CB_WRIT
1290: 45 29 09 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69  E)..minor = "wri
12a0: 74 65 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  te";..else if (w
12b0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f  here & SSL_CB_LO
12c0: 4f 50 29 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f  OP)..minor = "lo
12d0: 6f 70 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77  op";..else if (w
12e0: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 45 58  here & SSL_CB_EX
12f0: 49 54 29 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78  IT)..minor = "ex
1300: 69 74 22 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d  it";..else.....m
1310: 69 6e 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22  inor = "unknown"
1320: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1330: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1340: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1350: 63 68 61 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e  chan, major, min
1360: 6f 72 2c 20 6d 65 73 73 61 67 65 2c 20 61 6e 64  or, message, and
1370: 20 74 79 70 65 20 61 72 67 73 20 2a 2f 0a 20 20   type args */.  
1380: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1390: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
13a0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
13b0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
13c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13d0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
13e0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
13f0: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
1400: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1410: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1420: 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54  , cmdPtr,..    T
1430: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1440: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
1450: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
1460: 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  f), -1));.    Tc
1470: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
1480: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
1490: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
14a0: 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d  ringObj(major, -
14b0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
14c0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14d0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
14e0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14f0: 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a  bj(minor, -1));.
1500: 0a 20 20 20 20 69 66 20 28 77 68 65 72 65 20 26  .    if (where &
1510: 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b   SSL_CB_ALERT) {
1520: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1530: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1540: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
1550: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1560: 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f  (SSL_alert_desc_
1570: 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29  string_long(ret)
1580: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73  , -1));..Tcl_Lis
1590: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
15a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
15b0: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
15c0: 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72  ringObj(SSL_aler
15d0: 74 5f 74 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f  t_type_string_lo
15e0: 6e 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20  ng(ret), -1));. 
15f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c     } else {..Tcl
1600: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
1610: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
1620: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
1630: 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f  ewStringObj(SSL_
1640: 73 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e  state_string_lon
1650: 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ssl), -1));..T
1660: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1670: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1680: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1690: 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c  tringObj("info",
16a0: 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   -1));.    }..  
16b0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
16c0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
16d0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16e0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
16f0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
1700: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
1710: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
1720: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
1730: 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  Ptr);.}.../*. *-
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65  --. *. * Message
1790: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
17a0: 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70  *.Monitors SSL p
17b0: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
17c0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
17d0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
17e0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
17f0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
1800: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1850: 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ---. */.#ifndef 
1860: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54  OPENSSL_NO_SSL_T
1870: 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64  RACE.static void
1880: 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b  .MessageCallback
1890: 28 69 6e 74 20 77 72 69 74 65 5f 70 2c 20 69 6e  (int write_p, in
18a0: 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63  t version, int c
18b0: 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e  ontent_type, con
18c0: 73 74 20 76 6f 69 64 20 2a 62 75 66 2c 20 73 69  st void *buf, si
18d0: 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73  ze_t len, SSL *s
18e0: 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  sl, void *arg) {
18f0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
1900: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
1910: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
1920: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
1930: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
1940: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
1950: 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 76 65  tr;.    char *ve
1960: 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20 20 42 49  r, *type;.    BI
1970: 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63 68 61 72  O *bio;.    char
1980: 20 62 75 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a   buffer[15000];.
1990: 20 20 20 20 62 75 66 66 65 72 5b 30 5d 20 3d 20      buffer[0] = 
19a0: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  0;..    dprintf(
19b0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
19c0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
19d0: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
19e0: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
19f0: 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 76  n;..    switch(v
1a00: 65 72 73 69 6f 6e 29 20 7b 0a 20 20 20 20 63 61  ersion) {.    ca
1a10: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a  se TLS1_VERSION:
1a20: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b  ..ver = "TLSv1";
1a30: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1a40: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e  e TLS1_1_VERSION
1a50: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1a60: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1a70: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53  case TLS1_2_VERS
1a80: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1a90: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.2";..break;. 
1aa0: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56     case TLS1_3_V
1ab0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1ac0: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b  TLSv1.3";..break
1ad0: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76  ;.    case 0:..v
1ae0: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72  er = "none";..br
1af0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1b00: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77  :..ver = "unknow
1b10: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  n";..break;.    
1b20: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63  }..    switch (c
1b30: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20  ontent_type) {. 
1b40: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1b50: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20  HEADER:..type = 
1b60: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b  "Header";..break
1b70: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1b80: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1b90: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1ba0: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1bb0: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  pe";..break;.   
1bc0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48   case SSL3_RT_CH
1bd0: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43  ANGE_CIPHER_SPEC
1be0: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67  :..type = "Chang
1bf0: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61  e Cipher";..brea
1c00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1c10: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65  _RT_ALERT:..type
1c20: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65   = "Alert";..bre
1c30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1c40: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a  3_RT_HANDSHAKE:.
1c50: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61  .type = "Handsha
1c60: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ke";..break;.   
1c70: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50   case SSL3_RT_AP
1c80: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a  PLICATION_DATA:.
1c90: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74  .type = "App Dat
1ca0: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20  a";..break;.#if 
1cb0: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
1cc0: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
1cd0: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54  000L.    case DT
1ce0: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54  LS1_RT_HEARTBEAT
1cf0: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74  :..type = "Heart
1d00: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  beat";..break;.#
1d10: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1d20: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e  t:..type = "unkn
1d30: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1d40: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c   /* Needs compil
1d50: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65  e time option "e
1d60: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22  nable-ssl-trace"
1d70: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69  . */.    if ((bi
1d80: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o = BIO_new(BIO_
1d90: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c  s_mem())) != NUL
1da0: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53  L) {..int n;..SS
1db0: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c  L_trace(write_p,
1dc0: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e   version, conten
1dd0: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e  t_type, buf, len
1de0: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62  , ssl, (void *)b
1df0: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65  io);..n = BIO_re
1e00: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
1e10: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1e20: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70   < 15000 ? BIO_p
1e30: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34  ending(bio) : 14
1e40: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29  999);..n = (n<0)
1e50: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65   ? 0 : n;..buffe
1e60: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64  r[n] = 0;..(void
1e70: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b  )BIO_flush(bio);
1e80: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b  ..BIO_free(bio);
1e90: 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72  .   }..    /* Cr
1ea0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
1eb0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
1ec0: 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76  an, direction, v
1ed0: 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e  ersion, type, an
1ee0: 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a  d message args *
1ef0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
1f00: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
1f10: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
1f20: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
1f30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
1f40: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
1f50: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
1f60: 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31  bj("message", -1
1f70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
1f80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1f90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
1fa0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
1fb0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
1fc0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
1fd0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
1fe0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1ff0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2000: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2010: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77  l_NewStringObj(w
2020: 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20  rite_p ? "Sent" 
2030: 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31  : "Received", -1
2040: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2050: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2060: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2070: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2080: 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20  j(ver, -1));.   
2090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
20a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
20b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
20c0: 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c  wStringObj(type,
20d0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
20e0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
20f0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2100: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2110: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
2120: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
2130: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
2140: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
2150: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2160: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
2170: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
2180: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
2190: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
21a0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65  nt(cmdPtr);.}.#e
21b0: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2200: 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c   *. * VerifyCall
2210: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f  back --. *. *.Mo
2220: 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69  nitors SSL certi
2230: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
2240: 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20  n process. Used 
2250: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20  to control the. 
2260: 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20  *.behavior when 
2270: 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  the SSL_VERIFY_P
2280: 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e  EER flag is set.
2290: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a   This is called.
22a0: 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 65   *.whenever a ce
22b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73  rtificate is ins
22c0: 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 65  pected or decide
22d0: 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65  d invalid. Calle
22e0: 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65  d for. *.each ce
22f0: 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 65  rtificate in the
2300: 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a   cert chain.. *.
2310: 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68   * Checks:. *.Th
2320: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  e certificate ch
2330: 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73  ain is checked s
2340: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
2350: 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67   deepest nesting
2360: 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65   level. *.  (the
2370: 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69   root CA certifi
2380: 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64  cate) and worked
2390: 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70   upward to the p
23a0: 65 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74  eer's certificat
23b0: 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74  e.. *.All signat
23c0: 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20  ures are valid, 
23d0: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20  current time is 
23e0: 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64  within first and
23f0: 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74   last validity t
2400: 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  ime.. *.Check th
2410: 61 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  at the certifica
2420: 74 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20  te is issued by 
2430: 74 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69  the issuer certi
2440: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20  ficate issuer.. 
2450: 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f  *.Check the revo
2460: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f  cation status fo
2470: 72 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61  r each certifica
2480: 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  te.. *.Check the
2490: 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65   validity of the
24a0: 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74   given CRL and t
24b0: 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69  he cert revocati
24c0: 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68  on status.. *.Ch
24d0: 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73  eck the policies
24e0: 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74   of all the cert
24f0: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41  ificates. *. * A
2500: 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79  rgs. *.preverify
2510: 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68  _ok indicates wh
2520: 65 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66  ether the certif
2530: 69 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69  icate verificati
2540: 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72  on passed (1) or
2550: 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52   not (0). *. * R
2560: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c  esults:. *.A cal
2570: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74  lback bound to t
2580: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65  he socket may re
2590: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09  turn one of:. *.
25a0: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65      0...- the ce
25b0: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
25c0: 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e  med invalid, sen
25d0: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20  d verification. 
25e0: 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61  *....  failure a
25f0: 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e  lert to peer, an
2600: 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64  d terminate hand
2610: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09  shake.. *.    1.
2620: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
2630: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61  ate is deemed va
2640: 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69  lid, continue wi
2650: 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  th handshake.. *
2660: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e  .    empty strin
2670: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f  g.- no change to
2680: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
2690: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69  idation. *. * Si
26a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
26b0: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
26c0: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
26d0: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
26e0: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
26f0: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2700: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2710: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2720: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
2770: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69  .static int.Veri
2780: 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f  fyCallback(int o
2790: 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  k, X509_STORE_CT
27a0: 58 20 2a 63 74 78 29 0a 7b 0a 20 20 20 20 54 63  X *ctx).{.    Tc
27b0: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
27c0: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d     SSL   *ssl..=
27d0: 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52   (SSL*)X509_STOR
27e0: 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74  E_CTX_get_ex_dat
27f0: 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65  a(ctx, SSL_get_e
2800: 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52  x_data_X509_STOR
2810: 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20  E_CTX_idx());.  
2820: 20 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d    X509  *cert..=
2830: 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f   X509_STORE_CTX_
2840: 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74  get_current_cert
2850: 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65  (ctx);.    State
2860: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
2870: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
2880: 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20  _data(ssl);.    
2890: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28a0: 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp.= statePtr->i
28b0: 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64  nterp;.    int d
28c0: 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f  epth..= X509_STO
28d0: 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72  RE_CTX_get_error
28e0: 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20  _depth(ctx);.   
28f0: 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39   int err..= X509
2900: 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65  _STORE_CTX_get_e
2910: 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20  rror(ctx);..    
2920: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
2930: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
2940: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2950: 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69  %d", ok);..    i
2960: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
2970: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
2980: 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f  ULL) {../* Use o
2990: 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66  k value if verif
29a0: 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69  ication is requi
29b0: 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74  red */..if (stat
29c0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53  ePtr->vflags & S
29d0: 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49  SL_VERIFY_FAIL_I
29e0: 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20  F_NO_PEER_CERT) 
29f0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b  {..    return ok
2a00: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
2a10: 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20   return 1;..}.  
2a20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72    } else if (cer
2a30: 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c  t == NULL || ssl
2a40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
2a50: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 0;.    }..  
2a60: 20 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66    dprintf("Verif
2a70: 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20  yCallback: eval 
2a80: 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20  callback");..   
2a90: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
2aa0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
2ab0: 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c  fn, chan, depth,
2ac0: 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c   cert info list,
2ad0: 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72   status, and err
2ae0: 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  or args */.    c
2af0: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
2b00: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
2b10: 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63  r->vcmd);.    Tc
2b20: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b30: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b40: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
2b50: 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22  ringObj("verify"
2b60: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
2b70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2b80: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
2b90: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72  Ptr,..Tcl_NewStr
2ba0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
2bb0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
2bc0: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
2bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2bf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2c00: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74  l_NewIntObj(dept
2c10: 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  h));.    Tcl_Lis
2c20: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c30: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2c40: 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  , Tls_NewX509Obj
2c50: 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b  (interp, cert));
2c60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2c70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2c90: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29  l_NewIntObj(ok))
2ca0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
2cb0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2cc0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
2cd0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2ce0: 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72  ((char*)X509_ver
2cf0: 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
2d00: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
2d10: 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e  ;..    /* Preven
2d20: 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c  t I/O while call
2d30: 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72  back is in progr
2d40: 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74  ess */.    /* st
2d50: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d  atePtr->flags |=
2d60: 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43   TLS_TCL_CALLBAC
2d70: 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76  K; */..    /* Ev
2d80: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
2d90: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
2da0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2db0: 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76  tr);.    ok = Ev
2dc0: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
2dd0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
2de0: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
2df0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2e00: 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  r);..    dprintf
2e10: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2e20: 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74  : command result
2e30: 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20   = %d", ok);..  
2e40: 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66    /* statePtr->f
2e50: 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43  lags &= ~(TLS_TC
2e60: 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a  L_CALLBACK); */.
2e70: 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f      return ok;./
2e80: 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65  * By default, le
2e90: 61 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ave verification
2ea0: 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d   unchanged. */.}
2eb0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2f00: 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20  * Tls_Error --. 
2f10: 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  *. *.Calls callb
2f20: 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d  ack with error m
2f30: 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69  essage.. *. * Si
2f40: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
2f50: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
2f60: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
2f70: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
2f80: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
2f90: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2fa0: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2fb0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2fc0: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3010: 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28  .void.Tls_Error(
3020: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
3030: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67   const char *msg
3040: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ) {.    Tcl_Inte
3050: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
3060: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
3070: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
3080: 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20  tr, *listPtr;.  
3090: 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
30a0: 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74  err;.    statePt
30b0: 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20  r->err = msg;.. 
30c0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
30d0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
30e0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
30f0: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
3100: 55 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20  ULL)..return;.. 
3110: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
3120: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
3130: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20  h fn, chan, and 
3140: 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a  message args */.
3150: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
3160: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
3170: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3180: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
3190: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
31a0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
31b0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
31c0: 28 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a  ("error", -1));.
31d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
31e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
31f0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
3200: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
3210: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
3220: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
3230: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
3240: 20 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c   if (msg != NULL
3250: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3260: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3270: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3280: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3290: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
32a0: 20 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d   else if ((msg =
32b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54   Tcl_GetString(T
32c0: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
32d0: 69 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c  interp))) != NUL
32e0: 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  L) {..Tcl_ListOb
32f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3300: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3320: 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20  msg, -1));..    
3330: 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74  } else {..listPt
3340: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
3350: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68  bj(0, NULL);..wh
3360: 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f  ile ((err = ERR_
3370: 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20  get_error()) != 
3380: 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  0) {..    Tcl_Li
3390: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
33a0: 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
33b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
33c0: 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f  gObj(ERR_reason_
33d0: 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72  error_string(err
33e0: 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c  ), -1));..}..Tcl
33f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3400: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3410: 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a  dPtr, listPtr);.
3420: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76      }..    /* Ev
3430: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
3440: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
3450: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
3460: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
3470: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
3480: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
3490: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
34a0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
34b0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
34c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3500: 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b  * KeyLogCallback
3510: 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20   --. *. *.Write 
3520: 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74  received key dat
3530: 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20  a to log file.. 
3540: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
3550: 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79  ---. */.void Key
35b0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  LogCallback(cons
35c0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
35d0: 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a  t char *line) {.
35e0: 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20      char *str = 
35f0: 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47  getenv(SSLKEYLOG
3600: 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20  FILE);.    FILE 
3610: 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  *fd;..    dprint
3620: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
3630: 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64    if (str) {..fd
3640: 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61   = fopen(str, "a
3650: 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c  ");..fprintf(fd,
3660: 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09   "%s\n",line);..
3670: 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20  fclose(fd);.    
3680: 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  }.}.../*. *-----
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
36d0: 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61  *. * Password Ca
36e0: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
36f0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61  Called when a pa
3700: 73 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64  ssword is needed
3710: 20 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b   for a private k
3720: 65 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a  ey when loading.
3730: 20 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20   *.or storing a 
3740: 50 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20  PEM certificate 
3750: 77 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e  with encryption.
3760: 20 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a   Evals callback.
3770: 20 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65   *.script and re
3780: 74 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74  turns the result
3790: 20 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64   as the password
37a0: 20 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a   string in buf..
37b0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
37c0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
37d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
37e0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
37f0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
3800: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73  Returns:. *.Pass
3810: 77 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74  word size in byt
3820: 65 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20  es or -1 for an 
3830: 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  error.. *. *----
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3880: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50   */.static int.P
3890: 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28  asswordCallback(
38a0: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73  char *buf, int s
38b0: 69 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c  ize, int rwflag,
38c0: 20 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a   void *udata) {.
38d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
38e0: 50 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr.= (State *) 
38f0: 75 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49  udata;.    Tcl_I
3900: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
3910: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
3920: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
3930: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
3940: 6f 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ode;.    Tcl_Siz
3950: 65 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69  e len;..    dpri
3960: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
3970: 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c      /* If no cal
3980: 6c 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75  lback, use defau
3990: 6c 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  lt callback */. 
39a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
39b0: 3e 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c  >password == NUL
39c0: 4c 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76  L) {..if (Tcl_Ev
39d0: 61 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c  alEx(interp, "tl
39e0: 73 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  s::password", -1
39f0: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
3a00: 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  L) == TCL_OK) {.
3a10: 09 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d  .    char *ret =
3a20: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
3a30: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
3a40: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3a50: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a  interp), &len);.
3a60: 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28  .    if (len > (
3a70: 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31  Tcl_Size) size-1
3a80: 29 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c  ) {...len = (Tcl
3a90: 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09  _Size) size-1;..
3aa0: 20 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63      }..    strnc
3ab0: 70 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69  py(buf, ret, (si
3ac0: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20  ze_t) len);..   
3ad0: 20 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27   buf[len] = '\0'
3ae0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
3af0: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65  nt) len;..} else
3b00: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d   {..    return -
3b10: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  1;..}.    }..   
3b20: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3b30: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
3b40: 66 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20  fn, rwflag, and 
3b50: 73 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  size args */.   
3b60: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
3b70: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
3b80: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
3b90: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3ba0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3bb0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3bc0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70  _NewStringObj("p
3bd0: 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a  assword", -1));.
3be0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
3bf0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3c00: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3c10: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61  _NewIntObj(rwfla
3c20: 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  g));.    Tcl_Lis
3c30: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3c40: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
3c50: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
3c60: 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c  size));..    Tcl
3c70: 5f 50 72 65 73 65 72 76 65 28 28 76 6f 69 64 20  _Preserve((void 
3c80: 2a 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  *) interp);.    
3c90: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 76 6f  Tcl_Preserve((vo
3ca0: 69 64 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  id *) statePtr);
3cb0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
3cc0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
3cd0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
3ce0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3cf0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
3d00: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
3d10: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
3d20: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69  L_GLOBAL);.    i
3d30: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f  f (code != TCL_O
3d40: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  K) {.#if (TCL_MA
3d50: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
3d60: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
3d70: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
3d80: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
3d90: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
3da0: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3db0: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
3dc0: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
3dd0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
3de0: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3df0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c  r);..    Tcl_Rel
3e00: 65 61 73 65 28 28 76 6f 69 64 20 2a 29 20 73 74  ease((void *) st
3e10: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
3e20: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
3e30: 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77 6f  pass back passwo
3e40: 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74 72  rd string and tr
3e50: 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f  uncate if too lo
3e60: 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f  ng */.    if (co
3e70: 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  de == TCL_OK) {.
3e80: 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63 68  .char *ret = (ch
3e90: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74 72  ar *) Tcl_GetStr
3ea0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47  ingFromObj(Tcl_G
3eb0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
3ec0: 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  rp), &len);..if 
3ed0: 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65  (len > (Tcl_Size
3ee0: 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20 20  ) size-1) {..   
3ef0: 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65   len = (Tcl_Size
3f00: 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74  ) size-1;..}..st
3f10: 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c 20  rncpy(buf, ret, 
3f20: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09  (size_t) len);..
3f30: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
3f40: 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 76  ..Tcl_Release((v
3f50: 6f 69 64 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a  oid *) interp);.
3f60: 09 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65  .return (int) le
3f70: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  n;.    }.    Tcl
3f80: 5f 52 65 6c 65 61 73 65 28 28 76 6f 69 64 20 2a  _Release((void *
3f90: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
3fa0: 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a  eturn -1;.}.../*
3fb0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ff0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73  ------. *. * Ses
4000: 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f  sion Callback fo
4010: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a  r Clients --. *.
4020: 20 2a 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61   *.Called when a
4030: 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 69 73 20   new session is 
4040: 61 64 64 65 64 20 74 6f 20 74 68 65 20 63 61 63  added to the cac
4050: 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20  he. In TLS 1.3. 
4060: 2a 09 74 68 69 73 20 6d 61 79 20 62 65 20 72 65  *.this may be re
4070: 63 65 69 76 65 64 20 6d 75 6c 74 69 70 6c 65 20  ceived multiple 
4080: 74 69 6d 65 73 20 61 66 74 65 72 20 74 68 65 20  times after the 
4090: 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20  handshake. For. 
40a0: 2a 09 65 61 72 6c 69 65 72 20 76 65 72 73 69 6f  *.earlier versio
40b0: 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ns, this will be
40c0: 20 72 65 63 65 69 76 65 64 20 64 75 72 69 6e 67   received during
40d0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a   the handshake..
40e0: 20 2a 09 54 68 69 73 20 69 73 20 74 68 65 20 70   *.This is the p
40f0: 72 65 66 65 72 72 65 64 20 77 61 79 20 74 6f 20  referred way to 
4100: 6f 62 74 61 69 6e 20 61 20 72 65 73 75 6d 61 62  obtain a resumab
4110: 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20  le session.. *. 
4120: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
4130: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
4140: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
4150: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
4160: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
4170: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d  rn codes:. *.0 =
4180: 20 65 72 72 6f 72 20 77 68 65 72 65 20 73 65 73   error where ses
4190: 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d  sion will be imm
41a0: 65 64 69 61 74 65 6c 79 20 72 65 6d 6f 76 65 64  ediately removed
41b0: 20 66 72 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e   from the intern
41c0: 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d  al cache.. *.1 =
41d0: 20 73 75 63 63 65 73 73 20 77 68 65 72 65 20 61   success where a
41e0: 70 70 20 72 65 74 61 69 6e 73 20 73 65 73 73 69  pp retains sessi
41f0: 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e 20 63 61  on in session ca
4200: 63 68 65 2c 20 61 6e 64 20 6d 75 73 74 20 63 61  che, and must ca
4210: 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66  ll SSL_SESSION_f
4220: 72 65 65 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e  ree() when done.
4230: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
4280: 61 74 69 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e  atic int.Session
4290: 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73  Callback(SSL *ss
42a0: 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a  l, SSL_SESSION *
42b0: 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53  session) {.    S
42c0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
42d0: 20 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74   (State*)SSL_get
42e0: 5f 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a  _app_data((SSL *
42f0: 29 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49  )ssl);.    Tcl_I
4300: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
4310: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
4320: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
4330: 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74  mdPtr;.    const
4340: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4350: 74 69 63 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73  ticket;.    cons
4360: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
4370: 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20  *session_id;.   
4380: 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20   size_t len2;.  
4390: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75    unsigned int u
43a0: 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  len;..    dprint
43b0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
43c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
43d0: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
43e0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
43f0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
4400: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
4410: 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e  lse if (ssl == N
4420: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4430: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4440: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
4450: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
4460: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
4470: 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73 69 6f 6e  n, chan, session
4480: 20 69 64 2c 20 73 65 73 73 69 6f 6e 20 74 69 63   id, session tic
4490: 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65 74 69 6d  ket, and lifetim
44a0: 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  e args */.    cm
44b0: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
44c0: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
44d0: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20  ->callback);.   
44e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
44f0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4500: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4510: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73  wStringObj("sess
4520: 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ion", -1));.    
4530: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4540: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4550: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
4560: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
4570: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
4580: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
4590: 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a  ), -1));..    /*
45a0: 20 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20   Session id */. 
45b0: 20 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20     session_id = 
45c0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
45d0: 69 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65  id(session, &ule
45e0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  n);.    Tcl_List
45f0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4600: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4610: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
4620: 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c  yObj(session_id,
4630: 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e   (Tcl_Size) ulen
4640: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73  ));..    /* Sess
4650: 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20  ion ticket */.  
4660: 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65    SSL_SESSION_ge
4670: 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f  t0_ticket(sessio
4680: 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
4690: 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  2);.    Tcl_List
46a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
46b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
46c0: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
46d0: 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 54 63  yObj(ticket, (Tc
46e0: 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a  l_Size) len2));.
46f0: 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65  .    /* Lifetime
4700: 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63   - number of sec
4710: 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  onds */.    Tcl_
4720: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4730: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4740: 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e  Ptr,..Tcl_NewLon
4750: 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f  gObj((long) SSL_
4760: 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b  SESSION_get_tick
4770: 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74  et_lifetime_hint
4780: 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20  (session)));..  
4790: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
47a0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
47b0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
47c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
47d0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
47e0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
47f0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
4800: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
4810: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  Ptr);..    /* Re
4820: 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f 77 20 75  turn 0 for now u
4830: 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20 68 61 6e  ntil session han
4840: 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74  dling is complet
4850: 65 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  e */.    return 
4860: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0;.}.../*. *----
4870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
48b0: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62   *. * ALPN Callb
48c0: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
48d0: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b  and NPN Callback
48e0: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
48f0: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72   *. *.Perform pr
4900: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31  otocol (http/1.1
4910: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20  , h2, h3, etc.) 
4920: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68  selection for th
4930: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f  e. *.incoming co
4940: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64  nnection. Called
4950: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64   after Hello and
4960: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b   server callback
4970: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74  s.. *.Where 'out
4980: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72  ' is selected pr
4990: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20  otocol and 'in' 
49a0: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65  is the peer adve
49b0: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a  rtised list.. *.
49c0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
49d0: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
49e0: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
49f0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
4a00: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
4a10: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
4a20: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
4a30: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73   ALPN protocol s
4a40: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
4a50: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
4a60: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
4a70: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
4a80: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f  : There was no o
4a90: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74  verlap between t
4aa0: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20  he client's. *. 
4ab0: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74     supplied list
4ac0: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20   and the server 
4ad0: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
4ae0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
4af0: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20  ll be aborted.. 
4b00: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4b10: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f  _NOACK: ALPN pro
4b20: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
4b30: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73  ed, e.g., becaus
4b40: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20  e no ALPN. *.   
4b50: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63   protocols are c
4b60: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
4b70: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  is connection. T
4b80: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
4b90: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4be0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
4bf0: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53  .ALPNCallback(SS
4c00: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
4c10: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
4c20: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
4c30: 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74   *outlen,..const
4c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c50: 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  in, unsigned int
4c60: 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72   inlen, void *ar
4c70: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
4c80: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
4c90: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
4ca0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
4cb0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
4cc0: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
4cd0: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
4ce0: 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20  code, res;..    
4cf0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
4d00: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20  );..    if (ssl 
4d10: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d  == NULL || arg =
4d20: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4d30: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4d40: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4d50: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f     /* Select pro
4d60: 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20  tocol */.    if 
4d70: 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74  (SSL_select_next
4d80: 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64  _proto((unsigned
4d90: 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f   char **) out, o
4da0: 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d  utlen, statePtr-
4db0: 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74  >protos, statePt
4dc0: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09  r->protos_len,..
4dd0: 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50  in, inlen) == OP
4de0: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49  ENSSL_NPN_NEGOTI
4df0: 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63  ATED) {../* Matc
4e00: 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20  h found */..res 
4e10: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4e20: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4e30: 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50  {../* OPENSSL_NP
4e40: 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e  N_NO_OVERLAP = N
4e50: 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73  o overlap, so us
4e60: 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f  e first item fro
4e70: 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f  m client protoco
4e80: 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d  l list */..res =
4e90: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4ea0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4eb0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4ec0: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
4ed0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
4ee0: 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  n res;.    }..  
4ef0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
4f00: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
4f10: 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68   fn, chan, depth
4f20: 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74  , cert info list
4f30: 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72  , status, and er
4f40: 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ror args */.    
4f50: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
4f60: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
4f70: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
4f80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4f90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4fa0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
4fb0: 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c  tringObj("alpn",
4fc0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
4fd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4fe0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4ff0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
5000: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
5010: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
5020: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
5030: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5040: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5050: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5060: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5070: 6a 28 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  j((const char *)
5080: 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20   *out, -1));.   
5090: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
50a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
50b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
50c0: 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20  wBooleanObj(res 
50d0: 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  == SSL_TLSEXT_ER
50e0: 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  R_OK));..    /* 
50f0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
5100: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
5110: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
5120: 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28  dPtr);.    if ((
5130: 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62  code = EvalCallb
5140: 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ack(interp, stat
5150: 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e  ePtr, cmdPtr)) >
5160: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
5170: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
5180: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  K;.    } else if
5190: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09   (code == 1) {..
51a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
51b0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
51c0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
51d0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
51e0: 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20  T_FATAL;.    }. 
51f0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
5200: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
5210: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
5220: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
5270: 41 64 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63  Advertise Protoc
5280: 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ols Callback for
5290: 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e   Next Protocol N
52a0: 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29  egotiation (NPN)
52b0: 20 69 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20   in ServerHello 
52c0: 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20  --. *. *.called 
52d0: 77 68 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65  when a TLS serve
52e0: 72 20 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f  r needs a list o
52f0: 66 20 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74  f supported prot
5300: 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20  ocols for Next. 
5310: 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74  *.Protocol Negot
5320: 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  iation.. *. * Re
5330: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
5340: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5350: 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  s:. *. * Return 
5360: 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c  codes:. *.SSL_TL
5370: 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e  SEXT_ERR_OK: NPN
5380: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
5390: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
53a0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
53b0: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
53c0: 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f  NOACK: NPN proto
53d0: 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64  col not selected
53e0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
53f0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
5400: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5440: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20  ----. */.#ifdef 
5450: 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69  USE_NPN.static i
5460: 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63  nt.NPNCallback(c
5470: 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63  onst SSL *ssl, c
5480: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5490: 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e  ar **out, unsign
54a0: 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20  ed int *outlen, 
54b0: 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20  void *arg) {.   
54c0: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
54d0: 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a   = (State*)arg;.
54e0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
54f0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5500: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5510: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5520: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5530: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5540: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70   }..    /* Set p
5550: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
5560: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
5570: 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c  r->protos != NUL
5580: 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61  L) {..*out = sta
5590: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09  tePtr->protos;..
55a0: 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50  *outlen = stateP
55b0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a  tr->protos_len;.
55c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f      } else {..*o
55d0: 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74  ut = NULL;..*out
55e0: 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  len = 0;..return
55f0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5600: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  NOACK;.    }.   
5610: 20 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45   return SSL_TLSE
5620: 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e  XT_ERR_OK;.}.#en
5630: 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  dif.../*. *-----
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
5680: 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63  *. * SNI Callbac
5690: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d  k for Servers --
56a0: 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73  . *. *.Perform s
56b0: 65 72 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68  erver-side SNI h
56c0: 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f  ostname selectio
56d0: 6e 20 61 66 74 65 72 20 72 65 63 65 69 76 69 6e  n after receivin
56e0: 67 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a  g SNI extension.
56f0: 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c   *.in Client Hel
5700: 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72  lo. Called after
5710: 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20   hello callback 
5720: 62 75 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20  but before ALPN 
5730: 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20  callback.. *. * 
5740: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
5750: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
5760: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
5770: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
5780: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
5790: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54   codes:. *.SSL_T
57a0: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e  LSEXT_ERR_OK: SN
57b0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63  I hostname is ac
57c0: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
57d0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
57e0: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
57f0: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a  ERR_ALERT_FATAL:
5800: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5810: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54   not accepted. T
5820: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a  he connection. *
5830: 09 20 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e  .    is aborted.
5840: 20 44 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65   Default for ale
5850: 72 74 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52  rt is SSL_AD_UNR
5860: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a  ECOGNIZED_NAME..
5870: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5880: 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a  R_ALERT_WARNING:
5890: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
58a0: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77   not accepted, w
58b0: 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09  arning alert. *.
58c0: 20 20 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75      sent (not su
58d0: 70 70 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31  pported in TLSv1
58e0: 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  .3). The connect
58f0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5900: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5910: 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74  _NOACK: SNI host
5920: 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65  name is not acce
5930: 70 74 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b  pted and not ack
5940: 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20  nowledged,. *.  
5950: 20 20 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61    e.g. if SNI ha
5960: 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69  s not been confi
5970: 67 75 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  gured. The conne
5980: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
5990: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
59e0: 61 74 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c  atic int.SNICall
59f0: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
5a00: 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c  ssl, int *alert,
5a10: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
5a20: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
5a30: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
5a40: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
5a50: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
5a60: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
5a70: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
5a80: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
5a90: 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  es;.    const ch
5aa0: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d  ar *servername =
5ab0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69   NULL;..    dpri
5ac0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
5ad0: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
5ae0: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55  ULL || arg == NU
5af0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5b00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5b10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
5b20: 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  * Only works for
5b30: 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72   TLS 1.2 and ear
5b40: 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76  lier */.    serv
5b50: 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74  ername = SSL_get
5b60: 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
5b70: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
5b80: 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20  _host_name);.   
5b90: 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65   if (!servername
5ba0: 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30   || servername[0
5bb0: 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65  ] == '\0') {..re
5bc0: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5bd0: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5be0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
5bf0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
5c00: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
5c10: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5c20: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  _ERR_OK;.    }..
5c30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
5c40: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69  mmand to eval wi
5c50: 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64  th fn, chan, and
5c60: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72 67   server name arg
5c70: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
5c80: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
5c90: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
5ca0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
5cb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5cc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5cd0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5ce0: 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20  j("sni", -1));. 
5cf0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5d00: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5d10: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
5d20: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
5d30: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
5d40: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
5d50: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
5d60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5d70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5d80: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
5d90: 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72  StringObj(server
5da0: 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20  name , -1));..  
5db0: 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61    /* Eval callba
5dc0: 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ck command */.  
5dd0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
5de0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
5df0: 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c  if ((code = Eval
5e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
5e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
5e20: 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20  r)) > 1) {..res 
5e30: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5e40: 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a  _ALERT_WARNING;.
5e50: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44  .*alert = SSL_AD
5e60: 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41  _UNRECOGNIZED_NA
5e70: 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f  ME; /* Not suppo
5e80: 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20  rted by TLS 1.3 
5e90: 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  */.    } else if
5ea0: 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09   (code == 1) {..
5eb0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5ec0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65  _ERR_OK;.    } e
5ed0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c  lse {..res = SSL
5ee0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
5ef0: 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74  T_FATAL;..*alert
5f00: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5f10: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5f20: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5f30: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5f40: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5f50: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5f60: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5f70: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5fc0: 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48   * ClientHello H
5fd0: 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63  andshake Callbac
5fe0: 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d  k for Servers --
5ff0: 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73  . *. *.Used by s
6000: 65 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65  erver to examine
6010: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65   the server name
6020: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49   indication (SNI
6030: 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70  ) extension. *.p
6040: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63  rovided by the c
6050: 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74  lient in order t
6060: 6f 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72  o select an appr
6070: 6f 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63  opriate certific
6080: 61 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e  ate to. *.presen
6090: 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65  t, and make othe
60a0: 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20  r configuration 
60b0: 61 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65  adjustments rele
60c0: 76 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72  vant to that ser
60d0: 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20  ver. *.name and 
60e0: 69 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  its configuratio
60f0: 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73  n. This includes
6100: 20 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68   swapping out th
6110: 65 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09  e associated. *.
6120: 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c  SSL_CTX pointer,
6130: 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73   modifying the s
6140: 65 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20  erver's list of 
6150: 70 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65  permitted TLS ve
6160: 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67  rsions,. *.chang
6170: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
6180: 20 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20   cipher list in 
6190: 72 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20  response to the 
61a0: 63 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20  client's cipher 
61b0: 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61  list, etc.. *.Ca
61c0: 6c 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20  lled before SNI 
61d0: 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63  and ALPN callbac
61e0: 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ks.. *. * Result
61f0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
6200: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
6210: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
6220: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
6230: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
6240: 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f  :. *.SSL_CLIENT_
6250: 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73  HELLO_RETRY: sus
6260: 70 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61  pend the handsha
6270: 6b 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64  ke, and the hand
6280: 73 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77  shake function w
6290: 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64  ill return immed
62a0: 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c  iately. *.SSL_CL
62b0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
62c0: 3a 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69  : failure, termi
62d0: 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  nate connection.
62e0: 20 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72   Set alert to er
62f0: 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c  ror code.. *.SSL
6300: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6310: 43 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20  CCESS: success. 
6320: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
6330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
6370: 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c  ic int.HelloCall
6380: 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69  back(SSL *ssl, i
6390: 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20  nt *alert, void 
63a0: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
63b0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
63c0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
63d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
63e0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
63f0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
6400: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
6410: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20  nt code, res;.  
6420: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65    const char *se
6430: 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f  rvername;.    co
6440: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
6450: 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74  r *p;.    size_t
6460: 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b   len, remaining;
6470: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
6480: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
6490: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
64a0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
64b0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
64c0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53  L_CLIENT_HELLO_S
64d0: 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c  UCCESS;.    } el
64e0: 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63  se if (ssl == (c
64f0: 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20  onst SSL *)NULL 
6500: 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20  || arg == (void 
6510: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
6520: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6530: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6540: 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65  .    /* Get name
6550: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53  s */.    if (!SS
6560: 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67  L_client_hello_g
6570: 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53  et0_ext(ssl, TLS
6580: 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f  EXT_TYPE_server_
6590: 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69  name, &p, &remai
65a0: 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69  ning) || remaini
65b0: 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65  ng <= 2) {..*ale
65c0: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33  rt = SSL_R_SSLV3
65d0: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50  _ALERT_ILLEGAL_P
65e0: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72  ARAMETER;..retur
65f0: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6600: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6610: 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
6620: 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
6630: 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20  e supplied list 
6640: 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  of names. */.   
6650: 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c   len = (*(p++) <
6660: 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d  < 8);.    len +=
6670: 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20   *(p++);.    if 
6680: 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61  (len + 2 != rema
6690: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74  ining) {..*alert
66a0: 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41   = SSL_R_SSLV3_A
66b0: 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52  LERT_ILLEGAL_PAR
66c0: 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20  AMETER;..return 
66d0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
66e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
66f0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
6700: 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c  n;..    /* The l
6710: 69 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20  ist in practice 
6720: 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c  only has a singl
6730: 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65  e element, so we
6740: 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74   only consider t
6750: 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f  he first one. */
6760: 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69  .    if (remaini
6770: 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20  ng == 0 || *p++ 
6780: 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59  != TLSEXT_NAMETY
6790: 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a  PE_host_name) {.
67a0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
67b0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
67c0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
67d0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
67e0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
67f0: 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d  }.    remaining-
6800: 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77  -;..    /* Now w
6810: 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75  e can finally pu
6820: 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20  ll out the byte 
6830: 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61  array with the a
6840: 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20  ctual hostname. 
6850: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
6860: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61  ning <= 2) {..*a
6870: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6880: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6890: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
68a0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
68b0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
68c0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
68d0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
68e0: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
68f0: 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d  f (len + 2 > rem
6900: 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72  aining) {..*aler
6910: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
6920: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6930: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
6940: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6950: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6960: 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b  remaining = len;
6970: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
6980: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
6990: 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  p;..    /* Creat
69a0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
69b0: 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c  l with fn, chan,
69c0: 20 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65   and server name
69d0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
69e0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
69f0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
6a00: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
6a10: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6a20: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6a30: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
6a40: 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d  ngObj("hello", -
6a50: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
6a60: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6a70: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6a80: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
6a90: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
6aa0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
6ab0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
6ac0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6ad0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6ae0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
6af0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
6b00: 73 65 72 76 65 72 6e 61 6d 65 2c 20 28 54 63 6c  servername, (Tcl
6b10: 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a 20  _Size) len));.. 
6b20: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
6b30: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
6b40: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
6b50: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
6b60: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
6b70: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
6b80: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
6b90: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
6ba0: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6bb0: 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65  LLO_RETRY;..*ale
6bc0: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6bd0: 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43  _ALERT_USER_CANC
6be0: 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73  ELLED;.    } els
6bf0: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
6c00: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c   {..res = SSL_CL
6c10: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
6c20: 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  SS;.    } else {
6c30: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
6c40: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6c50: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
6c60: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
6c70: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20  RNAL_ERROR;.    
6c80: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
6c90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6ca0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
6cb0: 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.../***********
6cc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f  *********/./* Co
6cd0: 6d 6d 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a  mmands         *
6ce0: 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /./*************
6cf0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d  *******/../*. *-
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d40: 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73  --. *. * Ciphers
6d50: 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61  ObjCmd -- list a
6d60: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
6d70: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
6d80: 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64  edure is invoked
6d90: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20   to process the 
6da0: 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63  "tls::ciphers" c
6db0: 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73  ommand. *.to lis
6dc0: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6dd0: 65 72 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20  ers, based upon 
6de0: 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65  protocol selecte
6df0: 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  d.. *. * Results
6e00: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
6e10: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  Tcl result list.
6e20: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6e30: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63  cts:. *.construc
6e40: 74 73 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20  ts and destroys 
6e50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58  SSL context (CTX
6e60: 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ). *. *---------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
6eb0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
6ec0: 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20   *protocols[] = 
6ed0: 7b 0a 20 20 20 20 22 73 73 6c 32 22 2c 20 22 73  {.    "ssl2", "s
6ee0: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
6ef0: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
6f00: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
6f10: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
6f20: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
6f30: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
6f40: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
6f50: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
6f60: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
6f70: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
6f80: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
6f90: 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28  .    TCL_UNUSED(
6fa0: 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c  void *),.    Tcl
6fb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
6fc0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  .    int objc,. 
6fd0: 20 20 20 54 63 6c 5f 4f 62 6a 09 2a 63 6f 6e 73     Tcl_Obj.*cons
6fe0: 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20  t objv[]).{.    
6ff0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20  Tcl_Obj *objPtr 
7000: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f  = NULL;.    SSL_
7010: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
7020: 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20  .    SSL *ssl = 
7030: 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f  NULL;.    STACK_
7040: 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29 20 2a  OF(SSL_CIPHER) *
7050: 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66  sk;.    char buf
7060: 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e  [BUFSIZ];.    in
7070: 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65  t index, verbose
7080: 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72   = 0, use_suppor
7090: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ted = 0;.    con
70a0: 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d  st SSL_METHOD *m
70b0: 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69  ethod;..    dpri
70c0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
70d0: 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20      if ((objc < 
70e0: 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29  2) || (objc > 4)
70f0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
7100: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
7110: 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c   objv, "protocol
7120: 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70   ?verbose? ?supp
7130: 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72  orted?");..retur
7140: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7150: 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47   }.    if (Tcl_G
7160: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
7170: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
7180: 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74  protocols, "prot
7190: 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78  ocol", 0, &index
71a0: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
71b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
71c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
71d0: 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63  (objc > 2) && Tc
71e0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
71f0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
7200: 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21  [2], &verbose) !
7210: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
7220: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7230: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62     }.    if ((ob
7240: 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47  jc > 3) && Tcl_G
7250: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
7260: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
7270: 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64  , &use_supported
7280: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
7290: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
72a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
72b0: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
72c0: 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e  .    switch ((en
72d0: 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65  um protocol)inde
72e0: 78 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 4c  x) {.    case TL
72f0: 53 5f 53 53 4c 32 3a 0a 09 54 63 6c 5f 41 70 70  S_SSL2:..Tcl_App
7300: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7310: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
7320: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
7330: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7340: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
7350: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7360: 3b 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 53  ;.    case TLS_S
7370: 53 4c 33 3a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  SL3:..Tcl_Append
7380: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
7390: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
73a0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
73b0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
73c0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
73d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
73e0: 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31     case TLS_TLS1
73f0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
7400: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7410: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7420: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
7430: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
7440: 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e  THOD)..Tcl_Appen
7450: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7460: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7470: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7480: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
7490: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
74a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
74b0: 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20  #else..method = 
74c0: 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20  TLSv1_method(); 
74d0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20  break;.#endif.  
74e0: 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f    case TLS_TLS1_
74f0: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
7500: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
7510: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7520: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7530: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7540: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 54 63  S1_1_METHOD)..Tc
7550: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7560: 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73  nterp, protocols
7570: 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74  [index], ": prot
7580: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
7590: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ed", (char *)NUL
75a0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
75b0: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 6d 65  ERROR;.#else..me
75c0: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d  thod = TLSv1_1_m
75d0: 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a  ethod(); break;.
75e0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
75f0: 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20  TLS_TLS1_2:.#if 
7600: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
7610: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
7620: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
7630: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7640: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
7650: 54 48 4f 44 29 0a 09 54 63 6c 5f 41 70 70 65 6e  THOD)..Tcl_Appen
7660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7670: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7680: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7690: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
76a0: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
76b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
76c0: 23 65 6c 73 65 0a 09 6d 65 74 68 6f 64 20 3d 20  #else..method = 
76d0: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29  TLSv1_2_method()
76e0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
76f0: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 54 4c 53      case TLS_TLS
7700: 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64  1_3:.#if defined
7710: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64  (NO_TLS1_3) || d
7720: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7730: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
7740: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7750: 54 4c 53 31 5f 33 5f 4d 45 54 48 4f 44 29 0a 09  TLS1_3_METHOD)..
7760: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7770: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
7780: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
7790: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
77a0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 4e  rted", (char *)N
77b0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
77c0: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
77d0: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74  method = TLS_met
77e0: 68 6f 64 28 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  hod();..SSL_CTX_
77f0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
7800: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
7810: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c  3_VERSION);..SSL
7820: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
7830: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
7840: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
7850: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
7860: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 6d 65      default:..me
7870: 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f  thod = TLS_metho
7880: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  d();..break;.   
7890: 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53   }..    ctx = SS
78a0: 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64  L_CTX_new(method
78b0: 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d  );.    if (ctx =
78c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
78d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
78e0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
78f0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55  ON(), (char *)NU
7900: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
7910: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7920: 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77     ssl = SSL_new
7930: 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73  (ctx);.    if (s
7940: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  sl == NULL) {..T
7950: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7960: 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f  interp, GET_ERR_
7970: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
7980: 2a 29 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  *)NULL);..SSL_CT
7990: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
79a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
79b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
79c0: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72  e list and order
79d0: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e   as would be sen
79e0: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c  t in a ClientHel
79f0: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61  lo or all availa
7a00: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20  ble ciphers */. 
7a10: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f     if (use_suppo
7a20: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53  rted) {..sk = SS
7a30: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64  L_get1_supported
7a40: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
7a50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20     } else {..sk 
7a60: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  = SSL_get_cipher
7a70: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  s(ssl);.    }.. 
7a80: 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c     if (sk != NUL
7a90: 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f  L) {..if (!verbo
7aa0: 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74  se) {..    const
7ab0: 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20   char *cp;..    
7ac0: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7ad0: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7ae0: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
7af0: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
7b00: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
7b10: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
7b20: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
7b30: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
7b40: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
7b50: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
7b60: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
7b70: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
7b80: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
7b90: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
7ba0: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
7bb0: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
7bc0: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
7bd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7be0: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7bf0: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
7c00: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20  1));..    }...} 
7c10: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50  else {..    objP
7c20: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
7c30: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20  ngObj("",0);..  
7c40: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
7c50: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50  ; i < sk_SSL_CIP
7c60: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b  HER_num(sk); i++
7c70: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f  ) {...const SSL_
7c80: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53  CIPHER *c = sk_S
7c90: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
7ca0: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20  sk, i);...if (c 
7cb0: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75  == NULL) continu
7cc0: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c  e;..../* textual
7cd0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
7ce0: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09  the cipher */...
7cf0: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
7d00: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75  escription(c, bu
7d10: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
7d20: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  != NULL) {...   
7d30: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
7d40: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54  (objPtr, buf, (T
7d50: 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28  cl_Size) strlen(
7d60: 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  buf));...} else 
7d70: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
7d80: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20  ndToObj(objPtr, 
7d90: 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b  "UNKNOWN\n", 8);
7da0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ...}..    }..}..
7db0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7dc0: 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c  d) {..    sk_SSL
7dd0: 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29  _CIPHER_free(sk)
7de0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53  ;..}.    }.    S
7df0: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20  SL_free(ssl);.  
7e00: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
7e10: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  tx);..    Tcl_Se
7e20: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7e30: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
7e40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7e50: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
7ea0: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  * ProtocolsObjCm
7eb0: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
7ec0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a  ble protocols. *
7ed0: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
7ee0: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
7ef0: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c   process the "tl
7f00: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f  s::protocols" co
7f10: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
7f20: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f   available proto
7f30: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cols.. *. * Resu
7f40: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
7f50: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
7f60: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
7f70: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
7f80: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
7fd0: 61 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f  atic int.Protoco
7fe0: 6c 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  lsObjCmd(.    TC
7ff0: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
8000: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
8010: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e   *interp,.    in
8020: 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f  t objc,.    Tcl_
8030: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8040: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ]) {.    Tcl_Obj
8050: 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 64   *objPtr;..    d
8060: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
8070: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
8080: 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 1) {..Tcl_Wro
8090: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
80a0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
80b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
80c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
80d0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
80e0: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
80f0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
8100: 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 21 64 65   NULL);..#if !de
8110: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
8120: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8130: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8140: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8150: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8160: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8170: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8180: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8190: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
81a0: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
81b0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
81c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
81d0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
81e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
81f0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
8200: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8210: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
8220: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8230: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8240: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8250: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8260: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8270: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8280: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8290: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
82a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
82b0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
82c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
82d0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
82e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
82f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
8300: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8310: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8320: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
8330: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8340: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8350: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8360: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8370: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8380: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8390: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
83a0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
83b0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
83c0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
83d0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
83e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
83f0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
8400: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8410: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
8420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8460: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8470: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8480: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8490: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
84a0: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
84b0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
84c0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
84d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
84e0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
84f0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
8500: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
8510: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
8520: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8530: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8540: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8550: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8560: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
85b0: 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b  tic int Handshak
85c0: 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c  eObjCmd(.    TCL
85d0: 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c  _UNUSED(void *),
85e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
85f0: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74  *interp,.    int
8600: 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f   objc,.    Tcl_O
8610: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
8620: 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ).{.    Tcl_Chan
8630: 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20 20  nel chan;       
8640: 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20   /* The channel 
8650: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
8660: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
8670: 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20 20  statePtr;       
8680: 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65   /* client state
8690: 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20   for ssl socket 
86a0: 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
86b0: 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c 4c  r *errStr = NULL
86c0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d 20  ;.    int ret = 
86d0: 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20 3d  1;.    int err =
86e0: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66   0;..    dprintf
86f0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
8700: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
8710: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
8720: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
8730: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
8740: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8750: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
8760: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
8770: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  ;..    chan = Tc
8780: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
8790: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
87a0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
87b0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
87c0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
87d0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
87e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
87f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
8800: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
8810: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
8820: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
8830: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
8840: 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
8850: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
8860: 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
8870: 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
8880: 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
8890: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
88a0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
88b0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
88c0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
88d0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
88e0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
88f0: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
8900: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
8910: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
8920: 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20  KE", "CHANNEL", 
8930: 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72  "INVALID", (char
8940: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72   *)NULL);..retur
8950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8960: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
8970: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
8980: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
8990: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
89a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69    dprintf("Calli
89b0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
89c0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74  nnect");.    ret
89d0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
89e0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
89f0: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70  &err, 1);.    dp
8a00: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46  rintf("Tls_WaitF
8a10: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e  orConnect return
8a20: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a  ed: %i", ret);..
8a30: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20      if (ret < 0 
8a40: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  && ((statePtr->f
8a50: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
8a60: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d  SYNC) && (err ==
8a70: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70   EAGAIN))) {..dp
8a80: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74  rintf("Async set
8a90: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49   and err = EAGAI
8aa0: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20  N");..ret = 0;. 
8ab0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65     } else if (re
8ac0: 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72  t < 0) {..long r
8ad0: 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d  esult;..errStr =
8ae0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a   statePtr->err;.
8af0: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
8b00: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53  (interp);..Tcl_S
8b10: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09  etErrno(err);...
8b20: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28  if (!errStr || (
8b30: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b  *errStr == 0)) {
8b40: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54  ..    errStr = T
8b50: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  cl_PosixError(in
8b60: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  terp);..}...Tcl_
8b70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8b80: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20  erp, "handshake 
8b90: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74  failed: ", errSt
8ba0: 72 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  r, (char *)NULL)
8bb0: 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d  ;..if ((result =
8bc0: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
8bd0: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
8be0: 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56  >ssl)) != X509_V
8bf0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  _OK) {..    Tcl_
8c00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8c10: 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22  erp, " due to \"
8c20: 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63  ", X509_verify_c
8c30: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
8c40: 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20  (result), "\"", 
8c50: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
8c60: 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43  }..Tcl_SetErrorC
8c70: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
8c80: 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20  ", "HANDSHAKE", 
8c90: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
8ca0: 2a 29 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  *)NULL);..dprint
8cb0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
8cc0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
8cd0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
8ce0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
8cf0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8d00: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
8d10: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
8d20: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
8d30: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
8d40: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
8d50: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
8d60: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
8d70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
8d80: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
8d90: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
8da0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
8db0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
8dc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
8dd0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
8de0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8df0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
8e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e40: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
8e50: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8e60: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
8e70: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
8e80: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
8e90: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
8ea0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
8eb0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
8ec0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
8ed0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
8ee0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
8ef0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
8f00: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8f10: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
8f20: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
8f30: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
8f40: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
8f90: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f  .static int.Impo
8fa0: 72 74 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43  rtObjCmd(.    TC
8fb0: 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29  L_UNUSED(void *)
8fc0: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ,.    Tcl_Interp
8fd0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e   *interp,.    in
8fe0: 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f  t objc,.    Tcl_
8ff0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
9000: 5d 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]).{.    Tcl_Cha
9010: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
9020: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
9030: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
9040: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
9050: 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20  Ptr;../* client 
9060: 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
9070: 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  cket */.    SSL_
9080: 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c 4c  CTX *ctx..= NULL
9090: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73  ;.    Tcl_Obj *s
90a0: 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20  cript..= NULL;. 
90b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73     Tcl_Obj *pass
90c0: 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  word..= NULL;.  
90d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64 09    Tcl_Obj *vcmd.
90e0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
90f0: 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43 68  _DString upperCh
9100: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
9110: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  , upperChannelBl
9120: 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61  ocking, upperCha
9130: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70  nnelEncoding, up
9140: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
9150: 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a  r;.    int idx;.
9160: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e      Tcl_Size len
9170: 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09  ;.    int flags.
9180: 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49 54  ..= TLS_TCL_INIT
9190: 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65 72  ;.    int server
91a0: 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63 6f  ...= 0;./* is co
91b0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e  nnection incomin
91c0: 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20 2a  g or outgoing? *
91d0: 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79 66  /.    char *keyf
91e0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
91f0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09   char *certfile.
9200: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73  .= NULL;.    uns
9210: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 09  igned char *key.
9220: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9230: 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09 3d  _Size key_len..=
9240: 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   0;.    unsigned
9250: 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20 4e   char *cert..= N
9260: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  ULL;.    Tcl_Siz
9270: 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30 3b  e cert_len..= 0;
9280: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
9290: 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rs..= NULL;.    
92a0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
92b0: 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  es..= NULL;.    
92c0: 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d 20  char *CAfile..= 
92d0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
92e0: 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b 0a  CApath..= NULL;.
92f0: 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61      char *DHpara
9300: 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ms..= NULL;.    
9310: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20  char *model...= 
9320: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9330: 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55  servername..= NU
9340: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
9350: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
9360: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
9370: 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f    char *session_
9380: 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  id..= NULL;.    
9390: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d  Tcl_Obj *alpn..=
93a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
93b0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
93c0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
93d0: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
93e0: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
93f0: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
9400: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65   proto = 0, leve
9410: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  l = -1;.    int 
9420: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75  verify = 0, requ
9430: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74  ire = 0, request
9440: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73   = 1, post_hands
9450: 68 61 6b 65 20 3d 20 30 3b 0a 0a 20 20 20 20 64  hake = 0;..    d
9460: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
9470: 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  ;..#if defined(N
9480: 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e  O_TLS1) || defin
9490: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
94a0: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
94b0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
94c0: 45 54 48 4f 44 29 0a 20 20 20 20 74 6c 73 31 20  ETHOD).    tls1 
94d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
94e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
94f0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
9500: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
9510: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
9520: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
9530: 54 48 4f 44 29 0a 20 20 20 20 74 6c 73 31 5f 31  THOD).    tls1_1
9540: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
9550: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
9560: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
9570: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
9580: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9590: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
95a0: 45 54 48 4f 44 29 0a 20 20 20 20 74 6c 73 31 5f  ETHOD).    tls1_
95b0: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 0;.#endif.#i
95c0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
95d0: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
95e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
95f0: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20  3).    tls1_3 = 
9600: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  0;.#endif..    i
9610: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
9620: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
9630: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
9640: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69  , "channel ?opti
9650: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ons?");..return 
9660: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
9670: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
9680: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
9690: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
96a0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
96b0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
96c0: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
96d0: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
96e0: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
96f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
9700: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
9710: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
9720: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
9730: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
9740: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
9750: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
9760: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
9770: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
9780: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68  jc; idx++) {..ch
9790: 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65  ar *opt = Tcl_Ge
97a0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78  tString(objv[idx
97b0: 5d 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d  ]);...if (opt[0]
97c0: 20 21 3d 20 27 2d 27 29 0a 09 20 20 20 20 62 72   != '-')..    br
97d0: 65 61 6b 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d  eak;...OPTOBJ("-
97e0: 61 6c 70 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f  alpn", alpn);..O
97f0: 50 54 53 54 52 28 22 2d 63 61 64 69 72 22 2c 20  PTSTR("-cadir", 
9800: 43 41 70 61 74 68 29 3b 0a 09 4f 50 54 53 54 52  CApath);..OPTSTR
9810: 28 22 2d 63 61 66 69 6c 65 22 2c 20 43 41 66 69  ("-cafile", CAfi
9820: 6c 65 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d  le);..OPTBYTE("-
9830: 63 65 72 74 22 2c 20 63 65 72 74 2c 20 63 65 72  cert", cert, cer
9840: 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  t_len);..OPTSTR(
9850: 22 2d 63 65 72 74 66 69 6c 65 22 2c 20 63 65 72  "-certfile", cer
9860: 74 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28  tfile);..OPTSTR(
9870: 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65  "-cipher", ciphe
9880: 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  rs);..OPTSTR("-c
9890: 69 70 68 65 72 73 22 2c 20 63 69 70 68 65 72 73  iphers", ciphers
98a0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
98b0: 68 65 72 73 75 69 74 65 73 22 2c 20 63 69 70 68  hersuites", ciph
98c0: 65 72 73 75 69 74 65 73 29 3b 0a 09 4f 50 54 4f  ersuites);..OPTO
98d0: 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 73  BJ("-command", s
98e0: 63 72 69 70 74 29 3b 0a 09 4f 50 54 53 54 52 28  cript);..OPTSTR(
98f0: 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 44 48 70  "-dhparams", DHp
9900: 61 72 61 6d 73 29 3b 0a 09 4f 50 54 42 59 54 45  arams);..OPTBYTE
9910: 28 22 2d 6b 65 79 22 2c 20 6b 65 79 2c 20 6b 65  ("-key", key, ke
9920: 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54 53 54 52 28  y_len);..OPTSTR(
9930: 22 2d 6b 65 79 66 69 6c 65 22 2c 20 6b 65 79 66  "-keyfile", keyf
9940: 69 6c 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ile);..OPTSTR("-
9950: 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65 6c 29 3b 0a  model", model);.
9960: 09 4f 50 54 4f 42 4a 28 22 2d 70 61 73 73 77 6f  .OPTOBJ("-passwo
9970: 72 64 22 2c 20 70 61 73 73 77 6f 72 64 29 3b 0a  rd", password);.
9980: 09 4f 50 54 42 4f 4f 4c 28 22 2d 70 6f 73 74 5f  .OPTBOOL("-post_
9990: 68 61 6e 64 73 68 61 6b 65 22 2c 20 70 6f 73 74  handshake", post
99a0: 5f 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 4f 50  _handshake);..OP
99b0: 54 42 4f 4f 4c 28 22 2d 72 65 71 75 65 73 74 22  TBOOL("-request"
99c0: 2c 20 72 65 71 75 65 73 74 29 3b 0a 09 4f 50 54  , request);..OPT
99d0: 42 4f 4f 4c 28 22 2d 72 65 71 75 69 72 65 22 2c  BOOL("-require",
99e0: 20 72 65 71 75 69 72 65 29 3b 0a 09 4f 50 54 49   require);..OPTI
99f0: 4e 54 28 22 2d 73 65 63 75 72 69 74 79 5f 6c 65  NT("-security_le
9a00: 76 65 6c 22 2c 20 6c 65 76 65 6c 29 3b 0a 09 4f  vel", level);..O
9a10: 50 54 42 4f 4f 4c 28 22 2d 73 65 72 76 65 72 22  PTBOOL("-server"
9a20: 2c 20 73 65 72 76 65 72 29 3b 0a 09 4f 50 54 53  , server);..OPTS
9a30: 54 52 28 22 2d 73 65 72 76 65 72 6e 61 6d 65 22  TR("-servername"
9a40: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 3b 0a 09  , servername);..
9a50: 4f 50 54 53 54 52 28 22 2d 73 65 73 73 69 6f 6e  OPTSTR("-session
9a60: 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64  _id", session_id
9a70: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
9a80: 6c 32 22 2c 20 73 73 6c 32 29 3b 0a 09 4f 50 54  l2", ssl2);..OPT
9a90: 42 4f 4f 4c 28 22 2d 73 73 6c 33 22 2c 20 73 73  BOOL("-ssl3", ss
9aa0: 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  l3);..OPTBOOL("-
9ab0: 74 6c 73 31 22 2c 20 74 6c 73 31 29 3b 0a 09 4f  tls1", tls1);..O
9ac0: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 31 22  PTBOOL("-tls1.1"
9ad0: 2c 20 74 6c 73 31 5f 31 29 3b 0a 09 4f 50 54 42  , tls1_1);..OPTB
9ae0: 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32 22 2c 20 74  OOL("-tls1.2", t
9af0: 6c 73 31 5f 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c  ls1_2);..OPTBOOL
9b00: 28 22 2d 74 6c 73 31 2e 33 22 2c 20 74 6c 73 31  ("-tls1.3", tls1
9b10: 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76  _3);..OPTOBJ("-v
9b20: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 2c  alidatecommand",
9b30: 20 76 63 6d 64 29 3b 0a 09 4f 50 54 4f 42 4a 28   vcmd);..OPTOBJ(
9b40: 22 2d 76 63 6d 64 22 2c 20 76 63 6d 64 29 3b 0a  "-vcmd", vcmd);.
9b50: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e  ..OPTBAD("option
9b60: 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d 63 61 64 69  ", "-alpn, -cadi
9b70: 72 2c 20 2d 63 61 66 69 6c 65 2c 20 2d 63 65 72  r, -cafile, -cer
9b80: 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63  t, -certfile, -c
9b90: 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75  ipher, -ciphersu
9ba0: 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20  ites, -command, 
9bb0: 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c  -dhparams, -key,
9bc0: 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65   -keyfile, -mode
9bd0: 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70  l, -password, -p
9be0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d  ost_handshake, -
9bf0: 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72  request, -requir
9c00: 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76  e, -security_lev
9c10: 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65  el, -server, -se
9c20: 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69  rvername, -sessi
9c30: 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73  on_id, -ssl2, -s
9c40: 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73  sl3, -tls1, -tls
9c50: 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74  1.1, -tls1.2, -t
9c60: 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64  ls1.3, or -valid
9c70: 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09  atecommand");...
9c80: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
9ca0: 72 65 71 75 65 73 74 29 09 20 20 20 20 76 65 72  request).    ver
9cb0: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
9cc0: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20  Y_CLIENT_ONCE | 
9cd0: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b  SSL_VERIFY_PEER;
9ce0: 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74  .    if (request
9cf0: 20 26 26 20 72 65 71 75 69 72 65 29 20 76 65 72   && require) ver
9d00: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
9d10: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
9d20: 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28  R_CERT;.    if (
9d30: 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f  request && post_
9d40: 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66  handshake).verif
9d50: 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f  y |= SSL_VERIFY_
9d60: 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a  POST_HANDSHAKE;.
9d70: 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d      if (verify =
9d80: 3d 20 30 29 09 76 65 72 69 66 79 20 3d 20 53 53  = 0).verify = SS
9d90: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
9da0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
9db0: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
9dc0: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
9dd0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
9de0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
9df0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9e00: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
9e10: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
9e20: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
9e30: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
9e40: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
9e50: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
9e60: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
9e70: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
9e80: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
9e90: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
9ea0: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
9eb0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
9ec0: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
9ed0: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
9ee0: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
9ef0: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09  )..        cert.
9f00: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9f10: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21      if (key && !
9f20: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b  *key)..        k
9f30: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ey.        = NUL
9f40: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  L;.    if (certf
9f50: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c  ile && !*certfil
9f60: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66  e)         certf
9f70: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
9f80: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21  if (keyfile && !
9f90: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69  *keyfile)..keyfi
9fa0: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9fb0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
9fc0: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29  rs && !*ciphers)
9fd0: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73  .        ciphers
9fe0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9ff0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
a000: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65  uites && !*ciphe
a010: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73  rsuites) ciphers
a020: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b  uites    = NULL;
a030: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
a040: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20  && !*CAfile).   
a050: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20       CAfile.    
a060: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a070: 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a  if (CApath && !*
a080: 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20  CApath).        
a090: 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d  CApath.        =
a0a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44   NULL;.    if (D
a0b0: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70  Hparams && !*DHp
a0c0: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44  arams).        D
a0d0: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d  Hparams        =
a0e0: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e   NULL;..    /* n
a0f0: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a  ew SSL state */.
a100: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20      statePtr..= 
a110: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f  (State *) ckallo
a120: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a  c((unsigned) siz
a130: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20  eof(State));.   
a140: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72   memset(statePtr
a150: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74  , 0, sizeof(Stat
a160: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50  e));..    stateP
a170: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67  tr->flags.= flag
a180: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  s;.    statePtr-
a190: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70  >interp.= interp
a1a0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a1b0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b  vflags.= verify;
a1c0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65  .    statePtr->e
a1d0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a  rr.= "";..    /*
a1e0: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74   allocate script
a1f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69   */.    if (scri
a200: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  pt) {..(void) Tc
a210: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a220: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29  bj(script, &len)
a230: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
a240: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c     statePtr->cal
a250: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a  lback = script;.
a260: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a270: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a280: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20  callback);..}.  
a290: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a2a0: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f  cate password */
a2b0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72  .    if (passwor
a2c0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a2d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a2e0: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e  j(password, &len
a2f0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a300: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61      statePtr->pa
a310: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72  ssword = passwor
a320: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a330: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a340: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d  r->password);..}
a350: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
a360: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65  llocate validate
a370: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
a380: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f  if (vcmd) {..(vo
a390: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a3a0: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26  gFromObj(vcmd, &
a3b0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
a3c0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
a3d0: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20  >vcmd = vcmd;.. 
a3e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a3f0: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63  unt(statePtr->vc
a400: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  md);..}.    }.. 
a410: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20     if (model != 
a420: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64  NULL) {..int mod
a430: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22  e;../* Get the "
a440: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a  model" context *
a450: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a460: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
a470: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a   model, &mode);.
a480: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63  .if (chan == (Tc
a490: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
a4a0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
a4b0: 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74  ((void *)statePt
a4c0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a4d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
a4e0: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65  /*.. * Make sure
a4f0: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
a500: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
a510: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  el.. */..chan = 
a520: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
a530: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63  l(chan);..if (Tc
a540: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
a550: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
a560: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
a570: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a580: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
a590: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
a5a0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
a5b0: 65 28 63 68 61 6e 29 2c 0a 09 09 20 20 20 20 22  e(chan),...    "
a5c0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
a5d0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
a5e0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
a5f0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
a600: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
a610: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
a620: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
a630: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
a640: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a  Tls_Free((void *
a650: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
a660: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a670: 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28 28 53  R;..}..ctx = ((S
a680: 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68  tate *)Tcl_GetCh
a690: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
a6a0: 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b 0a 20  a(chan))->ctx;. 
a6b0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
a6c0: 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e 69 74  ((ctx = CTX_Init
a6d0: 28 73 74 61 74 65 50 74 72 2c 20 73 65 72 76 65  (statePtr, serve
a6e0: 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66 69 6c  r, proto, keyfil
a6f0: 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b 65 79  e, certfile, key
a700: 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c  , cert, key_len,
a710: 0a 09 09 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70  ...cert_len, CAp
a720: 61 74 68 2c 20 43 41 66 69 6c 65 2c 20 63 69 70  ath, CAfile, cip
a730: 68 65 72 73 2c 20 63 69 70 68 65 72 73 75 69 74  hers, ciphersuit
a740: 65 73 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72  es, level, DHpar
a750: 61 6d 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ams)) == NULL) {
a760: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
a770: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
a780: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
a790: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
a7a0: 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  }..    statePtr-
a7b0: 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20  >ctx = ctx;..   
a7c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20 6e 65   /*.     * We ne
a7d0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
a7e0: 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e 65 6c  that the channel
a7f0: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
a800: 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20 20 2a   (for the.     *
a810: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20   encryption not 
a820: 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70  to get goofed up
a830: 29 2e 0a 20 20 20 20 20 2a 20 57 65 20 6f 6e 6c  )..     * We onl
a840: 79 20 77 61 6e 74 20 74 6f 20 61 64 6a 75 73 74  y want to adjust
a850: 20 74 68 65 20 62 75 66 66 65 72 69 6e 67 20 69   the buffering i
a860: 6e 20 70 72 65 2d 76 32 20 63 68 61 6e 6e 65 6c  n pre-v2 channel
a870: 73 2c 20 77 68 65 72 65 0a 20 20 20 20 20 2a 20  s, where.     * 
a880: 65 61 63 68 20 63 68 61 6e 6e 65 6c 20 69 6e 20  each channel in 
a890: 74 68 65 20 73 74 61 63 6b 20 6d 61 69 6e 74 61  the stack mainta
a8a0: 69 6e 65 64 20 69 74 73 20 6f 77 6e 20 62 75 66  ined its own buf
a8b0: 66 65 72 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  fers..     */.  
a8c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
a8d0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  t(&upperChannelT
a8e0: 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20  ranslation);.   
a8f0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
a900: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
a910: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  ocking);.    Tcl
a920: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
a930: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
a940: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  r);.    Tcl_DStr
a950: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a960: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a  annelEncoding);.
a970: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
a980: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
a990: 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72   chan, "-eofchar
a9a0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
a9b0: 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63  EOFChar);.    Tc
a9c0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
a9d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
a9e0: 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75   "-encoding", &u
a9f0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
aa00: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
aa10: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
aa20: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74  nterp, chan, "-t
aa30: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70  ranslation", &up
aa40: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
aa50: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
aa60: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
aa70: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
aa80: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70  -blocking", &upp
aa90: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
aaa0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  g);.    Tcl_SetC
aab0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aac0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
aad0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
aae0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
aaf0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
ab00: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
ab10: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
ab20: 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  );.    dprintf("
ab30: 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68  Consuming Tcl ch
ab40: 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47  annel %s", Tcl_G
ab50: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
ab60: 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50  an));.    stateP
ab70: 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53  tr->self = Tcl_S
ab80: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
ab90: 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54  rp, Tls_ChannelT
aba0: 79 70 65 28 29 2c 20 73 74 61 74 65 50 74 72 2c  ype(), statePtr,
abb0: 20 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c   (TCL_READABLE |
abc0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
abd0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
abe0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
abf0: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
ac00: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ac10: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
ac20: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
ac30: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
ac40: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
ac50: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
ac60: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
ac70: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
ac80: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
ac90: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
aca0: 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20  .Tls_Free((void 
acb0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  *)statePtr);..re
acc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
acd0: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53      }..    Tcl_S
ace0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
acf0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
ad00: 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c  ->self, "-transl
ad10: 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72  ation", Tcl_DStr
ad20: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
ad30: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
ad40: 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  n));.    Tcl_Set
ad50: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ad60: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
ad70: 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67  self, "-encoding
ad80: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
ad90: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
ada0: 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20  lEncoding));.   
adb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
adc0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
add0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
ade0: 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53  eofchar", Tcl_DS
adf0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
ae00: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
ae10: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
ae20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ae30: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
ae40: 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  lf, "-blocking",
ae50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
ae60: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
ae70: 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54  locking));.    T
ae80: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
ae90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
aea0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
aeb0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
aec0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
aed0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
aee0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
aef0: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
af00: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
af10: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
af20: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20  elBlocking);..  
af30: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
af40: 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20  Initialization. 
af50: 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65      */.    state
af60: 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e  Ptr->ssl = SSL_n
af70: 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ew(statePtr->ctx
af80: 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61 74  );.    if (!stat
af90: 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a  ePtr->ssl) {../*
afa0: 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72   SSL library err
afb0: 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e  or */..Tcl_Appen
afc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
afd0: 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72  "couldn't constr
afe0: 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a  uct ssl session:
aff0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
b000: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 4e 55  ON(), (char *)NU
b010: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
b020: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b030: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b040: 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44 22  "INIT", "FAILED"
b050: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
b060: 0a 09 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64  ..Tls_Free((void
b070: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 72   *)statePtr);..r
b080: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b090: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
b0a0: 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e  et host server n
b0b0: 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ame */.    if (s
b0c0: 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a  ervername) {../*
b0d0: 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72   Sets the server
b0e0: 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e   name indication
b0f0: 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74   (SNI) in Client
b100: 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20  Hello extension 
b110: 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36  */../* Per RFC 6
b120: 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73  066, hostname is
b130: 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64   a ASCII encoded
b140: 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20   string, though 
b150: 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54  RFC 4366 says UT
b160: 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  F-8. */..if (!SS
b170: 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73  L_set_tlsext_hos
b180: 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  t_name(statePtr-
b190: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
b1a0: 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a  ) && require) {.
b1b0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
b1c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
b1d0: 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e  et SNI extension
b1e0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
b1f0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b200: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20  har *)NULL);..  
b210: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b220: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b230: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b240: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b250: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
b260: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20   Tls_Free((void 
b270: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
b280: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b290: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  OR;..}.../* Set 
b2a0: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65  hostname for pee
b2b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f  r certificate ho
b2c0: 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74  stname verificat
b2d0: 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a  ion in clients..
b2e0: 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53  .   Don't use SS
b2f0: 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63  L_set1_host sinc
b300: 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74  e it has limitat
b310: 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53  ions. */..if (!S
b320: 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61  SL_add1_host(sta
b330: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76  tePtr->ssl, serv
b340: 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20  ername)) {..    
b350: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b360: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e  (interp, "Set DN
b370: 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65  S hostname faile
b380: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b390: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b3a0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b3b0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b3c0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b3d0: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22  ORT", "HOSTNAME"
b3e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b3f0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  r *)NULL);..    
b400: 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20 2a  Tls_Free((void *
b410: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
b420: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b430: 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  R;..}.    }..   
b440: 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73 69   /* Resume sessi
b450: 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66 20  on id */.    if 
b460: 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20 73  (session_id && s
b470: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64  trlen(session_id
b480: 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49 44  ) <= SSL_MAX_SID
b490: 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a 09  _CTX_LENGTH) {..
b4a0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73 69  /* SSL_set_sessi
b4b0: 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53 53  on() */..if (!SS
b4c0: 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f 69  L_SESSION_set1_i
b4d0: 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67 65  d_context(SSL_ge
b4e0: 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65 50  t_session(stateP
b4f0: 74 72 2d 3e 73 73 6c 29 2c 0a 09 09 28 63 6f 6e  tr->ssl),...(con
b500: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
b510: 20 2a 29 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20   *) session_id, 
b520: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73  (unsigned int) s
b530: 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69 64  trlen(session_id
b540: 29 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41  ))) {..    Tcl_A
b550: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b560: 72 70 2c 20 22 52 65 73 75 6d 65 20 73 65 73 73  rp, "Resume sess
b570: 69 6f 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ion failed: ", G
b580: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
b590: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
b5a0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
b5b0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
b5c0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
b5d0: 53 45 53 53 49 4f 4e 22 2c 20 22 46 41 49 4c 45  SESSION", "FAILE
b5e0: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
b5f0: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
b600: 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74  ((void *)statePt
b610: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
b620: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
b630: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62    }..    /* Enab
b640: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c  le Application-L
b650: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65  ayer Protocol Ne
b660: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70  gotiation. Examp
b670: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e  les are: http/1.
b680: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32  0,..http/1.1, h2
b690: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c  , h3, ftp, imap,
b6a0: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65   pop3, xmpp-clie
b6b0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c  nt, xmpp-server,
b6c0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e   mqtt, irc, etc.
b6d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e   */.    if (alpn
b6e0: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20  ) {../* Convert 
b6f0: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20  a TCL list into 
b700: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  a protocol-list 
b710: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a  in wire-format *
b720: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  /..unsigned char
b730: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75   *protos, *p;..u
b740: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74  nsigned int prot
b750: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c  os_len = 0;..Tcl
b760: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69  _Size cnt, i;..i
b770: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  nt j;..Tcl_Obj *
b780: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c  *list;...if (Tcl
b790: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
b7a0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e  nts(interp, alpn
b7b0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21  , &cnt, &list) !
b7c0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
b7d0: 20 54 6c 73 5f 46 72 65 65 28 28 76 6f 69 64 20   Tls_Free((void 
b7e0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
b7f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b800: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65  OR;..}.../* Dete
b810: 72 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79  rmine the memory
b820: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68   required for th
b830: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
b840: 2a 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  */..for (i = 0; 
b850: 69 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a  i < cnt; i++) {.
b860: 09 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69  .    Tcl_GetStri
b870: 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69  ngFromObj(list[i
b880: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69  ], &len);..    i
b890: 66 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a  f (len > 255) {.
b8a0: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
b8b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e  lt(interp, "ALPN
b8c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20   protocol names 
b8d0: 74 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72  too long", (char
b8e0: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f   *)NULL);...Tcl_
b8f0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b900: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b910: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
b920: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b930: 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65  NULL);...Tls_Fre
b940: 65 28 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  e((void *)stateP
b950: 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  tr);...return TC
b960: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
b970: 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20  .    protos_len 
b980: 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e  += 1 + (int) len
b990: 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20  ;..}.../* Build 
b9a0: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f  the complete pro
b9b0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70  tocol-list */..p
b9c0: 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28  rotos = ckalloc(
b9d0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a  protos_len);../*
b9e0: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20   protocol-lists 
b9f0: 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74  consist of 8-bit
ba00: 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64   length-prefixed
ba10: 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a  , byte strings *
ba20: 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70  /..for (j = 0, p
ba30: 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63   = protos; j < c
ba40: 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; j++) {..    
ba50: 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f  char *str = Tcl_
ba60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
ba70: 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b  (list[j], &len);
ba80: 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e  ..    *p++ = (un
ba90: 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e  signed char) len
baa0: 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ;..    memcpy(p,
bab0: 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c   str, (size_t) l
bac0: 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c  en);..    p += l
bad0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f  en;..}.../* SSL_
bae0: 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20  set_alpn_protos 
baf0: 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20  makes a copy of 
bb00: 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  the protocol-lis
bb10: 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54  t */../* Note: T
bb20: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 76  his function rev
bb30: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e  erses the return
bb40: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f   value conventio
bb50: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65  n */..if (SSL_se
bb60: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74  t_alpn_protos(st
bb70: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f  atePtr->ssl, pro
bb80: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29  tos, protos_len)
bb90: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
bba0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bbb0: 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74  , "Set ALPN prot
bbc0: 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c  ocols failed: ",
bbd0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
bbe0: 29 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ), (char *)NULL)
bbf0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
bc00: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
bc10: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
bc20: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
bc30: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
bc40: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
bc50: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
bc60: 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70  );..    ckfree(p
bc70: 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74  rotos);..    ret
bc80: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bc90: 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f  }.../* Store pro
bca0: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09  tocols list */..
bcb0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
bcc0: 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74   = protos;..stat
bcd0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
bce0: 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20   = protos_len;. 
bcf0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61     } else {..sta
bd00: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20  tePtr->protos = 
bd10: 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d  NULL;..statePtr-
bd20: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b  >protos_len = 0;
bd30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
bd40: 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61      * SSL Callba
bd50: 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  cks.     */.    
bd60: 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61  SSL_set_app_data
bd70: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bd80: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
bd90: 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b  );./* point back
bda0: 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20 53 53   to us */.    SS
bdb0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61  L_set_verify(sta
bdc0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69  tePtr->ssl, veri
bdd0: 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61  fy, VerifyCallba
bde0: 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74  ck);.    SSL_set
bdf0: 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73  _info_callback(s
be00: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e  tatePtr->ssl, In
be10: 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20  foCallback);..  
be20: 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f    /* Callback fo
be30: 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74  r observing prot
be40: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f  ocol messages */
be50: 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c  .#ifndef OPENSSL
be60: 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20  _NO_SSL_TRACE.  
be70: 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54    /* void SSL_CT
be80: 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  X_set_msg_callba
be90: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
bea0: 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ctx, (void *)st
beb0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69  atePtr);.    voi
bec0: 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73  d SSL_CTX_set_ms
bed0: 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  g_callback(state
bee0: 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67  Ptr->ctx, Messag
bef0: 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20  eCallback); */. 
bf00: 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63     SSL_set_msg_c
bf10: 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74  allback_arg(stat
bf20: 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64  ePtr->ssl, (void
bf30: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20   *)statePtr);.  
bf40: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
bf50: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
bf60: 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c  >ssl, MessageCal
bf70: 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a  lback);.#endif..
bf80: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63      /* Create Tc
bf90: 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61  l_Channel BIO Ha
bfa0: 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61  ndler */.    sta
bfb0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42  tePtr->p_bio.= B
bfc0: 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65  IO_new_tcl(state
bfd0: 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45  Ptr, BIO_NOCLOSE
bfe0: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
bff0: 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42  >bio.= BIO_new(B
c000: 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20  IO_f_ssl());..  
c010: 20 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a    if (server) {.
c020: 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62  ./* Server callb
c030: 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  acks */..SSL_CTX
c040: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
c050: 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65  ername_arg(state
c060: 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20  Ptr->ctx, (void 
c070: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53  *)statePtr);..SS
c080: 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74  L_CTX_set_tlsext
c090: 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c  _servername_call
c0a0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
c0b0: 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29  tx, SNICallback)
c0c0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ;..SSL_CTX_set_c
c0d0: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73  lient_hello_cb(s
c0e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65  tatePtr->ctx, He
c0f0: 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  lloCallback, (vo
c100: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c110: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70  .if (statePtr->p
c120: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  rotos != NULL) {
c130: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
c140: 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62  t_alpn_select_cb
c150: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c160: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c170: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c180: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
c190: 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20  .    if (tls1_2 
c1a0: 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d  == 0 && tls1_3 =
c1b0: 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58  = 0) {...SSL_CTX
c1c0: 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73  _set_next_protos
c1d0: 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73  _advertised_cb(s
c1e0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50  tatePtr->ctx, NP
c1f0: 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  NCallback, (void
c200: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20   *)statePtr);.. 
c210: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a     }.#endif..}..
c220: 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65  ./* Enable serve
c230: 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72  r to send cert r
c240: 65 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e  equest after han
c250: 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20  dshake (TLS 1.3 
c260: 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77  only) */../* A w
c270: 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d  rite operation m
c280: 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66  ust take place f
c290: 6f 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61  or the Certifica
c2a0: 74 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65  te Request to be
c2b0: 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65  ..   sent to the
c2c0: 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61   client, this ca
c2d0: 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53  n be done with S
c2e0: 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28  SL_do_handshake(
c2f0: 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65  ). */..if (reque
c300: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
c310: 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20  hake && tls1_3) 
c320: 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66  {..    SSL_verif
c330: 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61  y_client_post_ha
c340: 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72  ndshake(statePtr
c350: 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20  ->ssl);..}.../* 
c360: 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75  set automatic cu
c370: 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f  rve selection */
c380: 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61  ..SSL_set_ecdh_a
c390: 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73  uto(statePtr->ss
c3a0: 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20  l, 1);.../* Set 
c3b0: 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09  server mode */..
c3c0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
c3d0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45  |= TLS_TCL_SERVE
c3e0: 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65  R;..SSL_set_acce
c3f0: 70 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74  pt_state(statePt
c400: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
c410: 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74  lse {../* Client
c420: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69   callbacks */.#i
c430: 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66  fdef USE_NPN..if
c440: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
c450: 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c  os != NULL && tl
c460: 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73  s1_2 == 0 && tls
c470: 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20  1_3 == 0) {..   
c480: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78   SSL_CTX_set_nex
c490: 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63  t_proto_select_c
c4a0: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c4b0: 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28   ALPNCallback, (
c4c0: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c4d0: 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  ;..}.#endif.../*
c4e0: 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67   Session caching
c4f0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
c500: 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
c510: 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
c520: 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48  x, SSL_SESS_CACH
c530: 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53  E_CLIENT | SSL_S
c540: 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54  ESS_CACHE_NO_INT
c550: 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53  ERNAL_STORE);..S
c560: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
c570: 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d  new_cb(statePtr-
c580: 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c  >ctx, SessionCal
c590: 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61  lback);.../* Ena
c5a0: 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61  ble post handsha
c5b0: 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f  ke Authenticatio
c5c0: 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53  n extension. TLS
c5d0: 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68   1.3 only, not h
c5e0: 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72  ttp/2. */..if (r
c5f0: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
c600: 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20  andshake) {..   
c610: 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61   SSL_set_post_ha
c620: 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61  ndshake_auth(sta
c630: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a  tePtr->ssl, 1);.
c640: 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65  .}.../* Set clie
c650: 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f  nt mode */..SSL_
c660: 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74  set_connect_stat
c670: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c680: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  ;.    }.    SSL_
c690: 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72  set_bio(statePtr
c6a0: 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d  ->ssl, statePtr-
c6b0: 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72  >p_bio, statePtr
c6c0: 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49  ->p_bio);.    BI
c6d0: 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50  O_set_ssl(stateP
c6e0: 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74  tr->bio, statePt
c6f0: 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c  r->ssl, BIO_NOCL
c700: 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  OSE);..    /*.  
c710: 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20     * End of SSL 
c720: 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20  Init.     */.   
c730: 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
c740: 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74  ing %s", Tcl_Get
c750: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
c760: 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20  ePtr->self));.  
c770: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
c780: 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
c790: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
c7a0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
c7b0: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
c7c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
c7d0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72  --. *. * Unimpor
c830: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
c840: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
c850: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72 65  is invoked to re
c860: 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73 74  move the topmost
c870: 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72 2e   channel filter.
c880: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
c890: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
c8a0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
c8b0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c8c0: 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20  .May modify the 
c8d0: 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49  behavior of an I
c8e0: 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a  O channel.. *. *
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20  ---. */..static 
c940: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  int.UnimportObjC
c950: 6d 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53  md(.    TCL_UNUS
c960: 45 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20  ED(void *),.    
c970: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
c980: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63  rp,.    int objc
c990: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ,.    Tcl_Obj *c
c9a0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20  onst objv[]).{. 
c9b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
c9c0: 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
c9d0: 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
c9e0: 64 65 20 6f 6e 2e 20 2a 2f 0a 0a 20 20 20 20 64  de on. */..    d
c9f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
ca00: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
ca10: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
ca20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ca30: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
ca40: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
ca50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ca60: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ca70: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
ca80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ca90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
caa0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
cab0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
cac0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
cad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cae0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
caf0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cb00: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cb10: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cb20: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cb30: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
cb40: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
cb50: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
cb60: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
cb70: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
cb80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cb90: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
cba0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
cbb0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
cbc0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
cbd0: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e  nnel", (char *)N
cbe0: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
cbf0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
cc00: 22 54 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54  "TLS", "UNIMPORT
cc10: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
cc20: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
cc30: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
cc40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cc50: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  ..    if (Tcl_Un
cc60: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
cc70: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43  erp, chan) == TC
cc80: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75  L_ERROR) {..retu
cc90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cca0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
ccb0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
ccc0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
cd10: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
cd20: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
cd30: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
cd40: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
cd50: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
cd60: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
cd70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
cd80: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
cd90: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
cda0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
cdf0: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49   SSL_CTX *.CTX_I
ce00: 6e 69 74 28 0a 20 20 20 20 53 74 61 74 65 20 2a  nit(.    State *
ce10: 73 74 61 74 65 50 74 72 2c 0a 20 20 20 20 69 6e  statePtr,.    in
ce20: 74 20 69 73 53 65 72 76 65 72 2c 0a 20 20 20 20  t isServer,.    
ce30: 69 6e 74 20 70 72 6f 74 6f 2c 0a 20 20 20 20 63  int proto,.    c
ce40: 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 0a 20 20  har *keyfile,.  
ce50: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
ce60: 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ,.    unsigned c
ce70: 68 61 72 20 2a 6b 65 79 2c 0a 20 20 20 20 75 6e  har *key,.    un
ce80: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
ce90: 74 2c 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c  t,.    int key_l
cea0: 65 6e 2c 0a 20 20 20 20 69 6e 74 20 63 65 72 74  en,.    int cert
ceb0: 5f 6c 65 6e 2c 0a 20 20 20 20 63 68 61 72 20 2a  _len,.    char *
cec0: 43 41 70 61 74 68 2c 0a 20 20 20 20 63 68 61 72  CApath,.    char
ced0: 20 2a 43 41 66 69 6c 65 2c 0a 20 20 20 20 63 68   *CAfile,.    ch
cee0: 61 72 20 2a 63 69 70 68 65 72 73 2c 0a 20 20 20  ar *ciphers,.   
cef0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
cf00: 74 65 73 2c 0a 20 20 20 20 69 6e 74 20 6c 65 76  tes,.    int lev
cf10: 65 6c 2c 0a 20 20 20 20 63 68 61 72 20 2a 44 48  el,.    char *DH
cf20: 70 61 72 61 6d 73 29 0a 7b 0a 20 20 20 20 54 63  params).{.    Tc
cf30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
cf40: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74   = statePtr->int
cf50: 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  erp;.    SSL_CTX
cf60: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
cf70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 73    Tcl_DString ds
cf80: 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66 20 3d 20  ;.    int off = 
cf90: 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b 0a 20 20  0, abort = 0;.  
cfa0: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61    int load_priva
cfb0: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  te_key;.    cons
cfc0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
cfd0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
cfe0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
cff0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b     if (!proto) {
d000: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d010: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76  lt(interp, "no v
d020: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65  alid protocol se
d030: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a  lected", (char *
d040: 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20  )NULL);..return 
d050: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
d060: 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63   /* create SSL c
d070: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 66  ontext */.    if
d080: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29   TLS_PROTO_SSL2)
d0a0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d0b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
d0c0: 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  SL2 protocol not
d0d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d0e0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74  ar *)NULL);..ret
d0f0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
d100: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d110: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d120: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL3)) {..Tcl_A
d130: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d140: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63  rp, "SSL3 protoc
d150: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d160: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
d170: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d180: 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65      }.#if define
d190: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
d1a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d1b0: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
d1c0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d1d0: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 69 66  1_METHOD).    if
d1e0: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
d1f0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
d200: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d210: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
d220: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
d230: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
d240: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09  (char *)NULL);..
d250: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
d260: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
d270: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
d280: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
d290: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  SSL_NO_TLS1_1) |
d2a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d2b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
d2c0: 4f 44 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  OD).    if (ENAB
d2d0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d2e0: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a  ROTO_TLS1_1)) {.
d2f0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d300: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
d310: 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .1 protocol not 
d320: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
d330: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
d340: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
d350: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
d360: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
d370: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d380: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
d390: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d3a0: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
d3b0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d3c0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d3d0: 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c  _TLS1_2)) {..Tcl
d3e0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d3f0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70  terp, "TLS 1.2 p
d400: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d410: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d420: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d430: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d440: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d450: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
d460: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d470: 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45  LS1_3).    if (E
d480: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d490: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29  S_PROTO_TLS1_3))
d4a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
d4b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c  sult(interp, "TL
d4c0: 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e  S 1.3 protocol n
d4d0: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
d4e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72  char *)NULL);..r
d4f0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d500: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
d510: 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09  (proto == 0) {..
d520: 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67  /* Use full rang
d530: 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  e */..SSL_CTX_se
d540: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
d550: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53  ion(ctx, 0);..SS
d560: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
d570: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
d580: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
d590: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b  switch (proto) {
d5a0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d5b0: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
d5c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d5d0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
d5e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d5f0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
d600: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
d610: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
d620: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76  ver ? TLSv1_serv
d630: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
d640: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Sv1_client_metho
d650: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
d660: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
d670: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
d680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
d690: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
d6a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d6b0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
d6c0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d6d0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
d6e0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
d6f0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f   TLSv1_1_server_
d700: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
d710: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _1_client_method
d720: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
d730: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
d740: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
d750: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d760: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
d770: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d780: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
d790: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
d7a0: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68  TO_TLS1_2:..meth
d7b0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d7c0: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d  TLSv1_2_server_m
d7d0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
d7e0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
d7f0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
d800: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
d810: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
d820: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d830: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
d840: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
d850: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20  _3:../* Use the 
d860: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61  generic method a
d870: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61  nd constraint ra
d880: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78  nge after contex
d890: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  t is created */.
d8a0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
d8b0: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
d8c0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
d8d0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d8e0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
d8f0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20     default:../* 
d900: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73  Negotiate highes
d910: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f  t available SSL/
d920: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09  TLS version */..
d930: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
d940: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
d950: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
d960: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23  ient_method();.#
d970: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
d980: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
d990: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d9a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d9b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
d9c0: 54 48 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45  THOD)..off |= (E
d9d0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
d9e0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
d9f0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
da00: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
da10: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
da20: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
da30: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
da40: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
da50: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
da60: 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 6f 66 66  1_1_METHOD)..off
da70: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
da80: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
da90: 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_1) ? 0 : SSL_
daa0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a  OP_NO_TLSv1_1);.
dab0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
dac0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
dad0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dae0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
daf0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
db00: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
db10: 4f 44 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  OD)..off |= (ENA
db20: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
db30: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
db40: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
db50: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
db60: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
db70: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
db80: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
db90: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_3)..off |= (E
dba0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dbb0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
dbc0: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
dbd0: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66  TLSv1_3);.#endif
dbe0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
dbf0: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
dc00: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20  ror();..    ctx 
dc10: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
dc20: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21  thod);.    if (!
dc30: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ctx) {..return N
dc40: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
dc50: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
dc60: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
dc70: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
dc80: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
dc90: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
dca0: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
dcb0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
dcc0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dcd0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
dce0: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
dcf0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
dd00: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
dd10: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
dd20: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
dd30: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
dd40: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
dd50: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
dd60: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
dd70: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
dd80: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73  * Force cipher s
dd90: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62  election order b
dda0: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20  y server */.    
ddb0: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b  if (!isServer) {
ddc0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70  ..SSL_CTX_set_op
ddd0: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
dde0: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f  P_CIPHER_SERVER_
ddf0: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20  PREFERENCE);.   
de00: 20 7d 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   }..    SSL_CTX_
de10: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
de20: 2c 20 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65  , interp);./* re
de30: 6d 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72  member the inter
de40: 70 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53  preter */.    SS
de50: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
de60: 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c  s(ctx, SSL_OP_AL
de70: 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62  L);./* all SSL b
de80: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a  ug workarounds *
de90: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
dea0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
deb0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53  SL_OP_NO_COMPRES
dec0: 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c  SION);./* disabl
ded0: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76  e compression ev
dee0: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20  en if supported 
def0: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
df00: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
df10: 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c  off);../* disabl
df20: 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69  e protocol versi
df30: 6f 6e 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ons */.    SSL_C
df40: 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68  TX_sess_set_cach
df50: 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29  e_size(ctx, 128)
df60: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73  ;..    /* Set us
df70: 65 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65  er defined ciphe
df80: 72 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65  rs, cipher suite
df90: 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20  s, and security 
dfa0: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
dfb0: 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c  ((ciphers != NUL
dfc0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
dfd0: 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63  et_cipher_list(c
dfe0: 74 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a  tx, ciphers)) {.
dff0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
e000: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
e010: 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e  iphers failed: N
e020: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22  o valid ciphers"
e030: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
e040: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e050: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e060: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
e070: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
e080: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
e090: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
e0a0: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
e0b0: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f  suites)) {..Tcl_
e0c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e0d0: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
e0e0: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
e0f0: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
e100: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
e110: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e120: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e130: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
e140: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Set security l
e150: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
e160: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65  level > -1 && le
e170: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53  vel < 6) {../* S
e180: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_set_security_
e190: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54  level */..SSL_CT
e1a0: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  X_set_security_l
e1b0: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29  evel(ctx, level)
e1c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e1d0: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63  set some callbac
e1e0: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ks */.    SSL_CT
e1f0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
e200: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73  sswd_cb(ctx, Pas
e210: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a  swordCallback);.
e220: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e230: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
e240: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20  b_userdata(ctx, 
e250: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
e260: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20  );..    /* read 
e270: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e  a Diffie-Hellman
e280: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
e290: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69  , or use the bui
e2a0: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20  lt-in one */.   
e2b0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
e2c0: 28 26 64 73 29 3b 0a 23 69 66 64 65 66 20 4f 50  (&ds);.#ifdef OP
e2d0: 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20  ENSSL_NO_DH.    
e2e0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
e2f0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
e300: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e310: 2c 20 22 44 48 20 70 61 72 61 6d 65 74 65 72 20  , "DH parameter 
e320: 73 75 70 70 6f 72 74 20 6e 6f 74 20 61 76 61 69  support not avai
e330: 6c 61 62 6c 65 22 2c 20 28 63 68 61 72 20 2a 29  lable", (char *)
e340: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
e350: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
e360: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
e370: 65 6c 73 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20  else.    {..DH* 
e380: 64 68 3b 0a 09 69 66 20 28 44 48 70 61 72 61 6d  dh;..if (DHparam
e390: 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  s != NULL) {..  
e3a0: 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20    BIO *bio;...  
e3b0: 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f    bio = BIO_new_
e3c0: 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61 6d  file(F2N(DHparam
e3d0: 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a 09  s, &ds), "r");..
e3e0: 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b 0a      if (!bio) {.
e3f0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
e400: 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70  e(&ds);...Tcl_Ap
e410: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e420: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69  p, "Could not fi
e430: 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  nd DH parameters
e440: 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29   file", (char *)
e450: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
e460: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
e470: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
e480: 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d  }...    dh = PEM
e490: 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61  _read_bio_DHpara
e4a0: 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55  ms(bio, NULL, NU
e4b0: 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  LL, NULL);..    
e4c0: 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09  BIO_free(bio);..
e4d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
e4e0: 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69  ree(&ds);..    i
e4f0: 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f  f (!dh) {...Tcl_
e500: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e510: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
e520: 72 65 61 64 20 44 48 20 70 61 72 61 6d 65 74 65  read DH paramete
e530: 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28  rs from file", (
e540: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09  char *)NULL);...
e550: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e560: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
e570: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53  ;..    }..    SS
e580: 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68  L_CTX_set_tmp_dh
e590: 28 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20  (ctx, dh);..    
e5a0: 44 48 5f 66 72 65 65 28 64 68 29 3b 0a 09 7d 20  DH_free(dh);..} 
e5b0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55  else {..    /* U
e5c0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48  se well known DH
e5d0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
e5e0: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73   have built-in s
e5f0: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53  upport in OpenSS
e600: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53  L */..    if (!S
e610: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75  SL_CTX_set_dh_au
e620: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09  to(ctx, 1)) {...
e630: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e640: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
e650: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44  not enable set D
e660: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45  H auto: ", GET_E
e670: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
e680: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53  ar *)NULL);...SS
e690: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
e6a0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
e6b0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
e6c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73  #endif..    /* s
e6d0: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61  et our certifica
e6e0: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70  te */.    load_p
e6f0: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a  rivate_key = 0;.
e700: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
e710: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
e720: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
e730: 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  1;...if (SSL_CTX
e740: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
e750: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63  _file(ctx, F2N(c
e760: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  ertfile, &ds), S
e770: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
e780: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
e790: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e7a0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
e7b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
e7c0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
e7d0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
e7e0: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
e7f0: 3a 20 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45  : ",...    GET_E
e800: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
e810: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20  ar *)NULL);..   
e820: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
e830: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
e840: 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53  NULL;..}..Tcl_DS
e850: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e860: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
e870: 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  cert != NULL) {.
e880: 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  .load_private_ke
e890: 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f  y = 1;..if (SSL_
e8a0: 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63  CTX_use_certific
e8b0: 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65  ate_ASN1(ctx, ce
e8c0: 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d  rt_len, cert) <=
e8d0: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41   0) {..    Tcl_A
e8e0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e8f0: 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73  rp, "unable to s
e900: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a 20  et certificate: 
e910: 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52  ",...    GET_ERR
e920: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
e930: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53   *)NULL);..    S
e940: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e950: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
e960: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
e970: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20  e {..certfile = 
e980: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f  (char*)X509_get_
e990: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c  default_cert_fil
e9a0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  e();...if (SSL_C
e9b0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
e9c0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72  te_file(ctx, cer
e9d0: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54  tfile, SSL_FILET
e9e0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
e9f0: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f  .#if 0..    Tcl_
ea00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ea10: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
ea20: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74  use default cert
ea30: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
ea40: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
ea50: 09 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45  ..    GET_ERR_RE
ea60: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ea70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
ea80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ea90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
eaa0: 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d  .#endif..}.    }
eab0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72  ..    /* set our
eac0: 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a   private key */.
ead0: 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70 72 69      if (load_pri
eae0: 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20  vate_key) {..if 
eaf0: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
eb00: 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29   && key == NULL)
eb10: 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c 65 20   {..    keyfile 
eb20: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a  = certfile;..}..
eb30: 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21 3d 20  .if (keyfile != 
eb40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20  NULL) {..    /* 
eb50: 67 65 74 20 74 68 65 20 70 72 69 76 61 74 65 20  get the private 
eb60: 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
eb70: 69 74 68 20 74 68 69 73 20 63 65 72 74 69 66 69  ith this certifi
eb80: 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69 66 20  cate */..    if 
eb90: 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c  (keyfile == NULL
eba0: 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20  ) {...keyfile = 
ebb0: 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d  certfile;..    }
ebc0: 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  ...    if (SSL_C
ebd0: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
ebe0: 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  y_file(ctx, F2N(
ebf0: 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  keyfile, &ds), S
ec00: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
ec10: 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44   <= 0) {...Tcl_D
ec20: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ec30: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
ec40: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
ec50: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
ec60: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
ec70: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
ec80: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
ec90: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
eca0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ecb0: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
ecc0: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 20   set public key 
ecd0: 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c  file ", keyfile,
ece0: 20 22 20 22 2c 0a 09 09 09 47 45 54 5f 45 52 52   " ",....GET_ERR
ecf0: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
ed00: 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f   *)NULL);...SSL_
ed10: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ed20: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
ed30: 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
ed40: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
ed50: 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20  .} else if (key 
ed60: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
ed70: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
ed80: 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28  PrivateKey_ASN1(
ed90: 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74  EVP_PKEY_RSA, ct
eda0: 78 2c 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20  x, key,key_len) 
edb0: 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c 75  <= 0) {.../* flu
edc0: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
edd0: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
ede0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
edf0: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
ee00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
ee10: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
ee20: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
ee30: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
ee40: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
ee50: 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45  ic key: ", GET_E
ee60: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
ee70: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 53 53  ar *)NULL);...SS
ee80: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ee90: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
eea0: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f  .    }..}../* No
eeb0: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  w we know that a
eec0: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61   key and cert ha
eed0: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69  ve been set agai
eee0: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20  nst.. * the SSL 
eef0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28  context */..if (
ef00: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70  !SSL_CTX_check_p
ef10: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29  rivate_key(ctx))
ef20: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
ef30: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ef40: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f   "private key do
ef50: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
ef60: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62   certificate pub
ef70: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20  lic key",....   
ef80: 20 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b    (char *)NULL);
ef90: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
efa0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
efb0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  turn NULL;..}.  
efc0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
efd0: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 6c  to use default l
efe0: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65  ocation and file
eff0: 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65   for Certificate
f000: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20   Authority (CA) 
f010: 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 54 68  certificates. Th
f020: 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79 20  e.     * verify 
f030: 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63  path and store c
f040: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
f050: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
f060: 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68  _DIR env var. Th
f070: 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 61  e verify file ca
f080: 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65 72  n.     * be over
f090: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53  ridden by the SS
f0a0: 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20  L_CERT_FILE env 
f0b0: 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  var. */.    if (
f0c0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
f0d0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
f0e0: 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74  s(ctx)) {..abort
f0f0: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
f100: 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20  * Overrides for 
f110: 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 61  the CA verify pa
f120: 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20  th and file */. 
f130: 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c     {.#if OPENSSL
f140: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
f150: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69  < 0x30000000L..i
f160: 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c  f (CApath != NUL
f170: 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e  L || CAfile != N
f180: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
f190: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20  DString ds1;..  
f1a0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
f1b0: 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69  t(&ds1);...    i
f1c0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
f1d0: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
f1e0: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
f1f0: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70  e, &ds), F2N(CAp
f200: 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09  ath, &ds1))) {..
f210: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
f220: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f230: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
f240: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f250: 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a  (&ds1);...    /*
f260: 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73   Set list of CAs
f270: 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65   to send to clie
f280: 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  nt when requesti
f290: 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74  ng a client cert
f2a0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
f2b0: 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63  /* https://sourc
f2c0: 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73  eforge.net/p/tls
f2d0: 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20  /bugs/57/ */..  
f2e0: 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c    /* XXX:TODO: L
f2f0: 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70  et the user supp
f300: 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69  ly values here i
f310: 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68  nstead of someth
f320: 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20  ing that exists 
f330: 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  on the filesyste
f340: 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f  m */..    STACK_
f350: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
f360: 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
f370: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
f380: 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
f390: 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63  ds));..    if (c
f3a0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
f3b0: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65  ) {...SSL_CTX_se
f3c0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
f3d0: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
f3e0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
f3f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f400: 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69  s);..}..#else..i
f410: 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c  f (CApath != NUL
f420: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
f430: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
f440: 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e 28  fy_dir(ctx, F2N(
f450: 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 7b  CApath, &ds))) {
f460: 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20  ...abort++;..   
f470: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
f480: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
f490: 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20  ..if (CAfile != 
f4a0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
f4b0: 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
f4c0: 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c 20  erify_file(ctx, 
f4d0: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
f4e0: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
f4f0: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
f500: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f510: 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
f520: 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
f530: 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
f540: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
f550: 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
f560: 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f  e */..    STACK_
f570: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
f580: 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
f590: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
f5a0: 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
f5b0: 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63  ds));..    if (c
f5c0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
f5d0: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65  ) {...SSL_CTX_se
f5e0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
f5f0: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
f600: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
f610: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f620: 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20  s);..}.#endif.  
f630: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
f640: 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ctx;.}.../*. *--
f650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f690: 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62  -. *. * StatusOb
f6a0: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
f6b0: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63  ertificate for c
f6c0: 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20  onnected peer.. 
f6d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
f6e0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
f6f0: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
f700: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
f710: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
f720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
f760: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61  /.static int.Sta
f770: 74 75 73 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54  tusObjCmd(.    T
f780: 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 2a  CL_UNUSED(void *
f790: 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  ),.    Tcl_Inter
f7a0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69  p *interp,.    i
f7b0: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c  nt objc,.    Tcl
f7c0: 5f 4f 62 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj.*const objv
f7d0: 5b 5d 29 0a 7b 0a 20 20 20 20 53 74 61 74 65 20  []).{.    State 
f7e0: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58  *statePtr;.    X
f7f0: 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54  509 *peer;.    T
f800: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
f810: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
f820: 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a  chan;.    char *
f830: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69  channelName, *ci
f840: 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d  phers;.    int m
f850: 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ode;.    const u
f860: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72  nsigned char *pr
f870: 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  oto;.    unsigne
f880: 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69  d int len;.    i
f890: 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 0a 20 20  nt nid, res;..  
f8a0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
f8b0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
f8c0: 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e  jc < 2 || objc >
f8d0: 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33   3 || (objc == 3
f8e0: 20 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f   && !strcmp(Tcl_
f8f0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f900: 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20  ]), "-local"))) 
f910: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
f920: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
f930: 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63  bjv, "?-local? c
f940: 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
f950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
f960: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63   }..    /* Get c
f970: 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20  hannel Id */.   
f980: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54   channelName = T
f990: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f9a0: 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31  v[(objc == 2 ? 1
f9b0: 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61   : 2)]);.    cha
f9c0: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
f9d0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e  el(interp, chann
f9e0: 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a  elName, &mode);.
f9f0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20      if (chan == 
fa00: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55  (Tcl_Channel) NU
fa10: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
fa20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
fa30: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
fa40: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
fa50: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
fa60: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d  el */.    chan =
fa70: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e   Tcl_GetTopChann
fa80: 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66  el(chan);.    if
fa90: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
faa0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
fab0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
fac0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
fad0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
fae0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
faf0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
fb00: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
fb10: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
fb20: 6c 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  l", (char *)NULL
fb30: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
fb40: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
fb50: 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43  S", "STATUS", "C
fb60: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
fb70: 44 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  D", (char *)NULL
fb80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
fb90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
fba0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
fbb0: 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e  e *) Tcl_GetChan
fbc0: 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
fbd0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47  chan);..    /* G
fbe0: 65 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66  et certificate f
fbf0: 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20  or peer or self 
fc00: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
fc10: 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20  == 2) {..peer = 
fc20: 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72  SSL_get_peer_cer
fc30: 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
fc40: 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65  r->ssl);.    } e
fc50: 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53  lse {..peer = SS
fc60: 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74  L_get_certificat
fc70: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
fc80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47  ;.    }.    /* G
fc90: 65 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63  et X509 certific
fca0: 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ate info */.    
fcb0: 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a  if (peer) {..obj
fcc0: 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30  Ptr = Tls_NewX50
fcd0: 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65  9Obj(interp, pee
fce0: 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d  r);..if (objc ==
fcf0: 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f   2) {..    X509_
fd00: 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20  free(peer);..   
fd10: 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d   peer = NULL;..}
fd20: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f  .    } else {..o
fd30: 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
fd40: 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
fd50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
fd60: 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  eer name */.    
fd70: 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
fd80: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65  rp, objPtr, "pee
fd90: 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30  rname", SSL_get0
fda0: 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50  _peername(stateP
fdb0: 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20  tr->ssl), -1);. 
fdc0: 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
fdd0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
fde0: 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f  sbits", SSL_get_
fdf0: 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74  cipher_bits(stat
fe00: 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29  ePtr->ssl, NULL)
fe10: 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20  );..    ciphers 
fe20: 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74  = (char*)SSL_get
fe30: 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
fe40: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50  ->ssl);.    LAPP
fe50: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
fe60: 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
fe70: 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a  , ciphers, -1);.
fe80: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
fe90: 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63  he X509 certific
fea0: 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79  ate presented by
feb0: 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20   the peer */.   
fec0: 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
fed0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
fee0: 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35  rifyResult",..X5
fef0: 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65  09_verify_cert_e
ff00: 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f  rror_string(SSL_
ff10: 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
ff20: 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
ff30: 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
ff40: 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20  Verify mode */. 
ff50: 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65     mode = SSL_ge
ff60: 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74  t_verify_mode(st
ff70: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
ff80: 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53    if (mode && SS
ff90: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b  L_VERIFY_NONE) {
ffa0: 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
ffb0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76  terp, objPtr, "v
ffc0: 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e  erifyMode", "non
ffd0: 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65  e", -1);.    } e
ffe0: 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  lse {..Tcl_Obj *
fff0: 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c  listObjPtr = Tcl
10000 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
10010 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20  ULL);..if (mode 
10020 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45  && SSL_VERIFY_PE
10030 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  ER) {..    Tcl_L
10040 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
10050 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
10060 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
10070 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c  tringObj("peer",
10080 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
10090 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
100a0 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
100b0 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54  R_CERT) {..    T
100c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
100d0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
100e0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
100f0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61  NewStringObj("fa
10100 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65  il if no peer ce
10110 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  rt", -1));..}..i
10120 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
10130 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
10140 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
10150 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10160 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
10170 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10180 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20  ringObj("client 
10190 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  once", -1));..}.
101a0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
101b0 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e  _VERIFY_POST_HAN
101c0 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54  DSHAKE) {..    T
101d0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
101e0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
101f0 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
10200 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f  NewStringObj("po
10210 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d  st handshake", -
10220 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44  1));..}..LAPPEND
10230 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
10240 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
10250 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20  ", listObjPtr). 
10260 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72     }..    /* Ver
10270 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a  ify mode depth *
10280 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  /.    LAPPEND_IN
10290 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
102a0 2c 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c  , "verifyDepth",
102b0 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
102c0 64 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e  depth(statePtr->
102d0 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  ssl));..    /* R
102e0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
102f0 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
10300 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e   result of the n
10310 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20  egotiation */.  
10320 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f    SSL_get0_alpn_
10330 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74  selected(statePt
10340 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  r->ssl, &proto, 
10350 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45  &len);.    LAPPE
10360 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10370 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28  bjPtr, "alpn", (
10380 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54  char *)proto, (T
10390 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20  cl_Size) len);. 
103a0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
103b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
103c0 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67  protocol", SSL_g
103d0 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65  et_version(state
103e0 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a  Ptr->ssl), -1);.
103f0 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f  .    /* Valid fo
10400 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74  r non-RSA signat
10410 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20  ure and TLS 1.3 
10420 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
10430 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 2) {..res = S
10440 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e  SL_get_peer_sign
10450 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
10460 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
10470 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
10480 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
10490 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50  ature_nid(stateP
104a0 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
104b0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72      }.    if (!r
104c0 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20  es) {nid = 0;}. 
104d0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
104e0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
104f0 73 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67  signatureHashAlg
10500 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64  orithm", OBJ_nid
10510 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
10520 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
10530 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  2) {..res = SSL_
10540 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75  get_peer_signatu
10550 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74  re_type_nid(stat
10560 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10570 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10580 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10590 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
105a0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
105b0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
105c0 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
105d0 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
105e0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
105f0 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
10600 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  Type", OBJ_nid2l
10610 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
10620 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10630 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
10640 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
10650 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
10660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
106a0 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63  ---. *. * Connec
106b0 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d  tionInfoObjCmd -
106c0 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74  - return connect
106d0 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70  ion info from Op
106e0 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73  enSSL.. *. * Res
106f0 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20  ults:. *.A list 
10700 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  of connection in
10710 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  fo.  *. *-------
10720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
10760 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e  ..static int Con
10770 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d  nectionInfoObjCm
10780 64 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45  d(.    TCL_UNUSE
10790 44 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54  D(void *),.    T
107a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
107b0 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
107c0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
107d0 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
107e0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
107f0 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
10800 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
10810 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74  e on */.    Stat
10820 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
10830 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
10840 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
10850 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
10860 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20  Ptr, *listPtr;. 
10870 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
10880 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
10890 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
108a0 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
108b0 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
108c0 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
108d0 44 20 2a 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28  D *md;..    if (
108e0 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
108f0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10900 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10910 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
10920 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10930 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d     }..    chan =
10940 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
10950 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10960 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10970 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
10980 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
10990 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
109a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
109b0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
109c0 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
109d0 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
109e0 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
109f0 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
10a00 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
10a10 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74  .    if (Tcl_Get
10a20 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e  ChannelType(chan
10a30 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c  ) != Tls_Channel
10a40 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41  Type()) {..Tcl_A
10a50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
10a60 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c  rp, "bad channel
10a70 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   \"", Tcl_GetCha
10a80 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a  nnelName(chan),.
10a90 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20  .    "\": not a 
10aa0 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
10ab0 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 54 63  har *)NULL);..Tc
10ac0 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
10ad0 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43  nterp, "TLS", "C
10ae0 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41  ONNECTION", "CHA
10af0 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
10b00 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
10b10 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
10b20 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f  OR;.    }..    o
10b30 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
10b40 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
10b50 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  ..    /* Connect
10b60 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
10b70 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
10b80 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
10b90 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
10ba0 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20  han);.    ssl = 
10bb0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20  statePtr->ssl;. 
10bc0 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
10bd0 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63  LL) {../* connec
10be0 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c  tion state */..L
10bf0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10c00 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74  p, objPtr, "stat
10c10 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74  e", SSL_state_st
10c20 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
10c30 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e  -1);.../* Get SN
10c40 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76  I requested serv
10c50 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
10c60 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10c70 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e  objPtr, "servern
10c80 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  ame", SSL_get_se
10c90 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
10ca0 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
10cb0 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a  st_name), -1);..
10cc0 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c  ./* Get protocol
10cd0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
10ce0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10cf0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10d00 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c  _get_version(ssl
10d10 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e  ), -1);.../* Ren
10d20 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77  egotiation allow
10d30 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ed */..LAPPEND_B
10d40 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
10d50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69  tr, "renegotiati
10d60 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c  on_allowed", SSL
10d70 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65  _get_secure_rene
10d80 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72  gotiation_suppor
10d90 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b  t((SSL *) ssl));
10da0 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69  .../* Get securi
10db0 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50  ty level */..LAP
10dc0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
10dd0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69   objPtr, "securi
10de0 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67  ty_level", SSL_g
10df0 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
10e00 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65  l(ssl));.../* Se
10e10 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c  ssion info */..L
10e20 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
10e30 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
10e40 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53  sion_reused", SS
10e50 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  L_session_reused
10e60 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20  (ssl));.../* Is 
10e70 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09  server info */..
10e80 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
10e90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73  erp, objPtr, "is
10ea0 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73  _server", SSL_is
10eb0 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a  _server(ssl));..
10ec0 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09  ./* Is DTLS */..
10ed0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
10ee0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73  erp, objPtr, "is
10ef0 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64  _dtls", SSL_is_d
10f00 74 6c 73 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d  tls(ssl));.    }
10f10 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20  ..    /* Cipher 
10f20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68  info */.    ciph
10f30 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  er = SSL_get_cur
10f40 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29  rent_cipher(ssl)
10f50 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  ;.    if (cipher
10f60 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61   != NULL) {..cha
10f70 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20  r buf[BUFSIZ] = 
10f80 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20  {0};..int bits, 
10f90 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43  alg_bits;.../* C
10fa0 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c  ipher name */..L
10fb0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10fc0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
10fd0 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  er", SSL_CIPHER_
10fe0 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29  get_name(cipher)
10ff0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20  , -1);.../* RFC 
11000 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a  name of cipher *
11010 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11020 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11030 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20  standard_name", 
11040 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64  SSL_CIPHER_stand
11050 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29  ard_name(cipher)
11060 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e  , -1);.../* Open
11070 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68  SSL name of ciph
11080 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
11090 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
110a0 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65  r, "openssl_name
110b0 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65  ", OPENSSL_ciphe
110c0 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45  r_name(SSL_CIPHE
110d0 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28  R_standard_name(
110e0 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
110f0 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65  ./* number of se
11100 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20 66  cret bits used f
11110 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69  or cipher */..bi
11120 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  ts = SSL_CIPHER_
11130 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c  get_bits(cipher,
11140 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41   &alg_bits);..LA
11150 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11160 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65  , objPtr, "secre
11170 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a  t_bits", bits);.
11180 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
11190 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c  erp, objPtr, "al
111a0 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61  gorithm_bits", a
111b0 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c  lg_bits);../* al
111c0 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61 6c  g_bits is actual
111d0 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74 73   key secret bits
111e0 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61 6e  . If use bits an
111f0 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69  d secret (algori
11200 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65 72  thm) bits differ
11210 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20 6f  ,..   the rest o
11220 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20 66  f the bits are f
11230 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c  ixed, i.e. for l
11240 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63 69  imited export ci
11250 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35 36  phers (bits < 56
11260 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61  ) */.../* Indica
11270 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c  tes which SSL/TL
11280 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69  S protocol versi
11290 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65 64  on first defined
112a0 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09   the cipher */..
112b0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
112c0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e  rp, objPtr, "min
112d0 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43  _version", SSL_C
112e0 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f  IPHER_get_versio
112f0 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a  n(cipher), -1);.
11300 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20  ../* Cipher NID 
11310 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11320 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11330 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68  "cipherNID", (ch
11340 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
11350 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63  SSL_CIPHER_get_c
11360 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72  ipher_nid(cipher
11370 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
11380 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11390 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44  jPtr, "digestNID
113a0 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
113b0 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
113c0 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28  _get_digest_nid(
113d0 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09  cipher)), -1);..
113e0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
113f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79  rp, objPtr, "key
11400 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63  ExchangeNID", (c
11410 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
11420 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
11430 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  kx_nid(cipher)),
11440 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11450 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11460 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74 69  r, "authenticati
11470 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  onNID", (char *)
11480 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
11490 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e  IPHER_get_auth_n
114a0 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
114b0 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61  ;.../* message a
114c0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f  uthentication co
114d0 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20 41  de - Cipher is A
114e0 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72  EAD (e.g. GCM or
114f0 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33   ChaCha20/Poly13
11500 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f  05) or not */../
11510 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64 20  * Authenticated 
11520 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20  Encryption with 
11530 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 20  associated data 
11540 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a  (AEAD) check */.
11550 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
11560 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
11570 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20  ipher_is_aead", 
11580 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65  SSL_CIPHER_is_ae
11590 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  ad(cipher));.../
115a0 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64 75  * Digest used du
115b0 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53  ring the SSL/TLS
115c0 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20   handshake when 
115d0 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65 72  using the cipher
115e0 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43  . */..md = SSL_C
115f0 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68  IPHER_get_handsh
11600 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68 65  ake_digest(ciphe
11610 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  r);..LAPPEND_STR
11620 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11630 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65   "handshake_dige
11640 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50  st", (char *)EVP
11650 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31  _MD_name(md), -1
11660 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e  );.../* Get Open
11670 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c  SSL-specific ID,
11680 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a   not IANA ID */.
11690 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74  .LAPPEND_INT(int
116a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
116b0 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20  pher_id", (int) 
116c0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69  SSL_CIPHER_get_i
116d0 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
116e0 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65   Two-byte ID use
116f0 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f  d in the TLS pro
11700 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76  tocol of the giv
11710 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  en cipher */..LA
11720 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11730 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f  , objPtr, "proto
11740 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53  col_id", (int) S
11750 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72  SL_CIPHER_get_pr
11760 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72  otocol_id(cipher
11770 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c  ));.../* Textual
11780 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
11790 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69  the cipher */..i
117a0 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65  f (SSL_CIPHER_de
117b0 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72  scription(cipher
117c0 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75  , buf, sizeof(bu
117d0 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  f)) != NULL) {..
117e0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
117f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11800 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62  "description", b
11810 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20  uf, -1);..}.    
11820 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  }..    /* Sessio
11830 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65  n info */.    se
11840 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f  ssion = SSL_get_
11850 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20  session(ssl);.  
11860 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d    if (session !=
11870 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20   NULL) {..const 
11880 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
11890 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c  icket;..size_t l
118a0 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  en2;..unsigned i
118b0 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20  nt ulen;..const 
118c0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
118d0 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74  ession_id, *prot
118e0 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  o;..unsigned cha
118f0 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58  r buffer[SSL_MAX
11900 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
11910 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  TH];.../* Report
11920 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
11930 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
11940 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e  lt of the ALPN n
11950 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53  egotiation */..S
11960 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
11970 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65  alpn_selected(se
11980 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26  ssion, &proto, &
11990 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
119a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
119b0 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
119c0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c  r *) proto, (Tcl
119d0 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
119e0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
119f0 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
11a00 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11a10 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69  he NPN negotiati
11a20 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  on */.#ifdef USE
11a30 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e  _NPN..SSL_get0_n
11a40 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69  ext_proto_negoti
11a50 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f  ated(ssl, &proto
11a60 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
11a70 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11a80 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63  bjPtr, "npn", (c
11a90 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54  har *) proto, (T
11aa0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
11ab0 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75  #endif.../* Resu
11ac0 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f  mable session */
11ad0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
11ae0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11af0 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f  resumable", SSL_
11b00 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d  SESSION_is_resum
11b10 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a  able(session));.
11b20 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61  ../* Session sta
11b30 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73  rt time (seconds
11b40 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f   since epoch) */
11b50 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
11b60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11b70 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f  tart_time", SSL_
11b80 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
11b90 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
11ba0 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d   Timeout value -
11bb0 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d   SSL_CTX_get_tim
11bc0 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  eout (in seconds
11bd0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  ) */..LAPPEND_IN
11be0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11bf0 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c  , "timeout", SSL
11c00 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
11c10 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a  eout(session));.
11c20 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20  ../* Session id 
11c30 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65  - TLSv1.2 and be
11c40 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73  low only */..ses
11c50 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
11c60 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
11c70 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
11c80 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
11c90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11ca0 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73  ession_id", sess
11cb0 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
11cc0 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
11cd0 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  ession context *
11ce0 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
11cf0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
11d00 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73  _id_context(sess
11d10 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
11d20 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
11d30 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11d40 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20  ssion_context", 
11d50 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
11d60 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09  _Size) ulen);...
11d70 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
11d80 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
11d90 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
11da0 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
11db0 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
11dc0 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
11dd0 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
11de0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74  jPtr, "session_t
11df0 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20  icket", ticket, 
11e00 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
11e10 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
11e20 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68  icket lifetime h
11e30 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  int (in seconds)
11e40 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
11e50 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11e60 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c   "lifetime", SSL
11e70 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
11e80 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
11e90 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
11ea0 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
11eb0 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  a */.#if OPENSSL
11ec0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
11ed0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53  < 0x30000000L..S
11ee0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
11ef0 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28  ticket_appdata((
11f00 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73  SSL_SESSION *) s
11f10 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
11f20 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
11f30 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
11f40 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74   objPtr, "ticket
11f50 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b  _app_data", tick
11f60 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
11f70 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f  en2);.#endif.../
11f80 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79  * Get master key
11f90 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f   */..len2 = SSL_
11fa0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74  SESSION_get_mast
11fb0 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20  er_key(session, 
11fc0 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f  buffer, SSL_MAX_
11fd0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
11fe0 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  H);..LAPPEND_BAR
11ff0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12000 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22  tr, "master_key"
12010 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53  , buffer, (Tcl_S
12020 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
12030 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20   Compression id 
12040 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  */..unsigned int
12050 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f   id = SSL_SESSIO
12060 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69  N_get_compress_i
12070 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50  d(session);..LAP
12080 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12090 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
120a0 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d  ssion_id", id ==
120b0 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e   1 ? "zlib" : "n
120c0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
120d0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73  ..    /* Compres
120e0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
120f0 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c   if (ssl != NULL
12100 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ) {.#ifdef HAVE_
12110 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a  SSL_COMPRESSION.
12120 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48  .const COMP_METH
12130 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b  OD *comp, *expn;
12140 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74  ..comp = SSL_get
12150 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73  _current_compres
12160 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e  sion(ssl);..expn
12170 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
12180 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c  nt_expansion(ssl
12190 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  );...LAPPEND_STR
121a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
121b0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
121c0 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  comp ? SSL_COMP_
121d0 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a  get_name(comp) :
121e0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c   "none", -1);..L
121f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12200 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61  p, objPtr, "expa
12210 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53  nsion", expn ? S
12220 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
12230 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c  (expn) : "none",
12240 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50   -1);.#else..LAP
12250 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12260 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12270 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20  ssion", "none", 
12280 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
12290 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
122a0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22  , "expansion", "
122b0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64  none", -1);.#end
122c0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
122d0 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   Server info */.
122e0 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65      {..long mode
122f0 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73   = SSL_CTX_get_s
12300 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
12310 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
12320 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09  ;..char *msg;...
12330 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
12340 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
12350 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66  ..    msg = "off
12360 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12370 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12380 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09  ACHE_CLIENT) {..
12390 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e      msg = "clien
123a0 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  t";..} else if (
123b0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
123c0 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a  CACHE_SERVER) {.
123d0 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76  .    msg = "serv
123e0 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  er";..} else if 
123f0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12400 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09  _CACHE_BOTH) {..
12410 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22      msg = "both"
12420 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
12430 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22   msg = "unknown"
12440 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54  ;..}..LAPPEND_ST
12450 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12460 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  , "session_cache
12470 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29  _mode", msg, -1)
12480 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12490 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f  CA List */.    /
124a0 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65  * IF not a serve
124b0 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67  r, same as SSL_g
124c0 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74  et0_peer_CA_list
124d0 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65  . If server same
124e0 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   as SSL_CTX_get_
124f0 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a  client_CA_list *
12500 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20  /.    listPtr = 
12510 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
12520 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41  , NULL);.    STA
12530 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
12540 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69   *ca_list;.    i
12550 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53  f ((ca_list = SS
12560 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  L_get_client_CA_
12570 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55  list(ssl)) != NU
12580 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66  LL) {..char buff
12590 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72  er[BUFSIZ];..for
125a0 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
125b0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
125c0 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29  m(ca_list); i++)
125d0 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d   {..    X509_NAM
125e0 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30  E *name = sk_X50
125f0 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f  9_NAME_value(ca_
12600 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69  list, i);..    i
12610 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30  f (name) {...X50
12620 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e  9_NAME_oneline(n
12630 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46  ame, buffer, BUF
12640 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  SIZ);...Tcl_List
12650 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12660 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
12670 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12680 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
12690 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
126a0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
126b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
126c0 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50   "caList", listP
126d0 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  tr);.    LAPPEND
126e0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
126f0 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e  Ptr, "caListCoun
12700 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  t", sk_X509_NAME
12710 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a  _num(ca_list));.
12720 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
12730 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
12740 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
12750 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
12760 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
127a0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
127b0 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  sionObjCmd -- re
127c0 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72  turn version str
127d0 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  ing from OpenSSL
127e0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
127f0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
12800 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
12810 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
12820 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
12830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12870 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
12880 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 0a 20  VersionObjCmd(. 
12890 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f     TCL_UNUSED(vo
128a0 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49  id *),.    Tcl_I
128b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
128c0 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 69 6e     TCL_UNUSED(in
128d0 74 29 20 2f 2a 20 6f 62 6a 63 20 2a 2f 2c 0a 20  t) /* objc */,. 
128e0 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 28 54 63     TCL_UNUSED(Tc
128f0 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 29 20  l_Obj *const *) 
12900 2f 2a 20 6f 62 6a 76 20 2a 2f 29 0a 7b 0a 20 20  /* objv */).{.  
12910 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
12920 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
12930 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
12940 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
12950 53 74 72 69 6e 67 4f 62 6a 28 4f 50 45 4e 53 53  StringObj(OPENSS
12960 4c 5f 56 45 52 53 49 4f 4e 5f 54 45 58 54 2c 20  L_VERSION_TEXT, 
12970 2d 31 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  -1);..    Tcl_Se
12980 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
12990 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
129a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
129b0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
12a00 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20  * MiscObjCmd -- 
12a10 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a  misc commands. *
12a20 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
12a30 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
12a40 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
12a50 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
12a60 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
12ab0 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63  .static int.Misc
12ac0 4f 62 6a 43 6d 64 28 0a 20 20 20 20 54 43 4c 5f  ObjCmd(.    TCL_
12ad0 55 4e 55 53 45 44 28 76 6f 69 64 20 2a 29 2c 0a  UNUSED(void *),.
12ae0 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
12af0 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20  interp,.    int 
12b00 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62  objc,.    Tcl_Ob
12b10 6a 09 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j.*const objv[])
12b20 0a 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  .{.    static co
12b30 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e  nst char *comman
12b40 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c  ds [] = { "req",
12b50 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20   "strreq", NULL 
12b60 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d  };.    enum comm
12b70 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53  and { C_REQ, C_S
12b80 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d  TRREQ, C_DUMMY }
12b90 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
12ba0 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 74  md;.    int isSt
12bb0 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75 66 66  r;.    char buff
12bc0 65 72 5b 31 36 33 38 34 5d 3b 0a 0a 20 20 20 20  er[16384];..    
12bd0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
12be0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
12bf0 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
12c00 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
12c10 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
12c20 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
12c30 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12c40 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12c50 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
12c60 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12c70 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
12c80 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26   "command", 0, &
12c90 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
12ca0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
12cb0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
12cc0 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
12cd0 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
12ce0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
12cf0 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
12d00 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
12d10 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
12d20 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
12d30 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
12d40 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
12d50 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
12d60 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
12d70 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
12d80 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
12d90 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69  stv;..    Tcl_Si
12da0 7a 65 20 6c 69 73 74 63 2c 69 3b 0a 0a 09 20 20  ze listc,i;...  
12db0 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b    BIO *out=NULL;
12dc0 0a 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ...    const cha
12dd0 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d  r *k_C="",*k_ST=
12de0 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d  "",*k_L="",*k_O=
12df0 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43  "",*k_OU="",*k_C
12e00 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22  N="",*k_Email=""
12e10 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65 79  ;..    char *key
12e20 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72  out,*pemout,*str
12e30 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73 69  ;..    int keysi
12e40 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79 73  ze,serial=0,days
12e50 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  =365;..#if OPENS
12e60 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
12e70 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
12e80 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65  .    BIGNUM *bne
12e90 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53   = NULL;..    RS
12ea0 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23  A *rsa = NULL;.#
12eb0 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50 4b  else..    EVP_PK
12ec0 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  EY_CTX *ctx = NU
12ed0 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20  LL;.#endif...   
12ee0 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c   if ((objc<5) ||
12ef0 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54   (objc>6)) {...T
12f00 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
12f10 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
12f20 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69 6c   "keysize keyfil
12f30 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f  e certfile ?info
12f40 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43  ?");...return TC
12f50 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
12f60 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  ..    if (Tcl_Ge
12f70 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
12f80 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65  rp, objv[2], &ke
12f90 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b  ysize) != TCL_OK
12fa0 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  ) {...return TCL
12fb0 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
12fc0 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47      keyout=Tcl_G
12fd0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
12fe0 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d 54  );..    pemout=T
12ff0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13000 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20 28  v[4]);..    if (
13010 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53  isStr) {...Tcl_S
13020 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79  etVar(interp,key
13030 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c  out,"",0);...Tcl
13040 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70  _SetVar(interp,p
13050 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20  emout,"",0);..  
13060 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f 62    }...    if (ob
13070 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28 54  jc>=6) {...if (T
13080 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
13090 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62  ments(interp, ob
130a0 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26  jv[5], &listc, &
130b0 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b  listv) != TCL_OK
130c0 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  ) {...    return
130d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
130e0 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32 29  ...if ((listc%2)
130f0 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20 54   != 0) {...    T
13100 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
13110 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e  erp,"Information
13120 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65 20   list must have 
13130 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61  even number of a
13140 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b  rguments",NULL);
13150 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
13160 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66  L_ERROR;...}...f
13170 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63  or (i=0; i<listc
13180 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20  ; i+=2) {...    
13190 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  str=Tcl_GetStrin
131a0 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20  g(listv[i]);... 
131b0 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73 74     if (strcmp(st
131c0 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a  r,"days")==0) {.
131d0 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
131e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
131f0 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73  listv[i+1],&days
13200 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20  )!=TCL_OK)....  
13210 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13220 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  OR;...    } else
13230 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
13240 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a  "serial")==0) {.
13250 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e  ...if (Tcl_GetIn
13260 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
13270 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69  listv[i+1],&seri
13280 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09  al)!=TCL_OK)....
13290 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
132a0 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c  RROR;...    } el
132b0 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
132c0 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"C")==0) {....
132d0 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_C=Tcl_GetStrin
132e0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
132f0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
13300 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22 29  strcmp(str,"ST")
13310 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54  ==0) {....k_ST=T
13320 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
13330 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
13340 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13350 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b  p(str,"L")==0) {
13360 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53  ....k_L=Tcl_GetS
13370 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13380 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13390 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
133a0 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  O")==0) {....k_O
133b0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
133c0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
133d0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
133e0 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30  cmp(str,"OU")==0
133f0 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f  ) {....k_OU=Tcl_
13400 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13410 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
13420 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13430 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09  tr,"CN")==0) {..
13440 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74  ..k_CN=Tcl_GetSt
13450 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13460 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13470 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 45  f (strcmp(str,"E
13480 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  mail")==0) {....
13490 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53  k_Email=Tcl_GetS
134a0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
134b0 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
134c0 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73 75  {....Tcl_SetResu
134d0 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f  lt(interp,"Unkno
134e0 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e 55  wn parameter",NU
134f0 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20 54  LL);....return T
13500 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13510 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69  }...}..    }..#i
13520 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
13530 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
13540 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65 20  00000L..    bne 
13550 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20  = BN_new();..   
13560 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28 29   rsa = RSA_new()
13570 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56  ;..    pkey = EV
13580 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20  P_PKEY_new();.. 
13590 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55     if (bne == NU
135a0 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c  LL || rsa == NUL
135b0 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c  L || pkey == NUL
135c0 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72  L || !BN_set_wor
135d0 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c  d(bne,RSA_F4) ||
135e0 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74 65  ...!RSA_generate
135f0 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65 79  _key_ex(rsa, key
13600 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29  size, bne, NULL)
13610 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61 73   || !EVP_PKEY_as
13620 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72  sign_RSA(pkey, r
13630 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  sa)) {...EVP_PKE
13640 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
13650 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61 29  /* RSA_free(rsa)
13660 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f 50  ; freed by EVP_P
13670 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e  KEY_free */...BN
13680 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73  _free(bne);.#els
13690 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45 56  e..    pkey = EV
136a0 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69 67  P_RSA_gen((unsig
136b0 6e 65 64 20 69 6e 74 29 6b 65 79 73 69 7a 65 29  ned int)keysize)
136c0 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45 56 50  ;..    ctx = EVP
136d0 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b  _PKEY_CTX_new(pk
136e0 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69  ey,NULL);..    i
136f0 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20  f (pkey == NULL 
13700 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c  || ctx == NULL |
13710 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67  | !EVP_PKEY_keyg
13720 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a  en_init(ctx) ||.
13730 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ..!EVP_PKEY_CTX_
13740 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62  set_rsa_keygen_b
13750 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65  its(ctx, keysize
13760 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b  ) || !EVP_PKEY_k
13770 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79  eygen(ctx, &pkey
13780 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  )) {...EVP_PKEY_
13790 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56  free(pkey);...EV
137a0 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28  P_PKEY_CTX_free(
137b0 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54  ctx);.#endif...T
137c0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
137d0 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72  erp,"Error gener
137e0 61 74 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65  ating private ke
137f0 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75  y",NULL);...retu
13800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
13810 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66     } else {...if
13820 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20   (isStr) {...   
13830 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
13840 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20  _s_mem());...   
13850 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50   PEM_write_bio_P
13860 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b  rivateKey(out,pk
13870 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e  ey,NULL,NULL,0,N
13880 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  ULL,NULL);...   
13890 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c   i=BIO_read(out,
138a0 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75  buffer,sizeof(bu
138b0 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20  ffer)-1);...    
138c0 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b  i=(i<0) ? 0 : i;
138d0 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d  ...    buffer[i]
138e0 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c  ='\0';...    Tcl
138f0 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b  _SetVar(interp,k
13900 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b  eyout,buffer,0);
13910 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68  ...    BIO_flush
13920 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  (out);...    BIO
13930 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20  _free(out);...} 
13940 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74  else {...    out
13950 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66  =BIO_new(BIO_s_f
13960 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49  ile());...    BI
13970 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65  O_write_filename
13980 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09  (out,keyout);...
13990 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
139a0 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74  o_PrivateKey(out
139b0 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c  ,pkey,NULL,NULL,
139c0 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09  0,NULL,NULL);...
139d0 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65      /* PEM_write
139e0 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b  _bio_RSAPrivateK
139f0 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c  ey(out, rsa, NUL
13a00 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c  L, NULL, 0, NULL
13a10 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20  , NULL); */...  
13a20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
13a30 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20  ut);.. .}....if 
13a40 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28  ((cert=X509_new(
13a50 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20  ))==NULL) {...  
13a60 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
13a70 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65  interp,"Error ge
13a80 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69 66 69  nerating certifi
13a90 63 61 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55  cate request",NU
13aa0 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  LL);...    EVP_P
13ab0 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
13ac0 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
13ad0 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
13ae0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
13af0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
13b00 64 69 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e  dif...    return
13b10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
13b20 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73  ...X509_set_vers
13b30 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41  ion(cert,2);...A
13b40 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28  SN1_INTEGER_set(
13b50 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e  X509_get_serialN
13b60 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65 72 69  umber(cert),seri
13b70 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  al);...X509_gmti
13b80 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d  me_adj(X509_getm
13b90 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29  _notBefore(cert)
13ba0 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69  ,0);...X509_gmti
13bb0 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d  me_adj(X509_getm
13bc0 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c  _notAfter(cert),
13bd0 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64  (long)60*60*24*d
13be0 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74  ays);...X509_set
13bf0 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65  _pubkey(cert,pke
13c00 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39  y);....name=X509
13c10 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d  _get_subject_nam
13c20 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39  e(cert);....X509
13c30 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
13c40 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c  by_txt(name,"C",
13c50 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
13c60 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
13c70 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20  har *) k_C, -1, 
13c80 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
13c90 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13ca0 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20  _txt(name,"ST", 
13cb0 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63  MBSTRING_ASC, (c
13cc0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
13cd0 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20  ar *) k_ST, -1, 
13ce0 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
13cf0 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13d00 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d  _txt(name,"L", M
13d10 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
13d20 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13d30 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31  r *) k_L, -1, -1
13d40 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
13d50 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13d60 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53  xt(name,"O", MBS
13d70 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13d80 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13d90 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_O, -1, -1, 
13da0 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13db0 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13dc0 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54  (name,"OU", MBST
13dd0 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
13de0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13df0 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_OU, -1, -1, 
13e00 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13e10 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13e20 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54  (name,"CN", MBST
13e30 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74  RING_ASC, (const
13e40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13e50 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20  ) k_CN, -1, -1, 
13e60 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13e70 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13e80 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d  (name,"Email", M
13e90 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
13ea0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13eb0 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31  r *) k_Email, -1
13ec0 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30  , -1, 0);....X50
13ed0 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61  9_set_subject_na
13ee0 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a  me(cert,name);..
13ef0 09 09 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e  ..if (!X509_sign
13f00 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73  (cert,pkey,EVP_s
13f10 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20  ha256())) {...  
13f20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65 72 74    X509_free(cert
13f30 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
13f40 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69  Y_free(pkey);.#i
13f50 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
13f60 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
13f70 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f  00000L...    BN_
13f80 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
13f90 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  f...    Tcl_SetR
13fa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
13fb0 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74  ror signing cert
13fc0 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a  ificate",NULL);.
13fd0 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13fe0 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69  _ERROR;...}....i
13ff0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20  f (isStr) {...  
14000 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
14010 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20  O_s_mem());...  
14020 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
14030 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
14040 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
14050 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
14060 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
14070 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
14080 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
14090 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
140a0 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
140b0 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65  erp,pemout,buffe
140c0 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
140d0 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
140e0 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
140f0 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
14100 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
14110 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
14120 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
14130 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74  ename(out,pemout
14140 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
14150 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c  te_bio_X509(out,
14160 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f  cert);...    BIO
14170 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a  _free_all(out);.
14180 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65  ..}....X509_free
14190 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b  (cert);...EVP_PK
141a0 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23  EY_free(pkey);.#
141b0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
141c0 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
141d0 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65  000000L...BN_fre
141e0 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09  e(bne);.#endif..
141f0 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b      }..}..break;
14200 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62  .    default:..b
14210 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
14220 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
14230 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
14280 2a 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a  * Tls_Free --. *
14290 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
142a0 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
142b0 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
142c0 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
142d0 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
142e0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
142f0 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a  t falls below 1.
14300 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
14310 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
14320 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
14330 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
14340 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
14350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
14390 6f 69 64 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f  oid.#if TCL_MAJO
143a0 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a 54 6c  R_VERSION > 8.Tl
143b0 73 5f 46 72 65 65 28 20 76 6f 69 64 20 2a 62 6c  s_Free( void *bl
143c0 6f 63 6b 50 74 72 20 29 0a 23 65 6c 73 65 0a 54  ockPtr ).#else.T
143d0 6c 73 5f 46 72 65 65 28 20 63 68 61 72 20 2a 62  ls_Free( char *b
143e0 6c 6f 63 6b 50 74 72 20 29 0a 23 65 6e 64 69 66  lockPtr ).#endif
143f0 0a 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  .{.    State *st
14400 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
14410 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20  *)blockPtr;..   
14420 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14430 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  ");..    Tls_Cle
14440 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
14450 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74    ckfree(blockPt
14460 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
14470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14480 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14490 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
144b0 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e  . *. * Tls_Clean
144c0 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
144d0 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
144e0 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
144f0 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
14500 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20  el. *.is closed 
14510 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63  and its referenc
14520 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65  e count falls be
14530 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f  low 1.  This sho
14540 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64  uld. *.be called
14550 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62   synchronously b
14560 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c  y the CloseProc,
14570 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45   not in the. *.E
14580 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61  ventuallyFree ca
14590 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
145a0 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
145b0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
145c0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
145d0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
145e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14620 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f  --. */.void Tls_
14630 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61  Clean(State *sta
14640 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72  tePtr) {.    dpr
14650 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
14660 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77  .    /*.     * w
14670 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65  e're assuming he
14680 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69  re that we're si
14690 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20  ngle-threaded.  
146a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
146b0 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
146c0 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
146d0 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
146e0 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
146f0 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
14700 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
14710 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  imer = NULL;.   
14720 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
14730 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a  ePtr->protos) {.
14740 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72  .ckfree(statePtr
14750 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74  ->protos);..stat
14760 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
14770 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
14780 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  f (statePtr->bio
14790 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c  ) {../* This wil
147a0 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64  l call SSL_shutd
147b0 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35  own. Bug 1414045
147c0 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49   */..dprintf("BI
147d0 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c  O_free_all(%p)",
147e0 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b   statePtr->bio);
147f0 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73  ..BIO_free_all(s
14800 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
14810 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20  statePtr->bio = 
14820 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
14830 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73  if (statePtr->ss
14840 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53  l) {..dprintf("S
14850 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74  SL_free(%p)", st
14860 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
14870 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
14880 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
14890 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
148a0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
148b0 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53  tePtr->ctx) {..S
148c0 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  SL_CTX_free(stat
148d0 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61  ePtr->ctx);..sta
148e0 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c  tePtr->ctx = NUL
148f0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
14900 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
14910 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ack) {..Tcl_Decr
14920 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
14930 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73  r->callback);..s
14940 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
14950 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
14960 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14970 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54  ->password) {..T
14980 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14990 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
149a0 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  rd);..statePtr->
149b0 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b  password = NULL;
149c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
149d0 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b  tatePtr->vcmd) {
149e0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
149f0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  nt(statePtr->vcm
14a00 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76  d);..statePtr->v
14a10 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  cmd = NULL;.    
14a20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
14a30 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c  Returning");.}..
14a40 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
14a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
14a90 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  Tls_Init --. *. 
14aa0 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63 6b  *.This is a pack
14ab0 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  age initializati
14ac0 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77 68  on procedure, wh
14ad0 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a  ich is called. *
14ae0 09 62 79 20 54 63 6c 20 77 68 65 6e 20 74 68 69  .by Tcl when thi
14af0 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f 20  s package is to 
14b00 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20 69  be added to an i
14b10 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20  nterpreter.. *. 
14b20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53 73 6c 20  * Results:  Ssl 
14b30 63 6f 6e 66 69 67 75 72 65 64 20 61 6e 64 20 6c  configured and l
14b40 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53 69 64 65  oaded. *. * Side
14b50 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 63 72   effects:. *. cr
14b60 65 61 74 65 20 74 68 65 20 73 73 6c 20 63 6f 6d  eate the ssl com
14b70 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c 69 7a 65  mand, initialize
14b80 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a 20 2a 0a   ssl context. *.
14b90 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14bd0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64  -----. */..#ifnd
14be0 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23 20 20  ef STRINGIFY.#  
14bf0 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59  define STRINGIFY
14c00 28 78 29 20 53 54 52 49 4e 47 49 46 59 31 28 78  (x) STRINGIFY1(x
14c10 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49  ).#  define STRI
14c20 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23 65 6e  NGIFY1(x) #x.#en
14c30 64 69 66 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73  dif..static cons
14c40 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69  t char tlsTclIni
14c50 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69  tScript[] = {.#i
14c60 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e  nclude "tls.tcl.
14c70 68 22 0a 20 20 20 20 30 78 30 30 0a 7d 3b 0a 0a  h".    0x00.};..
14c80 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
14c90 73 5f 49 6e 69 74 28 0a 20 20 20 20 54 63 6c 5f  s_Init(.    Tcl_
14ca0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 0a  Interp *interp).
14cb0 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66  {.    Tcl_CmdInf
14cc0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 64 70 72  o info;..    dpr
14cd0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
14ce0 0a 09 2f 2a 0a 09 20 2a 20 57 65 20 6f 6e 6c 79  ../*.. * We only
14cf0 20 73 75 70 70 6f 72 74 20 54 63 6c 20 38 2e 36   support Tcl 8.6
14d00 20 6f 72 20 6e 65 77 65 72 0a 09 20 2a 2f 0a 20   or newer.. */. 
14d10 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53     if (Tcl_InitS
14d20 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
14d30 36 2d 22 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29  6-", 0) == NULL)
14d40 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
14d50 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
14d60 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28   if (TlsLibInit(
14d70 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
14d80 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
14d90 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
14da0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20   not initialize 
14db0 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63  SSL library", (c
14dc0 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65  har *)NULL);..re
14dd0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14de0 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
14df0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
14e00 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 69  interp, "tls::ci
14e10 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73 4f  phers", CiphersO
14e20 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b  bjCmd, NULL, 0);
14e30 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
14e40 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
14e50 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69  , "tls::connecti
14e60 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49  on", ConnectionI
14e70 6e 66 6f 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c  nfoObjCmd, NULL,
14e80 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65   0);.    Tcl_Cre
14e90 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
14ea0 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 61 6e 64  terp, "tls::hand
14eb0 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61 6b  shake", Handshak
14ec0 65 4f 62 6a 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30  eObjCmd, NULL, 0
14ed0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
14ee0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
14ef0 72 70 2c 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74  rp, "tls::import
14f00 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c  ", ImportObjCmd,
14f10 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54   NULL, 0);.    T
14f20 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
14f30 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
14f40 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
14f50 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 4e 55 4c  mportObjCmd, NUL
14f60 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c 5f 43  L, 0);.    Tcl_C
14f70 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
14f80 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 74  interp, "tls::st
14f90 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62 6a  atus", StatusObj
14fa0 43 6d 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20  Cmd, NULL, 0);. 
14fb0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
14fc0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
14fd0 22 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20  "tls::version", 
14fe0 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 4e  VersionObjCmd, N
14ff0 55 4c 4c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ULL, 0);.    Tcl
15000 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
15010 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15020 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d  misc", MiscObjCm
15030 64 2c 20 4e 55 4c 4c 2c 20 30 29 3b 0a 20 20 20  d, NULL, 0);.   
15040 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15050 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15060 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 2c 20  ls::protocols", 
15070 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c  ProtocolsObjCmd,
15080 20 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 20 20 20 20   NULL, 0);..    
15090 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 69  if (interp) {..i
150a0 66 20 28 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65  f (Tcl_Eval(inte
150b0 72 70 2c 20 74 6c 73 54 63 6c 49 6e 69 74 53 63  rp, tlsTclInitSc
150c0 72 69 70 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  ript) != TCL_OK)
150d0 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54   {..    return T
150e0 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
150f0 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f   }..    if (Tcl_
15100 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
15110 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62  nterp, "::tcl::b
15120 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66  uild-info", &inf
15130 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74  o)) {..Tcl_Creat
15140 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
15150 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c  rp, "::tls::buil
15160 64 2d 69 6e 66 6f 22 2c 0a 09 09 69 6e 66 6f 2e  d-info",...info.
15170 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a  objProc, (void *
15180 29 28 0a 09 09 20 20 20 20 50 41 43 4b 41 47 45  )(...    PACKAGE
15190 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52  _VERSION "+" STR
151a0 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49  INGIFY(TLS_VERSI
151b0 4f 4e 5f 55 55 49 44 29 0a 09 09 09 20 20 20 20  ON_UUID)....    
151c0 22 2e 62 6f 68 61 67 61 6e 22 0a 23 69 66 20 64  ".bohagan".#if d
151d0 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f  efined(__clang__
151e0 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63  ) && defined(__c
151f0 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09  lang_major__)...
15200 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53  .    ".clang-" S
15210 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67  TRINGIFY(__clang
15220 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f  _major__).#if __
15230 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20  clang_minor__ < 
15240 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65  10....    "0".#e
15250 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49  ndif....    STRI
15260 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69  NGIFY(__clang_mi
15270 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  nor__).#endif.#i
15280 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
15290 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e  splus) && !defin
152a0 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09  ed(__OBJC__)....
152b0 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22      ".cplusplus"
152c0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
152d0 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e  NDEBUG....    ".
152e0 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69  debug".#endif.#i
152f0 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  f !defined(__cla
15300 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  ng__) && !define
15310 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  d(__INTEL_COMPIL
15320 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  ER) && defined(_
15330 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20  _GNUC__)....    
15340 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46  ".gcc-" STRINGIF
15350 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20  Y(__GNUC__).#if 
15360 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c  __GNUC_MINOR__ <
15370 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
15380 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
15390 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49  INGIFY(__GNUC_MI
153a0 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69  NOR__).#endif.#i
153b0 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d  fdef __INTEL_COM
153c0 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69  PILER....    ".i
153d0 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
153e0 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
153f0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54  .#endif.#ifdef T
15400 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09  CL_MEM_DEBUG....
15410 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a      ".memdebug".
15420 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
15430 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09  ed(_MSC_VER)....
15440 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52      ".msvc-" STR
15450 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29  INGIFY(_MSC_VER)
15460 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55  .#endif.#ifdef U
15470 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20  SE_NMAKE....    
15480 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a  ".nmake".#endif.
15490 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f  #ifndef TCL_CFG_
154a0 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20  OPTIMIZED....   
154b0 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a   ".no-optimize".
154c0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f  #endif.#ifdef __
154d0 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e  OBJC__....    ".
154e0 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66  objective-c".#if
154f0 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
15500 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c  plus)....    "pl
15510 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23  usplus".#endif.#
15520 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c  endif.#ifdef TCL
15530 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09  _CFG_PROFILED...
15540 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a  .    ".profile".
15550 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55  #endif.#ifdef PU
15560 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75  RIFY....    ".pu
15570 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66  rify".#endif.#if
15580 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44  def STATIC_BUILD
15590 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63  ....    ".static
155a0 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55  ".#endif...), NU
155b0 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
155c0 72 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72  return Tcl_PkgPr
155d0 6f 76 69 64 65 45 78 28 69 6e 74 65 72 70 2c 20  ovideEx(interp, 
155e0 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41  PACKAGE_NAME, PA
155f0 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 2c 20 4e  CKAGE_VERSION, N
15600 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  ULL);.}../*. *--
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15640 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f  ----*. *. *.Tls_
15650 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20  SafeInit --. *. 
15660 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
15670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15690 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20  --*. *.Standard 
156a0 70 72 6f 63 65 64 75 72 65 20 72 65 71 75 69 72  procedure requir
156b0 65 64 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a  ed by 'load'.. *
156c0 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69  .Initializes thi
156d0 73 20 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20  s extension for 
156e0 61 20 73 61 66 65 20 69 6e 74 65 72 70 72 65 74  a safe interpret
156f0 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  er.. *.---------
15700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15720 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53  -------*. *. *.S
15730 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
15740 09 41 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74  .As of 'Tls_Init
15750 27 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a  '. *. *.Result:.
15760 20 2a 09 09 41 20 73 74 61 6e 64 61 72 64 20 54   *..A standard T
15770 63 6c 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  cl error code.. 
15780 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
157c0 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54  .DLLEXPORT int T
157d0 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  ls_SafeInit(Tcl_
157e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
157f0 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  {.    dprintf("C
15800 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74  alled");.    ret
15810 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74  urn Tls_Init(int
15820 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  erp);.}../*. *--
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15860 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c  ----*. *. *.TlsL
15870 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  ibInit --. *. *.
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  *. *.Initializes
158c0 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63   SSL library onc
158d0 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f  e per applicatio
158e0 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *.-----------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15910 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
15920 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 69  e effects:. *..i
15930 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
15940 69 62 72 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73  ibrary. *. *.Res
15950 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a  ult:. *..none. *
15960 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73  ---------*. */.s
159a0 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62  tatic int TlsLib
159b0 49 6e 69 74 28 69 6e 74 20 75 6e 69 6e 69 74 69  Init(int uniniti
159c0 61 6c 69 7a 65 29 20 7b 0a 20 20 20 20 73 74 61  alize) {.    sta
159d0 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c 69  tic int initiali
159e0 7a 65 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zed = 0;.    int
159f0 20 73 74 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b   status = TCL_OK
15a00 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ;.#if defined(OP
15a10 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15a20 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15a30 52 45 41 44 53 29 0a 20 20 20 20 73 69 7a 65 5f  READS).    size_
15a40 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e  t num_locks;.#en
15a50 64 69 66 0a 0a 20 20 20 20 69 66 20 28 75 6e 69  dif..    if (uni
15a60 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66  nitialize) {..if
15a70 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20   (!initialized) 
15a80 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
15a90 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
15aa0 61 6c 69 7a 65 2c 20 62 75 74 20 77 65 20 61 72  alize, but we ar
15ab0 65 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65  e not initialize
15ac0 64 22 29 3b 0a 0a 09 20 20 20 20 72 65 74 75 72  d");...    retur
15ad0 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64  n TCL_OK;..}...d
15ae0 70 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f  printf("Asked to
15af0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b   uninitialize");
15b00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
15b10 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15b20 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15b30 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65  READS)..Tcl_Mute
15b40 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b  xLock(&init_mx);
15b50 0a 0a 09 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a  ...if (locks) {.
15b60 09 20 20 20 20 66 72 65 65 28 6c 6f 63 6b 73 29  .    free(locks)
15b70 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e  ;..    locks = N
15b80 55 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43  ULL;..    locksC
15b90 6f 75 6e 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e  ount = 0;..}.#en
15ba0 64 69 66 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64  dif..initialized
15bb0 20 3d 20 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e   = 0;..#if defin
15bc0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15bd0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15be0 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
15bf0 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e  _MutexUnlock(&in
15c00 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a  it_mx);.#endif..
15c10 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a  .return TCL_OK;.
15c20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 69      }..    if (i
15c30 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64  nitialized) {..d
15c40 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20  printf("Called, 
15c50 62 75 74 20 75 73 69 6e 67 20 63 61 63 68 65 64  but using cached
15c60 20 76 61 6c 75 65 22 29 3b 0a 09 72 65 74 75 72   value");..retur
15c70 6e 20 73 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a  n status;.    }.
15c80 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
15c90 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66  lled");..#if def
15ca0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
15cb0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
15cc0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
15cd0 20 20 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28    Tcl_MutexLock(
15ce0 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
15cf0 66 0a 20 20 20 20 69 6e 69 74 69 61 6c 69 7a 65  f.    initialize
15d00 64 20 3d 20 31 3b 0a 0a 23 69 66 20 64 65 66 69  d = 1;..#if defi
15d10 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15d20 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15d30 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20  TCL_THREADS).   
15d40 20 6e 75 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a   num_locks = 1;.
15d50 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d      locksCount =
15d60 20 28 69 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73   (int) num_locks
15d70 3b 0a 20 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61  ;.    locks = ma
15d80 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63  lloc(sizeof(*loc
15d90 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29  ks) * num_locks)
15da0 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63  ;.    memset(loc
15db0 6b 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c  ks, 0, sizeof(*l
15dc0 6f 63 6b 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b  ocks) * num_lock
15dd0 73 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  s);.#endif..    
15de0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f  /* Initialize BO
15df0 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64  TH libcrypto and
15e00 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20   libssl. */.    
15e10 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c  OPENSSL_init_ssl
15e20 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f  (OPENSSL_INIT_LO
15e30 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c  AD_SSL_STRINGS |
15e40 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f   OPENSSL_INIT_LO
15e50 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47  AD_CRYPTO_STRING
15e60 53 0a 09 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  S..| OPENSSL_INI
15e70 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52  T_ADD_ALL_CIPHER
15e80 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
15e90 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53  _ADD_ALL_DIGESTS
15ea0 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49  , NULL);..    BI
15eb0 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20  O_new_tcl(NULL, 
15ec0 30 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  0);..#if defined
15ed0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
15ee0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
15ef0 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54 63  _THREADS).    Tc
15f00 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26 69  l_MutexUnlock(&i
15f10 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a  nit_mx);.#endif.
15f20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74  .    return stat
15f30 75 73 3b 0a 7d 0a                                us;.}.