0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0370: 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69  de <stdlib.h>.#i
0380: 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f  nclude <openssl/
0390: 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75  crypto.h>.#inclu
03a0: 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73 6c 2e  de <openssl/ssl.
03b0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03c0: 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e 63  nssl/evp.h>.#inc
03d0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 6f 62  lude <openssl/ob
03e0: 6a 65 63 74 73 2e 68 3e 0a 23 69 6e 63 6c 75 64  jects.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64  ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a  eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79  .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79  , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68  ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09  ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69  .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28  leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73  key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43  tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63  , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75  har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64  y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31   char *cert_asn1
05c0: 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73 6e 31  ,...int key_asn1
05d0: 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 61  _len, int cert_a
05e0: 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20 2a 43  sn1_len, char *C
05f0: 41 70 61 74 68 2c 20 63 68 61 72 20 2a 43 41 66  Apath, char *CAf
0600: 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63 69 70  ile,...char *cip
0610: 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70 68  hers, char *ciph
0620: 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c 65  ersuites, int le
0630: 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61 72  vel, char *DHpar
0640: 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e  ams);..static in
0650: 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74  t.TlsLibInit(int
0660: 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b 0a   uninitialize);.
0670: 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f  .#define TLS_PRO
0680: 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64  TO_SSL2..0x01.#d
0690: 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f  efine TLS_PROTO_
06a0: 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69  SSL3..0x02.#defi
06b0: 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  ne TLS_PROTO_TLS
06c0: 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20  1..0x04.#define 
06d0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
06e0: 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c  .0x08.#define TL
06f0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30  S_PROTO_TLS1_2.0
0700: 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f  x10.#define TLS_
0710: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32  PROTO_TLS1_3.0x2
0720: 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45  0.#define ENABLE
0730: 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28  D(flag, mask).((
0740: 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29  (flag) & (mask))
0750: 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65   == (mask))..#de
0760: 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49  fine SSLKEYLOGFI
0770: 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49  LE.."SSLKEYLOGFI
0780: 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65 61  LE"../*. * Threa
0790: 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 65 0a  d-Safe TLS Code.
07a0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f   */..#ifdef TCL_
07b0: 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65 20  THREADS.#define 
07c0: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f 44  OPENSSL_THREAD_D
07d0: 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65 20  EFINES.#include 
07e0: 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73 6c  <openssl/openssl
07f0: 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66 20  conf.h>..#ifdef 
0800: 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 0a  OPENSSL_THREADS.
0810: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73  #include <openss
0820: 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e 63  l/crypto.h>.#inc
0830: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73 73  lude <openssl/ss
0840: 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65  l.h>../*. * Thre
0850: 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 20 72  aded operation r
0860: 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e 67 20  equires locking 
0870: 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 61 73  callbacks. * Bas
0880: 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 6f 2f  ed from /crypto/
0890: 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 4f 70  cryptlib.c of Op
08a0: 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 65 6e  enSSL and NSOpen
08b0: 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  SSL.. */..static
08c0: 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63 6b   Tcl_Mutex *lock
08d0: 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69 63  s = NULL;.static
08e0: 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e 74 20   int locksCount 
08f0: 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 6c 5f  = 0;.static Tcl_
0900: 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b 0a 23  Mutex init_mx;.#
0910: 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53 4c  endif /* OPENSSL
0920: 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e 64  _THREADS */.#end
0930: 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41 44  if /* TCL_THREAD
0940: 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  S */..../*******
0950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
0960: 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20  * Callbacks     
0970: 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
0980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
0990: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
09a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
09d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61  ------. *. * Eva
09e0: 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61  l Callback Comma
09f0: 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c  nd --. *. *.Eval
0a00: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
0a10: 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20  d and catch any 
0a20: 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73  errors. *. * Res
0a30: 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d  ults:. *.0 = Com
0a40: 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61  mand returned fa
0a50: 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72  il or eval retur
0a60: 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a  ned TCL_ERROR. *
0a70: 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74  .1 = Command ret
0a80: 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72  urned success or
0a90: 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54   eval returned T
0aa0: 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65  CL_OK. *. * Side
0ab0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61   effects:. *.Eva
0ac0: 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20  luates callback 
0ad0: 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d  command. *. *---
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
0b30: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c  EvalCallback(Tcl
0b40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0b50: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
0b60: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74  , Tcl_Obj *cmdPt
0b70: 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64  r) {.    int cod
0b80: 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20  e, ok = 0;..    
0b90: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
0ba0: 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73  );..    Tcl_Pres
0bb0: 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61  erve((ClientData
0bc0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  ) interp);.    T
0bd0: 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69  cl_Preserve((Cli
0be0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
0bf0: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  r);..    /* Eval
0c00: 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73   callback with s
0c10: 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72  uccess for ok or
0c20: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c   return value 1,
0c30: 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20   fail for error 
0c40: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  or return value 
0c50: 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73  0 */.    Tcl_Res
0c60: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
0c70: 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c  ;.    code = Tcl
0c80: 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
0c90: 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45  p, cmdPtr, TCL_E
0ca0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20  VAL_GLOBAL);.   
0cb0: 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61   dprintf("EvalCa
0cc0: 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64  llback: %d", cod
0cd0: 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65  e);.    if (code
0ce0: 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f   == TCL_OK) {../
0cf0: 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66  * Check result f
0d00: 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  or return value 
0d10: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73  */..Tcl_Obj *res
0d20: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
0d30: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0d40: 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e  .if (result == N
0d50: 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  ULL || Tcl_GetIn
0d60: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
0d70: 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d   result, &ok) !=
0d80: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
0d90: 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69  ok = 1;..}..dpri
0da0: 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22  ntf("Result: %d"
0db0: 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73  , ok);.    } els
0dc0: 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20  e {../* Error - 
0dd0: 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74 69  reject the certi
0de0: 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e  ficate */..dprin
0df0: 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75  tf("Tcl_Backgrou
0e00: 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28  ndError");.#if (
0e10: 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f  TCL_MAJOR_VERSIO
0e20: 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f  N == 8) && (TCL_
0e30: 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20  MINOR_VERSION < 
0e40: 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75  6)..Tcl_Backgrou
0e50: 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ndError(interp);
0e60: 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b  .#else..Tcl_Back
0e70: 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28  groundException(
0e80: 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23  interp, code);.#
0e90: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
0ea0: 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c   Tcl_Release((Cl
0eb0: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
0ec0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c  tr);.    Tcl_Rel
0ed0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
0ee0: 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72  ) interp);.    r
0ef0: 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a  eturn ok;.}.../*
0f00: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66  ------. *. * Inf
0f50: 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  oCallback --. *.
0f60: 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20   *.Monitors SSL 
0f70: 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65  connection proce
0f80: 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ss. *. * Results
0f90: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
0fa0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
0fb0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
0fc0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
0fd0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
1020: 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61   void.InfoCallba
1030: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
1040: 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e  l, int where, in
1050: 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61  t ret) {.    Sta
1060: 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28  te *statePtr = (
1070: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
1080: 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73  pp_data((SSL *)s
1090: 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  sl);.    Tcl_Int
10a0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
10b0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
10c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
10d0: 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d  Ptr;.    char *m
10e0: 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e 6f  ajor; char *mino
10f0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
1100: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
1110: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
1120: 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f  llback == (Tcl_O
1130: 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75 72  bj*)NULL)..retur
1140: 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72  n;..    if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
1160: 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09 6d  HAKE_START) {..m
1170: 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b  ajor = "handshak
1180: 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73 74  e";..minor = "st
1190: 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65  art";.    } else
11a0: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
11b0: 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44 4f  _CB_HANDSHAKE_DO
11c0: 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22  NE) {..major = "
11d0: 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e  handshake";..min
11e0: 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20 20  or = "done";.   
11f0: 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 77   } else {..if (w
1200: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c  here & SSL_CB_AL
1210: 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61  ERT)..major = "a
1220: 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66 20  lert";..else if 
1230: 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54 5f  (where & SSL_ST_
1240: 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20 3d  CONNECT).major =
1250: 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c 73   "connect";..els
1260: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1270: 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d 61  L_ST_ACCEPT)..ma
1280: 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b 0a  jor = "accept";.
1290: 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72 20  .else.....major 
12a0: 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09 69  = "unknown";...i
12b0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12c0: 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20 3d  B_READ)..minor =
12d0: 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20 69   "read";..else i
12e0: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
12f0: 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72 20  B_WRITE)..minor 
1300: 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73 65  = "write";..else
1310: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
1320: 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f 72  _CB_LOOP)..minor
1330: 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73 65   = "loop";..else
1340: 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c   if (where & SSL
1350: 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f 72  _CB_EXIT)..minor
1360: 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73 65   = "exit";..else
1370: 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75 6e  .....minor = "un
1380: 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20  known";.    }.. 
1390: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
13a0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
13b0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 6d 61 6a 6f  h fn, chan, majo
13c0: 72 2c 20 6d 69 6e 6f 72 2c 20 6d 65 73 73 61 67  r, minor, messag
13d0: 65 2c 20 61 6e 64 20 74 79 70 65 20 61 72 67 73  e, and type args
13e0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
13f0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1400: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1410: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1420: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1430: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1440: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1450: 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29  gObj("info", -1)
1460: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1470: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
1480: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
1490: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
14a0: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
14b0: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
14c0: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
14d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
14e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14f0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
1500: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61  _NewStringObj(ma
1510: 6a 6f 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  jor, -1));.    T
1520: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1530: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1540: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
1550: 74 72 69 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20  tringObj(minor, 
1560: 2d 31 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 77  -1));..    if (w
1570: 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c  here & SSL_CB_AL
1580: 45 52 54 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  ERT) {..Tcl_List
1590: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
15a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
15b0: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
15c0: 69 6e 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74  ingObj(SSL_alert
15d0: 5f 64 65 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e  _desc_string_lon
15e0: 67 28 72 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54  g(ret), -1));..T
15f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1600: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
1610: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
1620: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1630: 4c 5f 61 6c 65 72 74 5f 74 79 70 65 5f 73 74 72  L_alert_type_str
1640: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d  ing_long(ret), -
1650: 31 29 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  1));.    } else 
1660: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
1670: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
1680: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
1690: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16a0: 6a 28 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69  j(SSL_state_stri
16b0: 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31  ng_long(ssl), -1
16c0: 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ));..Tcl_ListObj
16d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
16e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
16f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1700: 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20  info", -1));.   
1710: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20   }..    /* Eval 
1720: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
1730: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
1740: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
1750: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
1760: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
1770: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
1780: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
1790: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a  nt(cmdPtr);.}...
17a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d  --------. *. * M
17f0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d  essageCallback -
1800: 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73  -. *. *.Monitors
1810: 20 53 53 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65   SSL protocol me
1820: 73 73 61 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73  ssages. *. * Res
1830: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
1840: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
1850: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
1860: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
1870: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69  ---------. */.#i
18c0: 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f  fndef OPENSSL_NO
18d0: 5f 53 53 4c 5f 54 52 41 43 45 0a 73 74 61 74 69  _SSL_TRACE.stati
18e0: 63 20 76 6f 69 64 0a 4d 65 73 73 61 67 65 43 61  c void.MessageCa
18f0: 6c 6c 62 61 63 6b 28 69 6e 74 20 77 72 69 74 65  llback(int write
1900: 5f 70 2c 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c  _p, int version,
1910: 20 69 6e 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70   int content_typ
1920: 65 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62  e, const void *b
1930: 75 66 2c 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20  uf, size_t len, 
1940: 53 53 4c 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a  SSL *ssl, void *
1950: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
1960: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
1970: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
1980: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1990: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
19a0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
19b0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 68   *cmdPtr;.    ch
19c0: 61 72 20 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a  ar *ver, *type;.
19d0: 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20      BIO *bio;.  
19e0: 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 33 30    char buffer[30
19f0: 30 30 30 5d 3b 0a 20 20 20 20 62 75 66 66 65 72  000];.    buffer
1a00: 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70  [0] = 0;..    dp
1a10: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
1a20: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
1a30: 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20  tr->callback == 
1a40: 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a  (Tcl_Obj*)NULL).
1a50: 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77  .return;..    sw
1a60: 69 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a  itch(version) {.
1a70: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
1a80: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
1a90: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
1aa0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
1ab0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
1ac0: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
1ad0: 61 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e  ase SSL2_VERSION
1ae0: 3a 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22  :..ver = "SSLv2"
1af0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
1b00: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
1b10: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
1b20: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
1b30: 4c 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c  L3).    case SSL
1b40: 33 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20  3_VERSION:..ver 
1b50: 3d 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61  = "SSLv3";..brea
1b60: 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  k;.#endif.    ca
1b70: 73 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a  se TLS1_VERSION:
1b80: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b  ..ver = "TLSv1";
1b90: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1ba0: 65 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e  e TLS1_1_VERSION
1bb0: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1bc0: 31 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  1";..break;.    
1bd0: 63 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53  case TLS1_2_VERS
1be0: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1bf0: 76 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.2";..break;. 
1c00: 20 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56     case TLS1_3_V
1c10: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1c20: 54 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b  TLSv1.3";..break
1c30: 3b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76  ;.    case 0:..v
1c40: 65 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72  er = "none";..br
1c50: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1c60: 3a 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77  :..ver = "unknow
1c70: 6e 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  n";..break;.    
1c80: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63  }..    switch (c
1c90: 6f 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20  ontent_type) {. 
1ca0: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1cb0: 48 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20  HEADER:..type = 
1cc0: 22 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b  "Header";..break
1cd0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1ce0: 52 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54  RT_INNER_CONTENT
1cf0: 5f 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22  _TYPE:..type = "
1d00: 49 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79  Inner Content Ty
1d10: 70 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  pe";..break;.   
1d20: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48   case SSL3_RT_CH
1d30: 41 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43  ANGE_CIPHER_SPEC
1d40: 3a 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67  :..type = "Chang
1d50: 65 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61  e Cipher";..brea
1d60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1d70: 5f 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65  _RT_ALERT:..type
1d80: 20 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65   = "Alert";..bre
1d90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c  ak;.    case SSL
1da0: 33 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a  3_RT_HANDSHAKE:.
1db0: 09 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61  .type = "Handsha
1dc0: 6b 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ke";..break;.   
1dd0: 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50   case SSL3_RT_AP
1de0: 50 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a  PLICATION_DATA:.
1df0: 09 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74  .type = "App Dat
1e00: 61 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20  a";..break;.#if 
1e10: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
1e20: 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
1e30: 30 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54  000L.    case DT
1e40: 4c 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54  LS1_RT_HEARTBEAT
1e50: 3a 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74  :..type = "Heart
1e60: 62 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23  beat";..break;.#
1e70: 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c  endif.    defaul
1e80: 74 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e  t:..type = "unkn
1e90: 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  own";.    }..   
1ea0: 20 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c   /* Needs compil
1eb0: 65 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65  e time option "e
1ec0: 6e 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22  nable-ssl-trace"
1ed0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69  . */.    if ((bi
1ee0: 6f 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  o = BIO_new(BIO_
1ef0: 73 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c  s_mem())) != NUL
1f00: 4c 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53  L) {..int n;..SS
1f10: 4c 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c  L_trace(write_p,
1f20: 20 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e   version, conten
1f30: 74 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e  t_type, buf, len
1f40: 2c 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62  , ssl, (void *)b
1f50: 69 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65  io);..n = BIO_re
1f60: 61 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20  ad(bio, buffer, 
1f70: 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29  BIO_pending(bio)
1f80: 20 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70   < 15000 ? BIO_p
1f90: 65 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34  ending(bio) : 14
1fa0: 39 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29  999);..n = (n<0)
1fb0: 20 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65   ? 0 : n;..buffe
1fc0: 72 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64  r[n] = 0;..(void
1fd0: 29 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b  )BIO_flush(bio);
1fe0: 0a 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b  ..BIO_free(bio);
1ff0: 0a 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72  .   }..    /* Cr
2000: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
2010: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
2020: 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 76  an, direction, v
2030: 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20 61 6e  ersion, type, an
2040: 64 20 6d 65 73 73 61 67 65 20 61 72 67 73 20 2a  d message args *
2050: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
2060: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2070: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
2080: 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  ck);.    Tcl_Lis
2090: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
20a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
20b0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
20c0: 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20 2d 31  bj("message", -1
20d0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
20e0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
20f0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2100: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
2120: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
2130: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
2140: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2150: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2160: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
2170: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 77  l_NewStringObj(w
2180: 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74 22 20  rite_p ? "Sent" 
2190: 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20 2d 31  : "Received", -1
21a0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
21b0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
21c0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
21d0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
21e0: 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20 20 20  j(ver, -1));.   
21f0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2200: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2210: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2220: 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70 65 2c  wStringObj(type,
2230: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2240: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2250: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2260: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2270: 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
2280: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
2290: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
22a0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
22b0: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
22c0: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
22d0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
22e0: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
22f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2300: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 23 65  nt(cmdPtr);.}.#e
2310: 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ndif.../*. *----
2320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2360: 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61 6c 6c   *. * VerifyCall
2370: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f  back --. *. *.Mo
2380: 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72 74 69  nitors SSL certi
2390: 66 69 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f  ficate validatio
23a0: 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65 64 20  n process. Used 
23b0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65 0a 20  to control the. 
23c0: 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65 6e 20  *.behavior when 
23d0: 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  the SSL_VERIFY_P
23e0: 45 45 52 20 66 6c 61 67 20 69 73 20 73 65 74 2e  EER flag is set.
23f0: 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 0a   This is called.
2400: 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20 63 65   *.whenever a ce
2410: 72 74 69 66 69 63 61 74 65 20 69 73 20 69 6e 73  rtificate is ins
2420: 70 65 63 74 65 64 20 6f 72 20 64 65 63 69 64 65  pected or decide
2430: 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c 6c 65  d invalid. Calle
2440: 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20 63 65  d for. *.each ce
2450: 72 74 69 66 69 63 61 74 65 20 69 6e 20 74 68 65  rtificate in the
2460: 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20 2a 0a   cert chain.. *.
2470: 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09 54 68   * Checks:. *.Th
2480: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 63 68  e certificate ch
2490: 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73  ain is checked s
24a0: 74 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65  tarting with the
24b0: 20 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67   deepest nesting
24c0: 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65   level. *.  (the
24d0: 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69   root CA certifi
24e0: 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64  cate) and worked
24f0: 20 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70   upward to the p
2500: 65 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74  eer's certificat
2510: 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74  e.. *.All signat
2520: 75 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20  ures are valid, 
2530: 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20  current time is 
2540: 77 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64  within first and
2550: 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74   last validity t
2560: 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68  ime.. *.Check th
2570: 61 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61  at the certifica
2580: 74 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20  te is issued by 
2590: 74 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69  the issuer certi
25a0: 66 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20  ficate issuer.. 
25b0: 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f  *.Check the revo
25c0: 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f  cation status fo
25d0: 72 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61  r each certifica
25e0: 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65  te.. *.Check the
25f0: 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65   validity of the
2600: 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74   given CRL and t
2610: 68 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69  he cert revocati
2620: 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68  on status.. *.Ch
2630: 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73  eck the policies
2640: 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74   of all the cert
2650: 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41  ificates. *. * A
2660: 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79  rgs. *.preverify
2670: 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68  _ok indicates wh
2680: 65 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66  ether the certif
2690: 69 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69  icate verificati
26a0: 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72  on passed (1) or
26b0: 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52   not (0). *. * R
26c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c  esults:. *.A cal
26d0: 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74  lback bound to t
26e0: 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65  he socket may re
26f0: 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09  turn one of:. *.
2700: 20 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65      0...- the ce
2710: 72 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65  rtificate is dee
2720: 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e  med invalid, sen
2730: 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20  d verification. 
2740: 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61  *....  failure a
2750: 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e  lert to peer, an
2760: 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64  d terminate hand
2770: 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09  shake.. *.    1.
2780: 09 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63  ..- the certific
2790: 61 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61  ate is deemed va
27a0: 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69  lid, continue wi
27b0: 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a  th handshake.. *
27c0: 09 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e  .    empty strin
27d0: 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f  g.- no change to
27e0: 20 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c   certificate val
27f0: 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69  idation. *. * Si
2800: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54  de effects:. *.T
2810: 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20  he err field of 
2820: 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  the currently op
2830: 65 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73  erative State is
2840: 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73   set. *.  to a s
2850: 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67  tring describing
2860: 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61   the SSL negotia
2870: 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61  tion failure rea
2880: 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  son. *. *-------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
28c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
28d0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69  .static int.Veri
28e0: 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f  fyCallback(int o
28f0: 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  k, X509_STORE_CT
2900: 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63  X *ctx) {.    Tc
2910: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
2920: 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 20 3d 20     SSL   *ssl = 
2930: 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45  (SSL*)X509_STORE
2940: 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61  _CTX_get_ex_data
2950: 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78  (ctx, SSL_get_ex
2960: 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45  _data_X509_STORE
2970: 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20  _CTX_idx());.   
2980: 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20   X509  *cert..= 
2990: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
29a0: 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28  et_current_cert(
29b0: 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20  ctx);.    State 
29c0: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
29d0: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
29e0: 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54  data(ssl);.    T
29f0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a00: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
2a10: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65  terp;.    int de
2a20: 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  pth..= X509_STOR
2a30: 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f  E_CTX_get_error_
2a40: 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20  depth(ctx);.    
2a50: 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f  int err..= X509_
2a60: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72  STORE_CTX_get_er
2a70: 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64  ror(ctx);..    d
2a80: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
2a90: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ;.    dprintf("V
2aa0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25  erifyCallback: %
2ab0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
2ac0: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
2ad0: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
2ae0: 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b  LL) {../* Use ok
2af0: 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 69   value if verifi
2b00: 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  cation is requir
2b10: 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65  ed */..if (state
2b20: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2b30: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2b40: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2b50: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2b60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2b70: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2b80: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74   } else if (cert
2b90: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20   == NULL || ssl 
2ba0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
2bb0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
2bc0: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2bd0: 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63  Callback: eval c
2be0: 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20  allback");..    
2bf0: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
2c00: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
2c10: 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20  n, chan, depth, 
2c20: 63 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20  cert info list, 
2c30: 73 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f  status, and erro
2c40: 72 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d  r args */.    cm
2c50: 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  dPtr = Tcl_Dupli
2c60: 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72  cateObj(statePtr
2c70: 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c  ->vcmd);.    Tcl
2c80: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c90: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2ca0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2cb0: 69 6e 67 4f 62 6a 28 22 76 65 72 69 66 79 22 2c  ingObj("verify",
2cc0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2cd0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2ce0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2cf0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69  tr,..Tcl_NewStri
2d00: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
2d10: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
2d20: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
2d30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2d40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2d50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2d60: 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65 70 74 68  _NewIntObj(depth
2d70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2d80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2d90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2da0: 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28   Tls_NewX509Obj(
2db0: 69 6e 74 65 72 70 2c 20 63 65 72 74 29 29 3b 0a  interp, cert));.
2dc0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2dd0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2de0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2df0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b  _NewIntObj(ok));
2e00: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2e10: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2e20: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
2e30: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2e40: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69  (char*)X509_veri
2e50: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
2e60: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
2e70: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74  ..    /* Prevent
2e80: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62   I/O while callb
2e90: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ack is in progre
2ea0: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61  ss */.    /* sta
2eb0: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
2ec0: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
2ed0: 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61  ; */..    /* Eva
2ee0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2ef0: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2f00: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2f10: 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61  r);.    ok = Eva
2f20: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
2f30: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
2f40: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
2f50: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2f60: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
2f70: 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a  "VerifyCallback:
2f80: 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20   command result 
2f90: 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  = %d", ok);..   
2fa0: 20 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c   /* statePtr->fl
2fb0: 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c  ags &= ~(TLS_TCL
2fc0: 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20  _CALLBACK); */. 
2fd0: 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a     return ok;./*
2fe0: 20 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61   By default, lea
2ff0: 76 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  ve verification 
3000: 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a  unchanged. */.}.
3010: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3060: 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a   Tls_Error --. *
3070: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3080: 63 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65  ck with error me
3090: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64  ssage.. *. * Sid
30a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
30b0: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74  e err field of t
30c0: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
30d0: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20  rative State is 
30e0: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74  set. *.  to a st
30f0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
3100: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  the SSL negotiat
3110: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73  ion failure reas
3120: 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  on. *. *--------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3170: 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53  void.Tls_Error(S
3180: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
3190: 63 68 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20  char *msg) {.   
31a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
31b0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
31c0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
31d0: 4f 62 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69  Obj *cmdPtr, *li
31e0: 73 74 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67  stPtr;.    unsig
31f0: 6e 65 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20  ned long err;.  
3200: 20 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20    statePtr->err 
3210: 3d 20 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69  = msg;..    dpri
3220: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
3230: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
3240: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54  ->callback == (T
3250: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72  cl_Obj*)NULL)..r
3260: 65 74 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43  eturn;..    /* C
3270: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
3280: 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63   eval with fn, c
3290: 68 61 6e 2c 20 61 6e 64 20 6d 65 73 73 61 67 65  han, and message
32a0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
32b0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
32c0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
32d0: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
32e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
32f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
3300: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
3310: 53 74 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72  StringObj("error
3320: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3330: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3340: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3350: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
3360: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
3370: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
3380: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
3390: 2d 31 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73  -1));.    if (ms
33a0: 67 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  g != NULL) {..Tc
33b0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
33c0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
33d0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
33e0: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
33f0: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  );..    } else i
3400: 66 20 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65  f ((msg = Tcl_Ge
3410: 74 53 74 72 69 6e 67 28 54 63 6c 5f 47 65 74 4f  tString(Tcl_GetO
3420: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3430: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) != NULL) {..T
3440: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3450: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3460: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3470: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
3480: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
3490: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  {..listPtr = Tcl
34a0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
34b0: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65  ULL);..while ((e
34c0: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72  rr = ERR_get_err
34d0: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20  or()) != 0) {.. 
34e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
34f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3500: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
3510: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52  _NewStringObj(ER
3520: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
3530: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
3540: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ;..}..Tcl_ListOb
3550: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3560: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c  nterp, cmdPtr, l
3570: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  istPtr);.    }..
3580: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
3590: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
35a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
35b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
35c0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
35d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
35e0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
35f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
3600: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
3610: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
3660: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
3670: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
3680: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
3690: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
36a0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
36b0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3700: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
3710: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3720: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
3730: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
3740: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
3750: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
3760: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20      FILE *fd;.. 
3770: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
3780: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
3790: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
37a0: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
37b0: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
37c0: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
37d0: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
37e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
37f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
3830: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
3840: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3850: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
3860: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20  is needed for a 
3870: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e  private key when
3880: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73   loading. *.or s
3890: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72  toring a PEM cer
38a0: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
38b0: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
38c0: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69  callback. *.scri
38d0: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  pt and returns t
38e0: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
38f0: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3900: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3910: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3920: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3930: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
3940: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
3950: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
3960: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
3970: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
3980: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
3990: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
39e0: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
39f0: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3a00: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3a10: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3a20: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3a30: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
3a40: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
3a50: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
3a60: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
3a70: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
3a80: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
3a90: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
3aa0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
3ab0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3ac0: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
3ad0: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20  If no callback, 
3ae0: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c  use default call
3af0: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28  back */.    if (
3b00: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3b10: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
3b20: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e  f (Tcl_EvalEx(in
3b30: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73  terp, "tls::pass
3b40: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  word", -1, TCL_E
3b50: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54  VAL_GLOBAL) == T
3b60: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
3b70: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3b80: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3b90: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
3ba0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3bb0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
3bc0: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
3bd0: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c  e) size-1) {...l
3be0: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20  en = (Tcl_Size) 
3bf0: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  size-1;..    }..
3c00: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c      strncpy(buf,
3c10: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c   ret, (size_t) l
3c20: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65  en);..    buf[le
3c30: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20  n] = '\0';..    
3c40: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
3c50: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
3c60: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
3c70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
3c80: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
3c90: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 72 77 66  val with fn, rwf
3ca0: 6c 61 67 2c 20 61 6e 64 20 73 69 7a 65 20 61 72  lag, and size ar
3cb0: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
3cc0: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
3cd0: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61  Obj(statePtr->pa
3ce0: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c  ssword);.    Tcl
3cf0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3d00: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3d10: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3d20: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64  ingObj("password
3d30: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3d40: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3d50: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3d60: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3d70: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20  Obj(rwflag));.  
3d80: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3d90: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3da0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3db0: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b  ewIntObj(size));
3dc0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
3dd0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3de0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
3df0: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3e00: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3e10: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
3e20: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
3e30: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
3e40: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3e50: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
3e60: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
3e70: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
3e80: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
3e90: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
3ea0: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d  OK) {.#if (TCL_M
3eb0: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20  AJOR_VERSION == 
3ec0: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52  8) && (TCL_MINOR
3ed0: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54  _VERSION < 6)..T
3ee0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
3ef0: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73  or(interp);.#els
3f00: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  e..Tcl_Backgroun
3f10: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
3f20: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
3f30: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
3f40: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
3f50: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
3f60: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
3f70: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3f80: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73     /* If success
3f90: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70  ful, pass back p
3fa0: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61  assword string a
3fb0: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74  nd truncate if t
3fc0: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69  oo long */.    i
3fd0: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f  f (code == TCL_O
3fe0: 4b 29 20 7b 0a 09 63 68 61 72 20 2a 72 65 74 20  K) {..char *ret 
3ff0: 3d 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  = (char *) Tcl_G
4000: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
4010: 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_GetObjResult
4020: 28 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b  (interp), &len);
4030: 0a 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c  ..if (len > (Tcl
4040: 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b  _Size) size-1) {
4050: 0a 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c  ..    len = (Tcl
4060: 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09  _Size) size-1;..
4070: 7d 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20  }..strncpy(buf, 
4080: 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  ret, (size_t) le
4090: 6e 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20  n);..buf[len] = 
40a0: 27 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61  '\0';..Tcl_Relea
40b0: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
40c0: 69 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e  interp);..return
40d0: 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 20   (int) len;.    
40e0: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
40f0: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
4100: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
4110: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
4170: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
4180: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
4190: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
41a0: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
41b0: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
41c0: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
41d0: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
41e0: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
41f0: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
4200: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
4210: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
4220: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
4230: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
4240: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
4250: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
4260: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
4270: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
4280: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
4290: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
42a0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
42b0: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
42c0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
42d0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
42e0: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
42f0: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4300: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4310: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
4320: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
4330: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
4340: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
4350: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
4360: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
4370: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
4380: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
4390: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
43a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
43f0: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4400: 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20  lback(SSL *ssl, 
4410: 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73  SSL_SESSION *ses
4420: 73 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74  sion) {.    Stat
4430: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4440: 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70  tate*)SSL_get_ap
4450: 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73  p_data((SSL *)ss
4460: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
4470: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
4480: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
4490: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
44a0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  tr;.    const un
44b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
44c0: 6b 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75  ket;.    const u
44d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65  nsigned char *se
44e0: 73 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69  ssion_id;.    si
44f0: 7a 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75  ze_t len2;.    u
4500: 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e  nsigned int ulen
4510: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
4520: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
4530: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
4540: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
4550: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
4560: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
4570: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
4580: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4590: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
45a0: 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b  TLSEXT_ERR_NOACK
45b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
45c0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
45d0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
45e0: 63 68 61 6e 2c 20 73 65 73 73 69 6f 6e 20 69 64  chan, session id
45f0: 2c 20 73 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  , session ticket
4600: 2c 20 61 6e 64 20 6c 69 66 65 74 69 6d 65 20 61  , and lifetime a
4610: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
4620: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
4630: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
4640: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
4650: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4660: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4670: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
4680: 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f 6e  ringObj("session
4690: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
46a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
46b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
46c0: 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e  dPtr,..    Tcl_N
46d0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f  ewStringObj(Tcl_
46e0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
46f0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20  tatePtr->self), 
4700: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  -1));..    /* Se
4710: 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20  ssion id */.    
4720: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
4730: 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
4740: 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
4750: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4760: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4770: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4780: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
4790: 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  j(session_id, (T
47a0: 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29 3b  cl_Size) ulen));
47b0: 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e  ..    /* Session
47c0: 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53   ticket */.    S
47d0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
47e0: 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c 20  ticket(session, 
47f0: 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29 3b  &ticket, &len2);
4800: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4810: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4820: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4830: 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
4840: 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53  j(ticket, (Tcl_S
4850: 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20 20  ize) len2));..  
4860: 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d 20    /* Lifetime - 
4870: 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e 64  number of second
4880: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69 73  s */.    Tcl_Lis
4890: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
48a0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
48b0: 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62  ,..Tcl_NewLongOb
48c0: 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45 53  j((long) SSL_SES
48d0: 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74 5f  SION_get_ticket_
48e0: 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73 65  lifetime_hint(se
48f0: 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20 2f  ssion)));..    /
4900: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
4910: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
4920: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
4930: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
4940: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
4950: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
4960: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
4970: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
4980: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72  );..    /* Retur
4990: 6e 20 30 20 66 6f 72 20 6e 6f 77 20 75 6e 74 69  n 0 for now unti
49a0: 6c 20 73 65 73 73 69 6f 6e 20 68 61 6e 64 6c 69  l session handli
49b0: 6e 67 20 69 73 20 63 6f 6d 70 6c 65 74 65 20 2a  ng is complete *
49c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
49d0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
4a20: 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61 63 6b   * ALPN Callback
4a30: 20 66 6f 72 20 53 65 72 76 65 72 73 20 61 6e 64   for Servers and
4a40: 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f   NPN Callback fo
4a50: 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a  r Clients --. *.
4a60: 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f 74 6f   *.Perform proto
4a70: 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c 20 68  col (http/1.1, h
4a80: 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73 65 6c  2, h3, etc.) sel
4a90: 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 20  ection for the. 
4aa0: 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65  *.incoming conne
4ab0: 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20 61 66  ction. Called af
4ac0: 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20 73 65  ter Hello and se
4ad0: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  rver callbacks..
4ae0: 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27 20 69   *.Where 'out' i
4af0: 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  s selected proto
4b00: 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69 73 20  col and 'in' is 
4b10: 74 68 65 20 70 65 65 72 20 61 64 76 65 72 74 69  the peer adverti
4b20: 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  sed list.. *. * 
4b30: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
4b40: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
4b50: 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  cts:. *.Calls ca
4b60: 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e  llback (if defin
4b70: 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e  ed). *. * Return
4b80: 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54   codes:. *.SSL_T
4b90: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c  LSEXT_ERR_OK: AL
4ba0: 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  PN protocol sele
4bb0: 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  cted. The connec
4bc0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
4bd0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
4be0: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 54  R_ALERT_FATAL: T
4bf0: 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76 65 72  here was no over
4c00: 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68 65 20  lap between the 
4c10: 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20 20 20  client's. *.    
4c20: 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 61 6e  supplied list an
4c30: 64 20 74 68 65 20 73 65 72 76 65 72 20 63 6f 6e  d the server con
4c40: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 65 20  figuration. The 
4c50: 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c 6c 20  connection will 
4c60: 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a 09 53  be aborted.. *.S
4c70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4c80: 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63  ACK: ALPN protoc
4c90: 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2c  ol not selected,
4ca0: 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65 20 6e   e.g., because n
4cb0: 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20 70 72  o ALPN. *.    pr
4cc0: 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f 6e 66  otocols are conf
4cd0: 69 67 75 72 65 64 20 66 6f 72 20 74 68 69 73 20  igured for this 
4ce0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20  connection. The 
4cf0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4d00: 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nues.. *. *-----
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4d50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 41 4c  */.static int.AL
4d60: 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a  PNCallback(SSL *
4d70: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ssl, const unsig
4d80: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20  ned char **out, 
4d90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
4da0: 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e  utlen,..const un
4db0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c  signed char *in,
4dc0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e   unsigned int in
4dd0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
4de0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
4df0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
4e00: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
4e10: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
4e20: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
4e30: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
4e40: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
4e50: 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72  e, res;..    dpr
4e60: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4e70: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
4e80: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
4e90: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4ea0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4eb0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
4ec0: 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63  /* Select protoc
4ed0: 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53  ol */.    if (SS
4ee0: 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72  L_select_next_pr
4ef0: 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64 20 63 68  oto((unsigned ch
4f00: 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f 75 74 6c  ar **) out, outl
4f10: 65 6e 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72  en, statePtr->pr
4f20: 6f 74 6f 73 2c 20 73 74 61 74 65 50 74 72 2d 3e  otos, statePtr->
4f30: 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c  protos_len,..in,
4f40: 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53   inlen) == OPENS
4f50: 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45  SL_NPN_NEGOTIATE
4f60: 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66  D) {../* Match f
4f70: 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53  ound */..res = S
4f80: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4f90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
4fa0: 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e  /* OPENSSL_NPN_N
4fb0: 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f  O_OVERLAP = No o
4fc0: 76 65 72 6c 61 70 2c 20 73 6f 20 75 73 65 20 66  verlap, so use f
4fd0: 69 72 73 74 20 69 74 65 6d 20 66 72 6f 6d 20 63  irst item from c
4fe0: 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c  lient protocol l
4ff0: 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53  ist */..res = SS
5000: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5010: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5020: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5030: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5040: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 72  ULL) {..return r
5050: 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  es;.    }..    /
5060: 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  * Create command
5070: 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e   to eval with fn
5080: 2c 20 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63  , chan, depth, c
5090: 65 72 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73  ert info list, s
50a0: 74 61 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72  tatus, and error
50b0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64   args */.    cmd
50c0: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
50d0: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
50e0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
50f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5100: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5110: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5120: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
5130: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
5140: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
5150: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
5160: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
5170: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
5180: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
5190: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
51a0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
51b0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
51c0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
51d0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
51e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 2a 6f  const char *) *o
51f0: 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  ut, -1));.    Tc
5200: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5210: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5220: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 6f  mdPtr, Tcl_NewBo
5230: 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d 20  oleanObj(res == 
5240: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5250: 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  K));..    /* Eva
5260: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
5270: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
5280: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5290: 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64  r);.    if ((cod
52a0: 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b  e = EvalCallback
52b0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
52c0: 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29  r, cmdPtr)) > 1)
52d0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
52e0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
52f0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
5300: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
5310: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5320: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
5330: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5340: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
5350: 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ATAL;.    }.    
5360: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
5370: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65  (cmdPtr);.    re
5380: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a  turn res;.}.../*
5390: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
53a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76  ------. *. * Adv
53e0: 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c 73  ertise Protocols
53f0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e 65   Callback for Ne
5400: 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  xt Protocol Nego
5410: 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69 6e  tiation (NPN) in
5420: 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a   ServerHello --.
5430: 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68 65   *. *.called whe
5440: 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20 6e  n a TLS server n
5450: 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20 73  eeds a list of s
5460: 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63 6f  upported protoco
5470: 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09 50  ls for Next. *.P
5480: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
5490: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
54a0: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
54b0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
54c0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
54d0: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
54e0: 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72  T_ERR_OK: NPN pr
54f0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
5500: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5510: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5520: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5530: 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c  CK: NPN protocol
5540: 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20 54   not selected. T
5550: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
5560: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
55b0: 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  -. */.#ifdef USE
55c0: 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74 0a  _NPN.static int.
55d0: 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73  NPNCallback(cons
55e0: 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73  t SSL *ssl, cons
55f0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5600: 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20  **out, unsigned 
5610: 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69  int *outlen, voi
5620: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
5630: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
5640: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20 20  (State*)arg;..  
5650: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
5660: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73  d");..    if (ss
5670: 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67  l == NULL || arg
5680: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
5690: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
56a0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
56b0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f 74  .    /* Set prot
56c0: 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20 20  ocols list */.  
56d0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
56e0: 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20  protos != NULL) 
56f0: 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65 50  {..*out = stateP
5700: 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75  tr->protos;..*ou
5710: 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72 2d  tlen = statePtr-
5720: 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20  >protos_len;.   
5730: 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74 20   } else {..*out 
5740: 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e  = NULL;..*outlen
5750: 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53 53   = 0;..return SS
5760: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5770: 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  CK;.    }.    re
5780: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5790: 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ERR_OK;.}.#endif
57a0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
57b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
57f0: 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20 66  * SNI Callback f
5800: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
5810: 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72 76  . *.Perform serv
5820: 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73 74  er-side SNI host
5830: 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20 61  name selection a
5840: 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20 53  fter receiving S
5850: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09  NI extension. *.
5860: 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e  in Client Hello.
5870: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68 65   Called after he
5880: 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75 74  llo callback but
5890: 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61 6c   before ALPN cal
58a0: 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73  lback.. *. * Res
58b0: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
58c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
58d0: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
58e0: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
58f0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
5900: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
5910: 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20 68  XT_ERR_OK: SNI h
5920: 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65 70  ostname is accep
5930: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5940: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5950: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
5960: 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53 4e  _ALERT_FATAL: SN
5970: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
5980: 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20  t accepted. The 
5990: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20 20  connection. *.  
59a0: 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44 65    is aborted. De
59b0: 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74 20  fault for alert 
59c0: 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f  is SSL_AD_UNRECO
59d0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09  GNIZED_NAME.. *.
59e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
59f0: 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53 4e  LERT_WARNING: SN
5a00: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
5a10: 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72 6e  t accepted, warn
5a20: 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20 20  ing alert. *.   
5a30: 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70 6f   sent (not suppo
5a40: 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33 29  rted in TLSv1.3)
5a50: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5a60: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
5a70: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5a80: 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d  ACK: SNI hostnam
5a90: 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65  e is not accepte
5aa0: 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f 77  d and not acknow
5ab0: 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20 65  ledged,. *.    e
5ac0: 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20 6e  .g. if SNI has n
5ad0: 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72  ot been configur
5ae0: 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69  ed. The connecti
5af0: 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a  on continues.. *
5b00: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
5b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b40: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
5b50: 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61 63  c int.SNICallbac
5b60: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5b70: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
5b80: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
5b90: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
5ba0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
5bb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
5bc0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
5bd0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
5be0: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
5bf0: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
5c00: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5c10: 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 4e 55  *servername = NU
5c20: 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  LL;..    dprintf
5c30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
5c40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
5c50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
5c60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
5c70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
5c80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f  .    }..    /* O
5c90: 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 54 4c  nly works for TL
5ca0: 53 20 31 2e 32 20 61 6e 64 20 65 61 72 6c 69 65  S 1.2 and earlie
5cb0: 72 20 2a 2f 0a 20 20 20 20 73 65 72 76 65 72 6e  r */.    servern
5cc0: 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ame = SSL_get_se
5cd0: 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
5ce0: 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
5cf0: 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  st_name);.    if
5d00: 20 28 21 73 65 72 76 65 72 6e 61 6d 65 20 7c 7c   (!servername ||
5d10: 20 73 65 72 76 65 72 6e 61 6d 65 5b 30 5d 20 3d   servername[0] =
5d20: 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65 74 75 72  = '\0') {..retur
5d30: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
5d40: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
5d50: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5d60: 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62  >vcmd == (Tcl_Ob
5d70: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
5d80: 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52  rn SSL_TLSEXT_ER
5d90: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  R_OK;.    }..   
5da0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
5db0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
5dc0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65  fn, chan, and se
5dd0: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a  rver name args *
5de0: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
5df0: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
5e00: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
5e10: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
5e20: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
5e30: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
5e40: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
5e50: 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  sni", -1));.    
5e60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
5e70: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
5e80: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
5e90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
5ea0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
5eb0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
5ec0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
5ed0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
5ee0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
5ef0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
5f00: 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d  ingObj(servernam
5f10: 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f  e , -1));..    /
5f20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
5f30: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
5f40: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
5f50: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20  cmdPtr);.    if 
5f60: 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c  ((code = EvalCal
5f70: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
5f80: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29  atePtr, cmdPtr))
5f90: 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53   > 1) {..res = S
5fa0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
5fb0: 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61  ERT_WARNING;..*a
5fc0: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e  lert = SSL_AD_UN
5fd0: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b  RECOGNIZED_NAME;
5fe0: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65   /* Not supporte
5ff0: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a  d by TLS 1.3 */.
6000: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
6010: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
6020: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
6030: 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  R_OK;.    } else
6040: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
6050: 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46  SEXT_ERR_ALERT_F
6060: 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  ATAL;..*alert = 
6070: 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49  SSL_AD_UNRECOGNI
6080: 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74  ZED_NAME; /* Not
6090: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c   supported by TL
60a0: 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20  S 1.3 */.    }. 
60b0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
60c0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
60d0: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
60e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
60f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
6130: 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64  ClientHello Hand
6140: 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66  shake Callback f
6150: 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a  or Servers --. *
6160: 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76  . *.Used by serv
6170: 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68  er to examine th
6180: 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e  e server name in
6190: 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65  dication (SNI) e
61a0: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76  xtension. *.prov
61b0: 69 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65  ided by the clie
61c0: 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73  nt in order to s
61d0: 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72  elect an appropr
61e0: 69 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65  iate certificate
61f0: 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20   to. *.present, 
6200: 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63  and make other c
6210: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a  onfiguration adj
6220: 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e  ustments relevan
6230: 74 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72  t to that server
6240: 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73  . *.name and its
6250: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20   configuration. 
6260: 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77  This includes sw
6270: 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61  apping out the a
6280: 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c  ssociated. *.SSL
6290: 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f  _CTX pointer, mo
62a0: 64 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76  difying the serv
62b0: 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72  er's list of per
62c0: 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69  mitted TLS versi
62d0: 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67  ons,. *.changing
62e0: 20 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69   the server's ci
62f0: 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73  pher list in res
6300: 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69  ponse to the cli
6310: 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73  ent's cipher lis
6320: 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65  t, etc.. *.Calle
6330: 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64  d before SNI and
6340: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e   ALPN callbacks.
6350: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6360: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
6370: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
6380: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
6390: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
63a0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
63b0: 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  *.SSL_CLIENT_HEL
63c0: 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e  LO_RETRY: suspen
63d0: 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c  d the handshake,
63e0: 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61   and the handsha
63f0: 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c  ke function will
6400: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
6410: 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e  ely. *.SSL_CLIEN
6420: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66  T_HELLO_ERROR: f
6430: 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74  ailure, terminat
6440: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65  e connection. Se
6450: 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72  t alert to error
6460: 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c   code.. *.SSL_CL
6470: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45  IENT_HELLO_SUCCE
6480: 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20  SS: success. *. 
6490: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
64e0: 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  int.HelloCallbac
64f0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20  k(SSL *ssl, int 
6500: 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72  *alert, void *ar
6510: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
6520: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
6530: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
6540: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
6550: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
6560: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
6570: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
6580: 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63  code, res;.    c
6590: 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72 76 65  onst char *serve
65a0: 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74  rname;.    const
65b0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
65c0: 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6c 65  p;.    size_t le
65d0: 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20  n, remaining;.. 
65e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
65f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
6600: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
6610: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
6620: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6630: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43  LIENT_HELLO_SUCC
6640: 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ESS;.    } else 
6650: 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73  if (ssl == (cons
6660: 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20  t SSL *)NULL || 
6670: 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e  arg == (void *)N
6680: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
6690: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
66a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
66b0: 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a    /* Get names *
66c0: 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f 63  /.    if (!SSL_c
66d0: 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30  lient_hello_get0
66e0: 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45 58 54  _ext(ssl, TLSEXT
66f0: 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d  _TYPE_server_nam
6700: 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e  e, &p, &remainin
6710: 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20  g) || remaining 
6720: 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20  <= 2) {..*alert 
6730: 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c  = SSL_R_SSLV3_AL
6740: 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41  ERT_ILLEGAL_PARA
6750: 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53  METER;..return S
6760: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
6770: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
6780: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
6790: 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 73   length of the s
67a0: 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f 66 20  upplied list of 
67b0: 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65  names. */.    le
67c0: 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38  n = (*(p++) << 8
67d0: 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28  );.    len += *(
67e0: 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65  p++);.    if (le
67f0: 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69 6e 69  n + 2 != remaini
6800: 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20  ng) {..*alert = 
6810: 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52  SSL_R_SSLV3_ALER
6820: 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45  T_ILLEGAL_PARAME
6830: 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  TER;..return SSL
6840: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6850: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6860: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a  emaining = len;.
6870: 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74  .    /* The list
6880: 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f 6e 6c   in practice onl
6890: 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65 20 65  y has a single e
68a0: 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e  lement, so we on
68b0: 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20  ly consider the 
68c0: 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20  first one. */.  
68d0: 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20    if (remaining 
68e0: 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20  == 0 || *p++ != 
68f0: 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
6900: 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61  host_name) {..*a
6910: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6920: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6930: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6940: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6950: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6960: 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a     remaining--;.
6970: 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63  .    /* Now we c
6980: 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20  an finally pull 
6990: 6f 75 74 20 74 68 65 20 62 79 74 65 20 61 72 72  out the byte arr
69a0: 61 79 20 77 69 74 68 20 74 68 65 20 61 63 74 75  ay with the actu
69b0: 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a  al hostname. */.
69c0: 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e      if (remainin
69d0: 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72  g <= 2) {..*aler
69e0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
69f0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
6a00: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
6a10: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6a20: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6a30: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c  len = (*(p++) <<
6a40: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20   8);.    len += 
6a50: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28  *(p++);.    if (
6a60: 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e  len + 2 > remain
6a70: 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  ing) {..*alert =
6a80: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6a90: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6aa0: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6ab0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6ac0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d  R;.    }.    rem
6ad0: 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20  aining = len;.  
6ae0: 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d 20 28    servername = (
6af0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 3b 0a  const char *)p;.
6b00: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
6b10: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
6b20: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e  ith fn, chan, an
6b30: 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 61 72  d server name ar
6b40: 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  gs */.    cmdPtr
6b50: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
6b60: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
6b70: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
6b80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6b90: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6ba0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6bb0: 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29  bj("hello", -1))
6bc0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
6bd0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
6be0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
6bf0: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
6c00: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
6c10: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
6c20: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
6c30: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
6c40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
6c50: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
6c60: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
6c70: 76 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69  vername, (Tcl_Si
6c80: 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20  ze) len));..    
6c90: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
6ca0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
6cb0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6cc0: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
6cd0: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
6ce0: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
6cf0: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
6d00: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
6d10: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6d20: 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20  _RETRY;..*alert 
6d30: 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c  = SSL_R_TLSV1_AL
6d40: 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c  ERT_USER_CANCELL
6d50: 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ED;.    } else i
6d60: 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a  f (code == 1) {.
6d70: 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e  .res = SSL_CLIEN
6d80: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6d90: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
6da0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6db0: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61  HELLO_ERROR;..*a
6dc0: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6dd0: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6de0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
6df0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
6e00: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
6e10: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
6e20: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
6e30: 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61  ******/./* Comma
6e40: 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f  nds         */./
6e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e60: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 0a  ---------------.
6eb0: 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f   *. * HandshakeO
6ec0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
6ed0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
6ee0: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68  sed to verify wh
6ef0: 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68  ether the handsh
6f00: 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a  ake is complete.
6f10: 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a   *.or not.. *. *
6f20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
6f30: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
6f40: 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64  lt. 1 means hand
6f50: 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20  shake complete, 
6f60: 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e  0 means pending.
6f70: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
6f80: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63  cts:. *.May forc
6f90: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
6fa0: 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e  n to take place.
6fb0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
7000: 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61  atic int Handsha
7010: 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  keObjCmd(ClientD
7020: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
7030: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7040: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
7050: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
7060: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
7070: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20  hannel chan;    
7080: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e      /* The chann
7090: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
70a0: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
70b0: 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20  e *statePtr;    
70c0: 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74      /* client st
70d0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
70e0: 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  et */.    const 
70f0: 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e  char *errStr = N
7100: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
7110: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72   = 1;.    int er
7120: 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64  r = 0;.    (void
7130: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
7140: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
7150: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
7160: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
7170: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7180: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
7190: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
71a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
71b0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
71c0: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
71d0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
71e0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
71f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
7200: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
7210: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
7220: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
7230: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
7240: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7250: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
7260: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
7270: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
7280: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
7290: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
72a0: 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28  (chan);.    if (
72b0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
72c0: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
72d0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
72e0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
72f0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
7300: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
7310: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
7320: 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a  chan),..    "\":
7330: 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e   not a TLS chann
7340: 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  el", (char *) NU
7350: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72  LL);..Tcl_SetErr
7360: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
7370: 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45  TLS", "HANDSHAKE
7380: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
7390: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
73a0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
73b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
73c0: 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 3d  }.    statePtr =
73d0: 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65   (State *)Tcl_Ge
73e0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65  tChannelInstance
73f0: 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20  Data(chan);..   
7400: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e   dprintf("Callin
7410: 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  g Tls_WaitForCon
7420: 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20  nect");.    ret 
7430: 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  = Tls_WaitForCon
7440: 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20 26  nect(statePtr, &
7450: 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72  err, 1);.    dpr
7460: 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f  intf("Tls_WaitFo
7470: 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65  rConnect returne
7480: 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20  d: %i", ret);.. 
7490: 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20 26     if (ret < 0 &
74a0: 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c  & ((statePtr->fl
74b0: 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53  ags & TLS_TCL_AS
74c0: 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20  YNC) && (err == 
74d0: 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72  EAGAIN))) {..dpr
74e0: 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74 20  intf("Async set 
74f0: 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e  and err = EAGAIN
7500: 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20  ");..ret = 0;.  
7510: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74    } else if (ret
7520: 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65   < 0) {..long re
7530: 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20  sult;..errStr = 
7540: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09  statePtr->err;..
7550: 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28  Tcl_ResetResult(
7560: 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65  interp);..Tcl_Se
7570: 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69  tErrno(err);...i
7580: 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a  f (!errStr || (*
7590: 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a  errStr == 0)) {.
75a0: 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54 63  .    errStr = Tc
75b0: 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74  l_PosixError(int
75c0: 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41  erp);..}...Tcl_A
75d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
75e0: 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66  rp, "handshake f
75f0: 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72  ailed: ", errStr
7600: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
7610: 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d  ;..if ((result =
7620: 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
7630: 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d  result(statePtr-
7640: 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56  >ssl)) != X509_V
7650: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  _OK) {..    Tcl_
7660: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7670: 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22  erp, " due to \"
7680: 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63  ", X509_verify_c
7690: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
76a0: 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20  (result), "\"", 
76b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
76c0: 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  .}..Tcl_SetError
76d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
76e0: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
76f0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
7700: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69   *) NULL);..dpri
7710: 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54  ntf("Returning T
7720: 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61  CL_ERROR with ha
7730: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
7740: 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72  %s", errStr);..r
7750: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7760: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
7770: 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09  f (err != 0) {..
7780: 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74      dprintf("Got
7790: 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61   an error with a
77a0: 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73   completed hands
77b0: 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c  hake: err = %i",
77c0: 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d   err);..}..ret =
77d0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64   1;.    }..    d
77e0: 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
77f0: 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61  g TCL_OK with da
7800: 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29  ta \"%i\"", ret)
7810: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
7820: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
7830: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74  cl_NewIntObj(ret
7840: 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
7850: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
7860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d   const char *com
7870: 6d 61 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b  mand_opts [] = {
7880: 0a 20 20 20 20 22 2d 61 6c 70 6e 22 2c 20 22 2d  .    "-alpn", "-
7890: 63 61 64 69 72 22 2c 20 22 2d 63 61 66 69 6c 65  cadir", "-cafile
78a0: 22 2c 20 22 2d 63 65 72 74 22 2c 20 22 2d 63 65  ", "-cert", "-ce
78b0: 72 74 66 69 6c 65 22 2c 20 22 2d 63 69 70 68 65  rtfile", "-ciphe
78c0: 72 22 2c 20 22 2d 63 69 70 68 65 72 73 22 2c 20  r", "-ciphers", 
78d0: 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c  "-ciphersuites",
78e0: 0a 20 20 20 20 22 2d 63 6f 6d 6d 61 6e 64 22 2c  .    "-command",
78f0: 20 22 2d 64 68 70 61 72 61 6d 73 22 2c 20 22 2d   "-dhparams", "-
7900: 6b 65 79 22 2c 20 22 2d 6b 65 79 66 69 6c 65 22  key", "-keyfile"
7910: 2c 20 22 2d 6d 6f 64 65 6c 22 2c 20 22 2d 70 61  , "-model", "-pa
7920: 73 73 77 6f 72 64 22 2c 20 22 2d 70 6f 73 74 5f  ssword", "-post_
7930: 68 61 6e 64 73 68 61 6b 65 22 2c 0a 20 20 20 20  handshake",.    
7940: 22 2d 72 65 71 75 65 73 74 22 2c 20 22 2d 72 65  "-request", "-re
7950: 71 75 69 72 65 22 2c 20 22 2d 73 65 63 75 72 69  quire", "-securi
7960: 74 79 5f 6c 65 76 65 6c 22 2c 20 22 2d 73 65 72  ty_level", "-ser
7970: 76 65 72 22 2c 20 22 2d 73 65 72 76 65 72 6e 61  ver", "-serverna
7980: 6d 65 22 2c 20 22 2d 73 65 73 73 69 6f 6e 5f 69  me", "-session_i
7990: 64 22 2c 20 22 2d 73 73 6c 32 22 2c 0a 20 20 20  d", "-ssl2",.   
79a0: 20 22 2d 73 73 6c 33 22 2c 20 22 2d 74 6c 73 31   "-ssl3", "-tls1
79b0: 22 2c 20 22 2d 74 6c 73 31 2e 31 22 2c 20 22 2d  ", "-tls1.1", "-
79c0: 74 6c 73 31 2e 32 22 2c 20 22 2d 74 6c 73 31 2e  tls1.2", "-tls1.
79d0: 33 22 2c 20 22 2d 76 61 6c 69 64 61 74 65 63 6f  3", "-validateco
79e0: 6d 6d 61 6e 64 22 2c 20 22 2d 76 63 6d 64 22 2c  mmand", "-vcmd",
79f0: 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75 6d 20 5f 63   NULL};..enum _c
7a00: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20 7b 0a 20 20  ommand_opts {.  
7a10: 20 20 5f 6f 70 74 5f 61 6c 70 6e 2c 20 5f 6f 70    _opt_alpn, _op
7a20: 74 5f 63 61 64 69 72 2c 20 5f 6f 70 74 5f 63 61  t_cadir, _opt_ca
7a30: 66 69 6c 65 2c 20 5f 6f 70 74 5f 63 65 72 74 2c  file, _opt_cert,
7a40: 20 5f 6f 70 74 5f 63 65 72 74 66 69 6c 65 2c 20   _opt_certfile, 
7a50: 5f 6f 70 74 5f 63 69 70 68 65 72 2c 20 5f 6f 70  _opt_cipher, _op
7a60: 74 5f 63 69 70 68 65 72 73 2c 0a 20 20 20 20 5f  t_ciphers,.    _
7a70: 6f 70 74 5f 63 69 70 68 65 72 73 75 69 74 65 2c  opt_ciphersuite,
7a80: 20 5f 6f 70 74 5f 63 6d 64 2c 20 5f 6f 70 74 5f   _opt_cmd, _opt_
7a90: 64 68 70 61 72 61 6d 73 2c 20 5f 6f 70 74 5f 6b  dhparams, _opt_k
7aa0: 65 79 2c 20 5f 6f 70 74 5f 6b 65 79 66 69 6c 65  ey, _opt_keyfile
7ab0: 2c 20 5f 6f 70 74 5f 6d 6f 64 65 6c 2c 20 5f 6f  , _opt_model, _o
7ac0: 70 74 5f 70 61 73 73 77 6f 72 64 2c 0a 20 20 20  pt_password,.   
7ad0: 20 5f 6f 70 74 5f 68 61 6e 64 73 68 61 6b 65 2c   _opt_handshake,
7ae0: 20 5f 6f 70 74 5f 72 65 71 75 65 73 74 2c 20 5f   _opt_request, _
7af0: 6f 70 74 5f 72 65 71 75 69 72 65 2c 20 5f 6f 70  opt_require, _op
7b00: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
7b10: 2c 20 5f 6f 70 74 5f 73 65 72 76 65 72 2c 20 5f  , _opt_server, _
7b20: 6f 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 2c 0a  opt_servername,.
7b30: 20 20 20 20 5f 6f 70 74 5f 73 65 73 73 69 6f 6e      _opt_session
7b40: 5f 69 64 2c 20 5f 6f 70 74 5f 73 73 6c 32 2c 20  _id, _opt_ssl2, 
7b50: 5f 6f 70 74 5f 73 73 6c 33 2c 20 5f 6f 70 74 5f  _opt_ssl3, _opt_
7b60: 74 6c 73 31 2c 20 5f 6f 70 74 5f 74 6c 73 31 31  tls1, _opt_tls11
7b70: 2c 20 5f 6f 70 74 5f 74 6c 73 31 32 2c 20 5f 6f  , _opt_tls12, _o
7b80: 70 74 5f 74 6c 73 31 33 2c 0a 20 20 20 20 5f 6f  pt_tls13,.    _o
7b90: 70 74 5f 76 61 6c 69 64 61 74 65 2c 20 5f 6f 70  pt_validate, _op
7ba0: 74 5f 76 63 6d 64 0a 7d 3b 0a 0a 2f 2a 0a 20 2a  t_vcmd.};../*. *
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bf0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74  ---. *. * Import
7c00: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
7c10: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
7c20: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
7c30: 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20 63  cess the "ssl" c
7c40: 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65  ommand. *. *.The
7c50: 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73   ssl command pus
7c60: 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28  hes SSL over a (
7c70: 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29  newly connected)
7c80: 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20   tcp socket. *. 
7c90: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
7ca0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
7cb0: 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ult.. *. * Side 
7cc0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
7cd0: 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76  modify the behav
7ce0: 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61  ior of an IO cha
7cf0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  nnel.. *. *-----
7d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d  */.static int.Im
7d50: 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  portObjCmd(Clien
7d60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
7d70: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
7d80: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
7d90: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
7da0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
7db0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
7dc0: 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
7dd0: 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e  o set a mode on.
7de0: 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73   */.    State *s
7df0: 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69  tatePtr;../* cli
7e00: 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73  ent state for ss
7e10: 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20  l socket */.    
7e20: 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d 20  SSL_CTX *ctx..= 
7e30: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
7e40: 6a 20 2a 63 6d 64 4f 62 6a 09 09 3d 20 4e 55 4c  j *cmdObj..= NUL
7e50: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
7e60: 70 61 73 73 77 64 4f 62 6a 09 09 3d 20 4e 55 4c  passwdObj..= NUL
7e70: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
7e80: 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  vcmd..= NULL;.  
7e90: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
7ea0: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
7eb0: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
7ec0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
7ed0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
7ee0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
7ef0: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
7f00: 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  idx;.    Tcl_Siz
7f10: 65 20 66 6e 2c 20 6c 65 6e 3b 0a 20 20 20 20 69  e fn, len;.    i
7f20: 6e 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53  nt flags...= TLS
7f30: 5f 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69  _TCL_INIT;.    i
7f40: 6e 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b  nt server...= 0;
7f50: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f  ./* is connectio
7f60: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75  n incoming or ou
7f70: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63  tgoing? */.    c
7f80: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20  har *keyfile..= 
7f90: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
7fa0: 63 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c  certfile..= NULL
7fb0: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
7fc0: 68 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c  har *key..= NULL
7fd0: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b  ;.    Tcl_Size k
7fe0: 65 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20  ey_len..= 0;.   
7ff0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8000: 63 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  cert..= NULL;.  
8010: 20 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f    Tcl_Size cert_
8020: 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68  len..= 0;.    ch
8030: 61 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e  ar *ciphers..= N
8040: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
8050: 69 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e  iphersuites..= N
8060: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
8070: 41 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20  Afile..= NULL;. 
8080: 20 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09     char *CApath.
8090: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
80a0: 72 20 2a 44 48 70 61 72 61 6d 73 09 09 3d 20 4e  r *DHparams..= N
80b0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 6d  ULL;.    char *m
80c0: 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c 3b 0a 20  odel...= NULL;. 
80d0: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
80e0: 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09 2f 2a 20  ame..= NULL;./* 
80f0: 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 53 65 72  hostname for Ser
8100: 76 65 72 20 4e 61 6d 65 20 49 6e 64 69 63 61 74  ver Name Indicat
8110: 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ion */.    const
8120: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
8130: 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 4e 55 4c  session_id = NUL
8140: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
8150: 73 65 73 73 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20  sess_len..= 0;. 
8160: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e     Tcl_Obj *alpn
8170: 4f 62 6a 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  Obj..= NULL;.   
8180: 20 69 6e 74 20 73 73 6c 32 20 3d 20 30 2c 20 73   int ssl2 = 0, s
8190: 73 6c 33 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  sl3 = 0;.    int
81a0: 20 74 6c 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f   tls1 = 1, tls1_
81b0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20  1 = 1, tls1_2 = 
81c0: 31 2c 20 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20  1, tls1_3 = 1;. 
81d0: 20 20 20 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30     int proto = 0
81e0: 2c 20 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20  , level = -1;.  
81f0: 20 20 69 6e 74 20 76 65 72 69 66 79 20 3d 20 30    int verify = 0
8200: 2c 20 72 65 71 75 69 72 65 20 3d 20 30 2c 20 72  , require = 0, r
8210: 65 71 75 65 73 74 20 3d 20 31 2c 20 70 6f 73 74  equest = 1, post
8220: 5f 68 61 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a  _handshake = 0;.
8230: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
8240: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
8250: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
8260: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
8270: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
8280: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
8290: 0a 20 20 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23  .    tls1 = 0;.#
82a0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
82b0: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
82c0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
82d0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 74  NO_TLS1_1).    t
82e0: 6c 73 31 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_1 = 0;.#endi
82f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
8300: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
8310: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8320: 4c 53 31 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_2).    tls1_
8330: 32 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  2 = 0;.#endif.#i
8340: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
8350: 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_3) || defined(
8360: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
8370: 33 29 0a 20 20 20 20 74 6c 73 31 5f 33 20 3d 20  3).    tls1_3 = 
8380: 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  0;.#endif..    i
8390: 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09  f (objc < 2) {..
83a0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
83b0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
83c0: 2c 20 22 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69  , "channel ?opti
83d0: 6f 6e 73 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20  ons?");..return 
83e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
83f0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8400: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68  error();..    ch
8410: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
8420: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
8430: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
8440: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
8450: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
8460: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
8470: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8480: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
8490: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
84a0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
84b0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
84c0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
84d0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
84e0: 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69  an);..    for (i
84f0: 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62  dx = 2; idx < ob
8500: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 69 66  jc; idx++) {..if
8510: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
8520: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
8530: 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64  jv[idx], command
8540: 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  _opts, "option",
8550: 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f   0, &fn) != TCL_
8560: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
8570: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
8580: 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72  ../* Validate ar
8590: 67 20 68 61 73 20 76 61 6c 75 65 20 2a 2f 0a 09  g has value */..
85a0: 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a  if (++idx >= obj
85b0: 63 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  c) {..    Tcl_Ap
85c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
85d0: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72  p, "No value for
85e0: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d   option \"", com
85f0: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22  mand_opts[fn], "
8600: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  \"", (char *) NU
8610: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
8620: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
8630: 09 73 77 69 74 63 68 28 66 6e 29 20 7b 0a 09 63  .switch(fn) {..c
8640: 61 73 65 20 5f 6f 70 74 5f 61 6c 70 6e 3a 0a 09  ase _opt_alpn:..
8650: 20 20 20 20 61 6c 70 6e 4f 62 6a 20 3d 20 6f 62      alpnObj = ob
8660: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
8670: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
8680: 63 61 64 69 72 3a 0a 09 20 20 20 20 47 45 54 5f  cadir:..    GET_
8690: 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b  OPT_STRING(objv[
86a0: 69 64 78 5d 2c 20 43 41 70 61 74 68 2c 20 4e 55  idx], CApath, NU
86b0: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  LL);..    break;
86c0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 61 66 69  ..case _opt_cafi
86d0: 6c 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  le:..    GET_OPT
86e0: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
86f0: 5d 2c 20 43 41 66 69 6c 65 2c 20 4e 55 4c 4c 29  ], CAfile, NULL)
8700: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8710: 61 73 65 20 5f 6f 70 74 5f 63 65 72 74 3a 0a 09  ase _opt_cert:..
8720: 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59 54 45      GET_OPT_BYTE
8730: 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d  _ARRAY(objv[idx]
8740: 2c 20 63 65 72 74 2c 20 26 63 65 72 74 5f 6c 65  , cert, &cert_le
8750: 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  n);..    break;.
8760: 09 63 61 73 65 20 5f 6f 70 74 5f 63 65 72 74 66  .case _opt_certf
8770: 69 6c 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ile:..    GET_OP
8780: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
8790: 78 5d 2c 20 63 65 72 74 66 69 6c 65 2c 20 4e 55  x], certfile, NU
87a0: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  LL);..    break;
87b0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68  ..case _opt_ciph
87c0: 65 72 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63  er:..case _opt_c
87d0: 69 70 68 65 72 73 3a 0a 09 20 20 20 20 47 45 54  iphers:..    GET
87e0: 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76  _OPT_STRING(objv
87f0: 5b 69 64 78 5d 2c 20 63 69 70 68 65 72 73 2c 20  [idx], ciphers, 
8800: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61  NULL);..    brea
8810: 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 63 69  k;..case _opt_ci
8820: 70 68 65 72 73 75 69 74 65 3a 0a 09 20 20 20 20  phersuite:..    
8830: 47 45 54 5f 4f 50 54 5f 53 54 52 49 4e 47 28 6f  GET_OPT_STRING(o
8840: 62 6a 76 5b 69 64 78 5d 2c 20 63 69 70 68 65 72  bjv[idx], cipher
8850: 73 75 69 74 65 73 2c 20 4e 55 4c 4c 29 3b 0a 09  suites, NULL);..
8860: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
8870: 20 5f 6f 70 74 5f 63 6d 64 3a 0a 09 20 20 20 20   _opt_cmd:..    
8880: 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64  cmdObj = objv[id
8890: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  x];..    break;.
88a0: 09 63 61 73 65 20 5f 6f 70 74 5f 64 68 70 61 72  .case _opt_dhpar
88b0: 61 6d 73 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50  ams:..    GET_OP
88c0: 54 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64  T_STRING(objv[id
88d0: 78 5d 2c 20 44 48 70 61 72 61 6d 73 2c 20 4e 55  x], DHparams, NU
88e0: 4c 4c 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  LL);..    break;
88f0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a  ..case _opt_key:
8900: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 42 59  ..    GET_OPT_BY
8910: 54 45 5f 41 52 52 41 59 28 6f 62 6a 76 5b 69 64  TE_ARRAY(objv[id
8920: 78 5d 2c 20 6b 65 79 2c 20 26 6b 65 79 5f 6c 65  x], key, &key_le
8930: 6e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  n);..    break;.
8940: 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 66 69  .case _opt_keyfi
8950: 6c 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  le:..    GET_OPT
8960: 5f 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78  _STRING(objv[idx
8970: 5d 2c 20 6b 65 79 66 69 6c 65 2c 20 4e 55 4c 4c  ], keyfile, NULL
8980: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8990: 63 61 73 65 20 5f 6f 70 74 5f 6d 6f 64 65 6c 3a  case _opt_model:
89a0: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
89b0: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
89c0: 6d 6f 64 65 6c 2c 20 4e 55 4c 4c 29 3b 0a 09 20  model, NULL);.. 
89d0: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
89e0: 5f 6f 70 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09  _opt_password:..
89f0: 20 20 20 20 70 61 73 73 77 64 4f 62 6a 20 3d 20      passwdObj = 
8a00: 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20  objv[idx];..    
8a10: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
8a20: 74 5f 68 61 6e 64 73 68 61 6b 65 3a 0a 09 20 20  t_handshake:..  
8a30: 20 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f    GET_OPT_BOOL(o
8a40: 62 6a 76 5b 69 64 78 5d 2c 20 26 70 6f 73 74 5f  bjv[idx], &post_
8a50: 68 61 6e 64 73 68 61 6b 65 29 3b 0a 09 20 20 20  handshake);..   
8a60: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8a70: 70 74 5f 72 65 71 75 65 73 74 3a 0a 09 20 20 20  pt_request:..   
8a80: 20 47 45 54 5f 4f 50 54 5f 42 4f 4f 4c 28 6f 62   GET_OPT_BOOL(ob
8a90: 6a 76 5b 69 64 78 5d 2c 20 26 72 65 71 75 65 73  jv[idx], &reques
8aa0: 74 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  t);..    break;.
8ab0: 09 63 61 73 65 20 5f 6f 70 74 5f 72 65 71 75 69  .case _opt_requi
8ac0: 72 65 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54  re:..    GET_OPT
8ad0: 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64 78 5d 2c  _BOOL(objv[idx],
8ae0: 20 26 72 65 71 75 69 72 65 29 3b 0a 09 20 20 20   &require);..   
8af0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8b00: 70 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  pt_security_leve
8b10: 6c 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f  l:..    GET_OPT_
8b20: 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  INT(objv[idx], &
8b30: 6c 65 76 65 6c 29 3b 0a 09 20 20 20 20 62 72 65  level);..    bre
8b40: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 73  ak;..case _opt_s
8b50: 65 72 76 65 72 3a 0a 09 20 20 20 20 47 45 54 5f  erver:..    GET_
8b60: 4f 50 54 5f 42 4f 4f 4c 28 6f 62 6a 76 5b 69 64  OPT_BOOL(objv[id
8b70: 78 5d 2c 20 26 73 65 72 76 65 72 29 3b 0a 09 20  x], &server);.. 
8b80: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
8b90: 5f 6f 70 74 5f 73 65 72 76 65 72 6e 61 6d 65 3a  _opt_servername:
8ba0: 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 54  ..    GET_OPT_ST
8bb0: 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c 20  RING(objv[idx], 
8bc0: 73 65 72 76 65 72 6e 61 6d 65 2c 20 4e 55 4c 4c  servername, NULL
8bd0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8be0: 63 61 73 65 20 5f 6f 70 74 5f 73 65 73 73 69 6f  case _opt_sessio
8bf0: 6e 5f 69 64 3a 0a 09 20 20 20 20 47 45 54 5f 4f  n_id:..    GET_O
8c00: 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62  PT_BYTE_ARRAY(ob
8c10: 6a 76 5b 69 64 78 5d 2c 20 73 65 73 73 69 6f 6e  jv[idx], session
8c20: 5f 69 64 2c 20 26 73 65 73 73 5f 6c 65 6e 29 3b  _id, &sess_len);
8c30: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
8c40: 73 65 20 5f 6f 70 74 5f 73 73 6c 32 3a 0a 09 20  se _opt_ssl2:.. 
8c50: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f     GET_OPT_INT(o
8c60: 62 6a 76 5b 69 64 78 5d 2c 20 26 73 73 6c 32 29  bjv[idx], &ssl2)
8c70: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  ;..    break;..c
8c80: 61 73 65 20 5f 6f 70 74 5f 73 73 6c 33 3a 0a 09  ase _opt_ssl3:..
8c90: 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28      GET_OPT_INT(
8ca0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 73 73 6c 33  objv[idx], &ssl3
8cb0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09  );..    break;..
8cc0: 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31 3a 0a  case _opt_tls1:.
8cd0: 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54  .    GET_OPT_INT
8ce0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74 6c 73  (objv[idx], &tls
8cf0: 31 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  1);..    break;.
8d00: 09 63 61 73 65 20 5f 6f 70 74 5f 74 6c 73 31 31  .case _opt_tls11
8d10: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 49  :..    GET_OPT_I
8d20: 4e 54 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 74  NT(objv[idx], &t
8d30: 6c 73 31 5f 31 29 3b 0a 09 20 20 20 20 62 72 65  ls1_1);..    bre
8d40: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 74  ak;..case _opt_t
8d50: 6c 73 31 32 3a 0a 09 20 20 20 20 47 45 54 5f 4f  ls12:..    GET_O
8d60: 50 54 5f 49 4e 54 28 6f 62 6a 76 5b 69 64 78 5d  PT_INT(objv[idx]
8d70: 2c 20 26 74 6c 73 31 5f 32 29 3b 0a 09 20 20 20  , &tls1_2);..   
8d80: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
8d90: 70 74 5f 74 6c 73 31 33 3a 0a 09 20 20 20 20 47  pt_tls13:..    G
8da0: 45 54 5f 4f 50 54 5f 49 4e 54 28 6f 62 6a 76 5b  ET_OPT_INT(objv[
8db0: 69 64 78 5d 2c 20 26 74 6c 73 31 5f 33 29 3b 0a  idx], &tls1_3);.
8dc0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
8dd0: 65 20 5f 6f 70 74 5f 76 61 6c 69 64 61 74 65 3a  e _opt_validate:
8de0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 76 63 6d 64  ..case _opt_vcmd
8df0: 3a 0a 09 20 20 20 20 76 63 6d 64 20 3d 20 6f 62  :..    vcmd = ob
8e00: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72  jv[idx];..    br
8e10: 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  eak;..}.    }.. 
8e20: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09     if (request).
8e30: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
8e40: 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
8e50: 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  E | SSL_VERIFY_P
8e60: 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71  EER;.    if (req
8e70: 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29  uest && require)
8e80: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
8e90: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
8ea0: 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20  _PEER_CERT;.    
8eb0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
8ec0: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76  ost_handshake).v
8ed0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
8ee0: 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41  IFY_POST_HANDSHA
8ef0: 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69  KE;.    if (veri
8f00: 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79  fy == 0)..verify
8f10: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
8f20: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
8f30: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
8f40: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
8f50: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
8f60: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
8f70: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
8f80: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
8f90: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
8fa0: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
8fb0: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
8fc0: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
8fd0: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
8fe0: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
8ff0: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
9000: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
9010: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
9020: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
9030: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
9040: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
9050: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
9060: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
9070: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
9080: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
9090: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
90a0: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
90b0: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
90c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
90d0: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
90e0: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
90f0: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
9100: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
9110: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
9120: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
9130: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9140: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
9150: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
9160: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
9170: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
9180: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a  phersuites && !*
9190: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69  ciphersuites) ci
91a0: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20  phersuites    = 
91b0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
91c0: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
91d0: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
91e0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
91f0: 0a 20 20 20 20 69 66 20 28 43 41 70 61 74 68 20  .    if (CApath 
9200: 26 26 20 21 2a 43 41 70 61 74 68 29 09 20 20 20  && !*CApath).   
9210: 20 20 20 20 20 43 41 70 61 74 68 09 20 20 20 20       CApath.    
9220: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9230: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
9240: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
9250: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
9260: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
9270: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
9280: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
9290: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
92a0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
92b0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
92c0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
92d0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
92e0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
92f0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
9300: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
9310: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
9320: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
9330: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
9340: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
9350: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
9360: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
9370: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
9380: 28 63 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29  (cmdObj != NULL)
9390: 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47   {..(void) Tcl_G
93a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
93b0: 63 6d 64 4f 62 6a 2c 20 26 6c 65 6e 29 3b 0a 09  cmdObj, &len);..
93c0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
93d0: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
93e0: 63 6b 20 3d 20 63 6d 64 4f 62 6a 3b 0a 09 20 20  ck = cmdObj;..  
93f0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
9400: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
9410: 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  lback);..}.    }
9420: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
9430: 65 20 70 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20  e password */.  
9440: 20 20 69 66 20 28 70 61 73 73 77 64 4f 62 6a 20    if (passwdObj 
9450: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 28 76 6f 69  != NULL) {..(voi
9460: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
9470: 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 64 4f 62  FromObj(passwdOb
9480: 6a 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c  j, &len);..if (l
9490: 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65  en) {..    state
94a0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20  Ptr->password = 
94b0: 70 61 73 73 77 64 4f 62 6a 3b 0a 09 20 20 20 20  passwdObj;..    
94c0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
94d0: 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77  (statePtr->passw
94e0: 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  ord);..}.    }..
94f0: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
9500: 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64  validate command
9510: 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64   */.    if (vcmd
9520: 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f  ) {..(void) Tcl_
9530: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9540: 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69  (vcmd, &len);..i
9550: 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73  f (len) {..    s
9560: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
9570: 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49  vcmd;..    Tcl_I
9580: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
9590: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a  ePtr->vcmd);..}.
95a0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d      }..    if (m
95b0: 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  odel != NULL) {.
95c0: 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47  .int mode;../* G
95d0: 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63  et the "model" c
95e0: 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20  ontext */..chan 
95f0: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
9600: 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20  (interp, model, 
9610: 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61  &mode);..if (cha
9620: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
9630: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  l) NULL) {..    
9640: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
9650: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
9660: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9670: 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  OR;..}.../*.. * 
9680: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
9690: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
96a0: 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f  ost channel.. */
96b0: 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74  ..chan = Tcl_Get
96c0: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
96d0: 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43 68  ;..if (Tcl_GetCh
96e0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
96f0: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
9700: 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  pe()) {..    Tcl
9710: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9720: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
9730: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
9740: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
9750: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
9760: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
9770: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
9780: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
9790: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
97a0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
97b0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
97c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
97d0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
97e0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
97f0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
9800: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
9810: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
9820: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
9830: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
9840: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
9850: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
9860: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
9870: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
9880: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
9890: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
98a0: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09  (int) key_len,..
98b0: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c      (int) cert_l
98c0: 65 6e 2c 20 43 41 70 61 74 68 2c 20 43 41 66 69  en, CApath, CAfi
98d0: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70  le, ciphers, cip
98e0: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c  hersuites, level
98f0: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20  , DHparams)) == 
9900: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
9910: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
9920: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
9930: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9940: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ..}.    }..    s
9950: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63  tatePtr->ctx = c
9960: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  tx;..    /*.    
9970: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61   * We need to ma
9980: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
9990: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69   channel works i
99a0: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68  n binary (for th
99b0: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74  e.     * encrypt
99c0: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67  ion not to get g
99d0: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20  oofed up)..     
99e0: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74  * We only want t
99f0: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66  o adjust the buf
9a00: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32  fering in pre-v2
9a10: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65   channels, where
9a20: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61  .     * each cha
9a30: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63  nnel in the stac
9a40: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73  k maintained its
9a50: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20   own buffers..  
9a60: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53     */.    Tcl_DS
9a70: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
9a80: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
9a90: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
9aa0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
9ab0: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
9ac0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
9ad0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
9ae0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
9af0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
9b00: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
9b10: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
9b20: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
9b30: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
9b40: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65  -eofchar", &uppe
9b50: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
9b60: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
9b70: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
9b80: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64  p, chan, "-encod
9b90: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
9ba0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
9bb0: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
9bc0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9bd0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
9be0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
9bf0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
9c00: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
9c10: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
9c20: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
9c30: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
9c40: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
9c50: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
9c60: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
9c70: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
9c80: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20  ", "binary");.  
9c90: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
9ca0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
9cb0: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
9cc0: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64  , "true");.    d
9cd0: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e  printf("Consumin
9ce0: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73  g Tcl channel %s
9cf0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
9d00: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20  lName(chan));.  
9d10: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
9d20: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e   = Tcl_StackChan
9d30: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f  nel(interp, Tls_
9d40: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28  ChannelType(), (
9d50: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
9d60: 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44  ePtr,..(TCL_READ
9d70: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
9d80: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20  BLE), chan);.   
9d90: 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65   dprintf("Create
9da0: 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20  d channel named 
9db0: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
9dc0: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
9dd0: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66  ->self));.    if
9de0: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
9df0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
9e00: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20  ) NULL) {../*.. 
9e10: 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f  * No use of Tcl_
9e20: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62  EventuallyFree b
9e30: 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62  ecause no possib
9e40: 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e  le Tcl_Preserve.
9e50: 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28  .. */..Tls_Free(
9e60: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
9e70: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
9e80: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
9e90: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
9ea0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
9eb0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
9ec0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54  -translation", T
9ed0: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
9ee0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
9ef0: 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20  nslation));.    
9f00: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
9f10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
9f20: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65  tePtr->self, "-e
9f30: 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53  ncoding", Tcl_DS
9f40: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
9f50: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
9f60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
9f70: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
9f80: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
9f90: 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  elf, "-eofchar",
9fa0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
9fb0: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
9fc0: 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63  OFChar));.    Tc
9fd0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
9fe0: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
9ff0: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f  Ptr->self, "-blo
a000: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  cking", Tcl_DStr
a010: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
a020: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29  hannelBlocking))
a030: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
a040: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
a050: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
a060: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
a070: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
a080: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
a090: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
a0a0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
a0b0: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
a0c0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
a0d0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
a0e0: 67 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  g);..    /*.    
a0f0: 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a   * SSL Initializ
a100: 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20  ation.     */.  
a110: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20    statePtr->ssl 
a120: 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50  = SSL_new(stateP
a130: 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66  tr->ctx);.    if
a140: 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c   (!statePtr->ssl
a150: 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72  ) {../* SSL libr
a160: 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63  ary error */..Tc
a170: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a180: 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74  nterp, "couldn't
a190: 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73   construct ssl s
a1a0: 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45  ession: ", GET_E
a1b0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
a1c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a1d0: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a1e0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a1f0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49  , "IMPORT", "INI
a200: 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  T", "FAILED", (c
a210: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54  har *) NULL);..T
a220: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
a230: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74   statePtr);..ret
a240: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a250: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
a260: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d   host server nam
a270: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72  e */.    if (ser
a280: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53  vername) {../* S
a290: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e  ets the server n
a2a0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
a2b0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65  SNI) in ClientHe
a2c0: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
a2d0: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36  ../* Per RFC 606
a2e0: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  6, hostname is a
a2f0: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73   ASCII encoded s
a300: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46  tring, though RF
a310: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d  C 4366 says UTF-
a320: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  8. */..if (!SSL_
a330: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
a340: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
a350: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
a360: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
a370: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
a380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
a390: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66   SNI extension f
a3a0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
a3b0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
a3c0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a3d0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
a3e0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
a3f0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22   "IMPORT", "SNI"
a400: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
a410: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
a420: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
a430: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a440: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a450: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74  ROR;..}.../* Set
a460: 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65   hostname for pe
a470: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 68  er certificate h
a480: 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61  ostname verifica
a490: 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e  tion in clients.
a4a0: 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53  ..   Don't use S
a4b0: 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e  SL_set1_host sin
a4c0: 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61  ce it has limita
a4d0: 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21  tions. */..if (!
a4e0: 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74  SSL_add1_host(st
a4f0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72  atePtr->ssl, ser
a500: 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20  vername)) {..   
a510: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a520: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44  t(interp, "Set D
a530: 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c  NS hostname fail
a540: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
a550: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
a560: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
a570: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
a580: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
a590: 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d  MPORT", "HOSTNAM
a5a0: 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  E", "FAILED", (c
a5b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
a5c0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61     Tls_Free((cha
a5d0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
a5e0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
a5f0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
a600: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73  .    /* Resume s
a610: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  ession id */.   
a620: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20   if (session_id 
a630: 26 26 20 73 65 73 73 5f 6c 65 6e 20 3c 3d 20 53  && sess_len <= S
a640: 53 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c  SL_MAX_SID_CTX_L
a650: 45 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c  ENGTH) {../* SSL
a660: 5f 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a  _set_session() *
a670: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53  /..if (!SSL_SESS
a680: 49 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74  ION_set1_id_cont
a690: 65 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73  ext(SSL_get_sess
a6a0: 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ion(statePtr->ss
a6b0: 6c 29 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20  l), session_id, 
a6c0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 73  (unsigned int) s
a6d0: 65 73 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  ess_len)) {..   
a6e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a6f0: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d  t(interp, "Resum
a700: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64  e session failed
a710: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
a720: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
a730: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
a740: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
a750: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
a760: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c  ORT", "SESSION",
a770: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
a780: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
a790: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
a7a0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a7b0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a7c0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
a7d0: 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70 6c    /* Enable Appl
a7e0: 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50 72  ication-Layer Pr
a7f0: 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69  otocol Negotiati
a800: 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72 65  on. Examples are
a810: 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74 74  : http/1.0,..htt
a820: 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 66  p/1.1, h2, h3, f
a830: 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c 20  tp, imap, pop3, 
a840: 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d 70  xmpp-client, xmp
a850: 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c 20  p-server, mqtt, 
a860: 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 20  irc, etc. */.   
a870: 20 69 66 20 28 61 6c 70 6e 4f 62 6a 20 21 3d 20   if (alpnObj != 
a880: 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76  NULL) {../* Conv
a890: 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69  ert a TCL list i
a8a0: 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c  nto a protocol-l
a8b0: 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d  ist in wire-form
a8c0: 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20  at */..unsigned 
a8d0: 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70  char *protos, *p
a8e0: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
a8f0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a  protos_len = 0;.
a900: 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69  .Tcl_Size cnt, i
a910: 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f  ;..int j;..Tcl_O
a920: 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20  bj **list;...if 
a930: 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45  (Tcl_ListObjGetE
a940: 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20  lements(interp, 
a950: 61 6c 70 6e 4f 62 6a 2c 20 26 63 6e 74 2c 20 26  alpnObj, &cnt, &
a960: 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  list) != TCL_OK)
a970: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
a980: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a990: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
a9a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
a9b0: 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  ./* Determine th
a9c0: 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  e memory require
a9d0: 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74 6f 63  d for the protoc
a9e0: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f 72 20  ol-list */..for 
a9f0: 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e 74 3b  (i = 0; i < cnt;
aa00: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 6c   i++) {..    Tcl
aa10: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
aa20: 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65 6e 29  j(list[i], &len)
aa30: 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e 20 3e  ;..    if (len >
aa40: 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f 41 70   255) {...Tcl_Ap
aa50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
aa60: 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  p, "ALPN protoco
aa70: 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f 6e 67  l names too long
aa80: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
aa90: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f  );...Tcl_SetErro
aaa0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
aab0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
aac0: 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c  ALPN", "FAILED",
aad0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
aae0: 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 63 68 61  ...Tls_Free((cha
aaf0: 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  r *) statePtr);.
ab00: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ab10: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
ab20: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20  protos_len += 1 
ab30: 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a  + (int) len;..}.
ab40: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63  ../* Build the c
ab50: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c  omplete protocol
ab60: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73  -list */..protos
ab70: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f   = ckalloc(proto
ab80: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74  s_len);../* prot
ab90: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69  ocol-lists consi
aba0: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67  st of 8-bit leng
abb0: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74  th-prefixed, byt
abc0: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f  e strings */..fo
abd0: 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72  r (j = 0, p = pr
abe0: 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a  otos; j < cnt; j
abf0: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  ++) {..    char 
ac00: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  *str = Tcl_GetSt
ac10: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
ac20: 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [j], &len);..   
ac30: 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65   *p++ = (unsigne
ac40: 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20  d char) len;..  
ac50: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c    memcpy(p, str,
ac60: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
ac70: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09  .    p += len;..
ac80: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61  }.../* SSL_set_a
ac90: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73  lpn_protos makes
aca0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
acb0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
acc0: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
acd0: 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73  unction reverses
ace0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
acf0: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a  e convention */.
ad00: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70  .if (SSL_set_alp
ad10: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74  n_protos(statePt
ad20: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20  r->ssl, protos, 
ad30: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09  protos_len)) {..
ad40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ad50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
ad60: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73  t ALPN protocols
ad70: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
ad80: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
ad90: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
ada0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
adb0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
adc0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
add0: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
ade0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
adf0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
ae00: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
ae10: 0a 09 20 20 20 20 63 6b 66 72 65 65 28 70 72 6f  ..    ckfree(pro
ae20: 74 6f 73 29 3b 0a 09 20 20 20 20 72 65 74 75 72  tos);..    retur
ae30: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
ae40: 0a 09 2f 2a 20 53 74 6f 72 65 20 70 72 6f 74 6f  ../* Store proto
ae50: 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 09 73 74  cols list */..st
ae60: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
ae70: 20 70 72 6f 74 6f 73 3b 0a 09 73 74 61 74 65 50   protos;..stateP
ae80: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
ae90: 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20   protos_len;.   
aea0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65   } else {..state
aeb0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55  Ptr->protos = NU
aec0: 4c 4c 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  LL;..statePtr->p
aed0: 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 20  rotos_len = 0;. 
aee0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
aef0: 20 20 2a 20 53 53 4c 20 43 61 6c 6c 62 61 63 6b    * SSL Callback
af00: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 53 53  s.     */.    SS
af10: 4c 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 73  L_set_app_data(s
af20: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76  tatePtr->ssl, (v
af30: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
af40: 09 2f 2a 20 70 6f 69 6e 74 20 62 61 63 6b 20 74  ./* point back t
af50: 6f 20 75 73 20 2a 2f 0a 0a 20 20 20 20 53 53 4c  o us */..    SSL
af60: 5f 73 65 74 5f 76 65 72 69 66 79 28 73 74 61 74  _set_verify(stat
af70: 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65 72 69 66  ePtr->ssl, verif
af80: 79 2c 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63  y, VerifyCallbac
af90: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  k);.    SSL_set_
afa0: 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74  info_callback(st
afb0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66  atePtr->ssl, Inf
afc0: 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20  oCallback);..   
afd0: 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72   /* Callback for
afe0: 20 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f   observing proto
aff0: 63 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a  col messages */.
b000: 23 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f  #ifndef OPENSSL_
b010: 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20  NO_SSL_TRACE.   
b020: 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58   /* void SSL_CTX
b030: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
b040: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
b050: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
b060: 74 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64  tePtr);.    void
b070: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67   SSL_CTX_set_msg
b080: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
b090: 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65  tr->ctx, Message
b0a0: 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20  Callback); */.  
b0b0: 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61    SSL_set_msg_ca
b0c0: 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65  llback_arg(state
b0d0: 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20  Ptr->ssl, (void 
b0e0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20  *)statePtr);.   
b0f0: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
b100: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
b110: 73 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ssl, MessageCall
b120: 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  back);.#endif.. 
b130: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c     /* Create Tcl
b140: 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e  _Channel BIO Han
b150: 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74  dler */.    stat
b160: 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49  ePtr->p_bio.= BI
b170: 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50  O_new_tcl(stateP
b180: 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29  tr, BIO_NOCLOSE)
b190: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
b1a0: 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49  bio.= BIO_new(BI
b1b0: 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20  O_f_ssl());..   
b1c0: 20 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09   if (server) {..
b1d0: 2f 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61  /* Server callba
b1e0: 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  cks */..SSL_CTX_
b1f0: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
b200: 72 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50  rname_arg(stateP
b210: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a  tr->ctx, (void *
b220: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c  )statePtr);..SSL
b230: 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f  _CTX_set_tlsext_
b240: 73 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62  servername_callb
b250: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
b260: 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b  x, SNICallback);
b270: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c  ..SSL_CTX_set_cl
b280: 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74  ient_hello_cb(st
b290: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c  atePtr->ctx, Hel
b2a0: 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  loCallback, (voi
b2b0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
b2c0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
b2d0: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  otos != NULL) {.
b2e0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
b2f0: 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28  _alpn_select_cb(
b300: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41  statePtr->ctx, A
b310: 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  LPNCallback, (vo
b320: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
b330: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
b340: 20 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d      if (tls1_2 =
b350: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
b360: 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f   0) {...SSL_CTX_
b370: 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f  set_next_protos_
b380: 61 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74  advertised_cb(st
b390: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e  atePtr->ctx, NPN
b3a0: 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20  Callback, (void 
b3b0: 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  *)statePtr);..  
b3c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09    }.#endif..}...
b3d0: 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72  /* Enable server
b3e0: 20 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65   to send cert re
b3f0: 71 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64  quest after hand
b400: 73 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f  shake (TLS 1.3 o
b410: 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72  nly) */../* A wr
b420: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75  ite operation mu
b430: 73 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f  st take place fo
b440: 72 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74  r the Certificat
b450: 65 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a  e Request to be.
b460: 09 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20  .   sent to the 
b470: 63 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e  client, this can
b480: 20 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53   be done with SS
b490: 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29  L_do_handshake()
b4a0: 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73  . */..if (reques
b4b0: 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68  t && post_handsh
b4c0: 61 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b  ake && tls1_3) {
b4d0: 0a 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79  ..    SSL_verify
b4e0: 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e  _client_post_han
b4f0: 64 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d  dshake(statePtr-
b500: 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 73  >ssl);..}.../* s
b510: 65 74 20 61 75 74 6f 6d 61 74 69 63 20 63 75 72  et automatic cur
b520: 76 65 20 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a  ve selection */.
b530: 09 53 53 4c 5f 73 65 74 5f 65 63 64 68 5f 61 75  .SSL_set_ecdh_au
b540: 74 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  to(statePtr->ssl
b550: 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65 74 20 73  , 1);.../* Set s
b560: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
b570: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
b580: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
b590: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
b5a0: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
b5b0: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
b5c0: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
b5d0: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
b5e0: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
b5f0: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
b600: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
b610: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
b620: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
b630: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
b640: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
b650: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
b660: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
b670: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
b680: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
b690: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
b6a0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
b6b0: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
b6c0: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
b6d0: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
b6e0: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
b6f0: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
b700: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
b710: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
b720: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
b730: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
b740: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
b750: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
b760: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
b770: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
b780: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
b790: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
b7a0: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
b7b0: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
b7c0: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
b7d0: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
b7e0: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
b7f0: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
b800: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
b810: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
b820: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
b830: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 73  .    }.    SSL_s
b840: 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d  et_bio(statePtr-
b850: 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e  >ssl, statePtr->
b860: 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  p_bio, statePtr-
b870: 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f  >p_bio);.    BIO
b880: 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74  _set_ssl(statePt
b890: 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72  r->bio, statePtr
b8a0: 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  ->ssl, BIO_NOCLO
b8b0: 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  SE);..    /*.   
b8c0: 20 20 2a 20 45 6e 64 20 6f 66 20 53 53 4c 20 49    * End of SSL I
b8d0: 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  nit.     */.    
b8e0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
b8f0: 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ng %s", Tcl_GetC
b900: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
b910: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
b920: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
b930: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20  nterp, (char *) 
b940: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
b950: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  me(statePtr->sel
b960: 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  f), TCL_VOLATILE
b970: 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
b980: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69 6d 70 6f  ---. *. * Unimpo
b9e0: 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20  rtObjCmd --. *. 
b9f0: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
ba00: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 72   is invoked to r
ba10: 65 6d 6f 76 65 20 74 68 65 20 74 6f 70 6d 6f 73  emove the topmos
ba20: 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c 74 65 72  t channel filter
ba30: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
ba40: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
ba50: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
ba60: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
ba70: 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65  *.May modify the
ba80: 20 62 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20   behavior of an 
ba90: 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20  IO channel.. *. 
baa0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
bab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bae0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
baf0: 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f 62 6a 43  int.UnimportObjC
bb00: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
bb10: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
bb20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
bb30: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
bb40: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
bb50: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c  .    Tcl_Channel
bb60: 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63   chan;../* The c
bb70: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
bb80: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
bb90: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
bba0: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
bbb0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
bbc0: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
bbd0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
bbe0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
bbf0: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
bc00: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
bc10: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68  R;.    }..    ch
bc20: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  an = Tcl_GetChan
bc30: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  nel(interp, Tcl_
bc40: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
bc50: 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  ]), NULL);.    i
bc60: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
bc70: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
bc80: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
bc90: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
bca0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
bcb0: 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
bcc0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
bcd0: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
bce0: 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
bcf0: 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20 28 54 63  an);..    if (Tc
bd00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
bd10: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
bd20: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
bd30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bd40: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
bd50: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
bd60: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
bd70: 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20  an),..."\": not 
bd80: 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
bd90: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
bda0: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
bdb0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
bdc0: 4c 53 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c  LS", "UNIMPORT",
bdd0: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
bde0: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
bdf0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
be00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
be10: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73  .    if (Tcl_Uns
be20: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65  tackChannel(inte
be30: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c  rp, chan) == TCL
be40: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72  _ERROR) {..retur
be50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
be60: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54   }..    return T
be70: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
be80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
beb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bec0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e  ---. *. * CTX_In
bed0: 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20  it -- construct 
bee0: 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  a SSL_CTX instan
bef0: 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  ce. *. * Results
bf00: 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c  :. *.A valid SSL
bf10: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72  _CTX instance or
bf20: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64   NULL.. *. * Sid
bf30: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
bf40: 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e  nstructs SSL con
bf50: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
bf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfa0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53  ---. */.static S
bfb0: 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69  SL_CTX *.CTX_Ini
bfc0: 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  t(State *statePt
bfd0: 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c  r, int isServer,
bfe0: 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72   int proto, char
bff0: 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20   *keyfile, char 
c000: 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75  *certfile,.    u
c010: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
c020: 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  y, unsigned char
c030: 20 2a 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f   *cert, int key_
c040: 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65  len, int cert_le
c050: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
c060: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
c070: 65 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73  e, char *ciphers
c080: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75  , char *ciphersu
c090: 69 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ites, int level,
c0a0: 20 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29   char *DHparams)
c0b0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
c0c0: 70 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74  p *interp = stat
c0d0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
c0e0: 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d    SSL_CTX *ctx =
c0f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
c100: 53 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69  String ds;.    i
c110: 6e 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72  nt off = 0, abor
c120: 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c  t = 0;.    int l
c130: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b  oad_private_key;
c140: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
c150: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a  ETHOD *method;..
c160: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
c170: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
c180: 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41  !proto) {..Tcl_A
c190: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c1a0: 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72  rp, "no valid pr
c1b0: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22  otocol selected"
c1c0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c1d0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c1e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72      }..    /* cr
c1f0: 65 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74  eate SSL context
c200: 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
c210: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
c220: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
c230: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
c240: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
c250: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20  NSSL_NO_SSL2).  
c260: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
c270: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  oto, TLS_PROTO_S
c280: 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  SL2)) {..Tcl_App
c290: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
c2a0: 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c  , "SSL2 protocol
c2b0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
c2c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
c2d0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
c2e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
c2f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
c300: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
c310: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20  SSL_NO_SSL3).   
c320: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
c330: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
c340: 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L3)) {..Tcl_Appe
c350: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
c360: 20 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20   "SSL3 protocol 
c370: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
c380: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
c390: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
c3a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
c3b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
c3c0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
c3d0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20  SL_NO_TLS1).    
c3e0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
c3f0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
c400: 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  1)) {..Tcl_Appen
c410: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c420: 22 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f  "TLS 1.0 protoco
c430: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
c440: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c450: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c460: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
c470: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
c480: 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _1) || defined(O
c490: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
c4a0: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
c4b0: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c4c0: 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54  TO_TLS1_1)) {..T
c4d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c4e0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31  interp, "TLS 1.1
c4f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c500: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c510: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c520: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c530: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
c540: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  (NO_TLS1_2) || d
c550: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c560: 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66  O_TLS1_2).    if
c570: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
c580: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
c590: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
c5a0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
c5b0: 22 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f  "TLS 1.2 protoco
c5c0: 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22  l not supported"
c5d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
c5e0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
c5f0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66      }.#endif.#if
c600: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
c610: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
c620: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
c630: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
c640: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
c650: 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54  TO_TLS1_3)) {..T
c660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c670: 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33  interp, "TLS 1.3
c680: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
c690: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
c6a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
c6b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
c6c0: 6e 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f  ndif.    if (pro
c6d0: 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55  to == 0) {../* U
c6e0: 73 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f  se full range */
c6f0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
c700: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
c710: 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54  ctx, 0);..SSL_CT
c720: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
c730: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b  version(ctx, 0);
c740: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
c750: 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66  ch (proto) {.#if
c760: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
c770: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
c780: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
c790: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
c7a0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
c7b0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
c7c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a   TLS_PROTO_SSL2:
c7d0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
c7e0: 76 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76  ver ? SSLv2_serv
c7f0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53  er_method() : SS
c800: 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Lv2_client_metho
c810: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
c820: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
c830: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
c840: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c850: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
c860: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
c870: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  L3_METHOD).    c
c880: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
c890: 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L3:..method = is
c8a0: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73  Server ? SSLv3_s
c8b0: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
c8c0: 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv3_client_me
c8d0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
c8e0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
c8f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20  ned(NO_TLS1) && 
c900: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
c910: 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  _NO_TLS1) && !de
c920: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
c930: 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20  _TLS1_METHOD).  
c940: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
c950: 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d  _TLS1:..method =
c960: 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76   isServer ? TLSv
c970: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
c980: 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74  ) : TLSv1_client
c990: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
c9a0: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
c9b0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
c9c0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
c9d0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
c9e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
c9f0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
ca00: 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20  ETHOD).    case 
ca10: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
ca20: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
ca30: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73  rver ? TLSv1_1_s
ca40: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
ca50: 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f   TLSv1_1_client_
ca60: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
ca70: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
ca80: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
ca90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
caa0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
cab0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
cac0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
cad0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
cae0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a  LS_PROTO_TLS1_2:
caf0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
cb00: 76 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65  ver ? TLSv1_2_se
cb10: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
cb20: 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_2_client_m
cb30: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
cb40: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
cb50: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
cb60: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
cb70: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
cb80: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
cb90: 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73  O_TLS1_3:../* Us
cba0: 65 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65  e the generic me
cbb0: 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61  thod and constra
cbc0: 69 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20  int range after 
cbd0: 63 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74  context is creat
cbe0: 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20  ed */..method = 
cbf0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73  isServer ? TLS_s
cc00: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
cc10: 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68   TLS_client_meth
cc20: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
cc30: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
cc40: 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20  :../* Negotiate 
cc50: 68 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c  highest availabl
cc60: 65 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f  e SSL/TLS versio
cc70: 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  n */..method = i
cc80: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
cc90: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
cca0: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
ccb0: 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  d();.#if OPENSSL
ccc0: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
ccd0: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26  < 0x10100000L &&
cce0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
ccf0: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
cd00: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
cd10: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
cd20: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
cd30: 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20  O_SSL2)   ? 0 : 
cd40: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29  SSL_OP_NO_SSLv2)
cd50: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
cd60: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
cd70: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
cd80: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66  SL_NO_SSL3)..off
cd90: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
cda0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
cdb0: 4c 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  L3)   ? 0 : SSL_
cdc0: 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65  OP_NO_SSLv3);.#e
cdd0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
cde0: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
cdf0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
ce00: 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20  O_TLS1)..off |= 
ce10: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
ce20: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20  TLS_PROTO_TLS1) 
ce30: 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e    ? 0 : SSL_OP_N
ce40: 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66  O_TLSv1);.#endif
ce50: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
ce60: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
ce70: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
ce80: 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_1)..off |= 
ce90: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
cea0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
ceb0: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
cec0: 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64  O_TLSv1_1);.#end
ced0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
cee0: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
cef0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
cf00: 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c  O_TLS1_2)..off |
cf10: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
cf20: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
cf30: 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _2) ? 0 : SSL_OP
cf40: 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65  _NO_TLSv1_2);.#e
cf50: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
cf60: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
cf70: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
cf80: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66  _NO_TLS1_3)..off
cf90: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
cfa0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
cfb0: 53 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_3) ? 0 : SSL_
cfc0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a  OP_NO_TLSv1_3);.
cfd0: 23 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20  #endif..break;. 
cfe0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
cff0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
d000: 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f    ctx = SSL_CTX_
d010: 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20  new(method);.   
d020: 20 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65   if (!ctx) {..re
d030: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d040: 0a 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76  ..    if (getenv
d050: 28 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29  (SSLKEYLOGFILE))
d060: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
d070: 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28  keylog_callback(
d080: 63 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  ctx, KeyLogCallb
d090: 61 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  ack);.    }..#if
d0a0: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
d0b0: 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_3) && !defined
d0c0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d0d0: 5f 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74  _3).    if (prot
d0e0: 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  o == TLS_PROTO_T
d0f0: 4c 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54  LS1_3) {..SSL_CT
d100: 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f  X_set_min_proto_
d110: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
d120: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53  1_3_VERSION);..S
d130: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
d140: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
d150: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
d160: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
d170: 0a 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69  .    /* Force ci
d180: 70 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f  pher selection o
d190: 72 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a  rder by server *
d1a0: 2f 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72  /.    if (!isSer
d1b0: 76 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  ver) {..SSL_CTX_
d1c0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
d1d0: 20 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53   SSL_OP_CIPHER_S
d1e0: 45 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45  ERVER_PREFERENCE
d1f0: 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50  );.    }..#if OP
d200: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
d210: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
d220: 30 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61  0L.    OpenSSL_a
d230: 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d  dd_all_algorithm
d240: 73 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70  s(); /* Load cip
d250: 68 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73  hers and digests
d260: 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20   */.#endif..    
d270: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f  SSL_CTX_set_app_
d280: 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a  data(ctx, (void*
d290: 29 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d  )interp);./* rem
d2a0: 65 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70  ember the interp
d2b0: 72 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c  reter */.    SSL
d2c0: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
d2d0: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c  (ctx, SSL_OP_ALL
d2e0: 29 3b 09 2f 2a 20 61 6c 6c 20 53 53 4c 20 62 75  );./* all SSL bu
d2f0: 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a 2f  g workarounds */
d300: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
d310: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
d320: 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53 53  L_OP_NO_COMPRESS
d330: 49 4f 4e 29 3b 09 2f 2a 20 64 69 73 61 62 6c 65  ION);./* disable
d340: 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76 65   compression eve
d350: 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20 2a  n if supported *
d360: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
d370: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 6f  t_options(ctx, o
d380: 66 66 29 3b 09 09 2f 2a 20 64 69 73 61 62 6c 65  ff);../* disable
d390: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
d3a0: 6e 73 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ns */.#if OPENSS
d3b0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
d3c0: 20 3c 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   < 0x10101000L. 
d3d0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d     SSL_CTX_set_m
d3e0: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
d3f0: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 09 2f  E_AUTO_RETRY);./
d400: 2a 20 68 61 6e 64 6c 65 20 6e 65 77 20 68 61 6e  * handle new han
d410: 64 73 68 61 6b 65 73 20 69 6e 20 62 61 63 6b 67  dshakes in backg
d420: 72 6f 75 6e 64 2e 20 4f 6e 20 62 79 20 64 65 66  round. On by def
d430: 61 75 6c 74 20 69 6e 20 4f 70 65 6e 53 53 4c 20  ault in OpenSSL 
d440: 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65 6e 64 69 66  1.1.1. */.#endif
d450: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73  .    SSL_CTX_ses
d460: 73 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65  s_set_cache_size
d470: 28 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20  (ctx, 128);..   
d480: 20 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66   /* Set user def
d490: 69 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69  ined ciphers, ci
d4a0: 70 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64  pher suites, and
d4b0: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
d4c0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68  */.    if ((ciph
d4d0: 65 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  ers != NULL) && 
d4e0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
d4f0: 68 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69  her_list(ctx, ci
d500: 70 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41  phers)) {..Tcl_A
d510: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d520: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73  rp, "Set ciphers
d530: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
d540: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
d550: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
d560: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
d570: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
d580: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70    }.    if ((cip
d590: 68 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c  hersuites != NUL
d5a0: 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73  L) && !SSL_CTX_s
d5b0: 65 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28  et_ciphersuites(
d5c0: 63 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65  ctx, ciphersuite
d5d0: 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  s)) {..Tcl_Appen
d5e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d5f0: 22 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74  "Set cipher suit
d600: 65 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61  es failed: No va
d610: 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63  lid ciphers", (c
d620: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
d630: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
d640: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
d650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
d660: 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
d670: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65   */.    if (leve
d680: 6c 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20  l > -1 && level 
d690: 3c 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73  < 6) {../* SSL_s
d6a0: 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
d6b0: 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  l */..SSL_CTX_se
d6c0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
d6d0: 28 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20  (ctx, level);.  
d6e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
d6f0: 73 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a  some callbacks *
d700: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
d710: 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64  t_default_passwd
d720: 5f 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72  _cb(ctx, Passwor
d730: 64 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  dCallback);.    
d740: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
d750: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73  ult_passwd_cb_us
d760: 65 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69  erdata(ctx, (voi
d770: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a  d *)statePtr);..
d780: 20 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69      /* read a Di
d790: 66 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72  ffie-Hellman par
d7a0: 61 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72  ameters file, or
d7b0: 20 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69   use the built-i
d7c0: 6e 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c  n one */.    Tcl
d7d0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
d7e0: 29 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53  );.#ifdef OPENSS
d7f0: 4c 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28  L_NO_DH.    if (
d800: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
d810: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d820: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44  esult(interp, "D
d830: 48 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70  H parameter supp
d840: 6f 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  ort not availabl
d850: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
d860: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
d870: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
d880: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73  NULL;.    }.#els
d890: 65 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b  e.    {..DH* dh;
d8a0: 0a 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21  ..if (DHparams !
d8b0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42  = NULL) {..    B
d8c0: 49 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62  IO *bio;...    b
d8d0: 69 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c  io = BIO_new_fil
d8e0: 65 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20  e(F2N(DHparams, 
d8f0: 26 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20  &ds), "r");..   
d900: 20 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54   if (!bio) {...T
d910: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d920: 64 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  ds);...Tcl_Appen
d930: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d940: 22 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20  "Could not find 
d950: 44 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69  DH parameters fi
d960: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
d970: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
d980: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
d990: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
d9a0: 0a 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72  ..    dh = PEM_r
d9b0: 65 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73  ead_bio_DHparams
d9c0: 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  (bio, NULL, NULL
d9d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49  , NULL);..    BI
d9e0: 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20  O_free(bio);..  
d9f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
da00: 65 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20  e(&ds);..    if 
da10: 28 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70  (!dh) {...Tcl_Ap
da20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
da30: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65  p, "Could not re
da40: 61 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  ad DH parameters
da50: 20 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68   from file", (ch
da60: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
da70: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
da80: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
da90: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c  ..    }..    SSL
daa0: 5f 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28  _CTX_set_tmp_dh(
dab0: 63 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44  ctx, dh);..    D
dac0: 48 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20  H_free(dh);...} 
dad0: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55  else {..    /* U
dae0: 73 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48  se well known DH
daf0: 20 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74   parameters that
db00: 20 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73   have built-in s
db10: 75 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53  upport in OpenSS
db20: 4c 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53  L */..    if (!S
db30: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75  SL_CTX_set_dh_au
db40: 74 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09  to(ctx, 1)) {...
db50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
db60: 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20  (interp, "Could 
db70: 6e 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44  not enable set D
db80: 48 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45  H auto: ", GET_E
db90: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
dba0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
dbb0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
dbc0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
dbd0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
dbe0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
dbf0: 73 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63  set our certific
dc00: 61 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f  ate */.    load_
dc10: 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b  private_key = 0;
dc20: 0a 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c  .    if (certfil
dc30: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  e != NULL) {..lo
dc40: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
dc50: 20 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54   1;...if (SSL_CT
dc60: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
dc70: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
dc80: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
dc90: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
dca0: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
dcb0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
dcc0: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
dcd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
dce0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
dcf0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
dd00: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
dd10: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
dd20: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
dd30: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
dd40: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
dd50: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
dd60: 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72  LL;..}..Tcl_DStr
dd70: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20  ingFree(&ds);.. 
dd80: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65     } else if (ce
dd90: 72 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c  rt != NULL) {..l
dda0: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
ddb0: 3d 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54  = 1;..if (SSL_CT
ddc0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
ddd0: 65 5f 41 53 4e 31 28 63 74 78 2c 20 63 65 72 74  e_ASN1(ctx, cert
dde0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30  _len, cert) <= 0
ddf0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
de00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
de10: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
de20: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
de30: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
de40: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
de50: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
de60: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
de70: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
de80: 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
de90: 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61  .certfile = (cha
dea0: 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61  r*)X509_get_defa
deb0: 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b  ult_cert_file();
dec0: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
ded0: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
dee0: 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c  ile(ctx, certfil
def0: 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f  e, SSL_FILETYPE_
df00: 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66  PEM) <= 0) {.#if
df10: 20 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   0..    Tcl_Appe
df20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
df30: 20 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20   "unable to use 
df40: 64 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63  default certific
df50: 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74  ate file ", cert
df60: 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45  file, ": ",...GE
df70: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
df80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
df90: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65  .    SSL_CTX_fre
dfa0: 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74  e(ctx);..    ret
dfb0: 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  urn NULL;.#endif
dfc0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
dfd0: 2a 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74  * set our privat
dfe0: 65 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20  e key */.    if 
dff0: 28 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65  (load_private_ke
e000: 79 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c  y) {..if (keyfil
e010: 65 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79  e == NULL && key
e020: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
e030: 20 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66   keyfile = certf
e040: 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65  ile;..}...if (ke
e050: 79 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  yfile != NULL) {
e060: 0a 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65  ..    /* get the
e070: 20 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73   private key ass
e080: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
e090: 73 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  s certificate */
e0a0: 0a 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c  ..    if (keyfil
e0b0: 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b  e == NULL) {...k
e0c0: 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c  eyfile = certfil
e0d0: 65 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  e;..    }...    
e0e0: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
e0f0: 50 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28  PrivateKey_file(
e100: 63 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65  ctx, F2N(keyfile
e110: 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45  , &ds), SSL_FILE
e120: 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20  TYPE_PEM) <= 0) 
e130: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
e140: 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66  ree(&ds);.../* f
e150: 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72  lush the passphr
e160: 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20  ase which might 
e170: 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72  be left in the r
e180: 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53  esult */...Tcl_S
e190: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
e1a0: 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49   NULL, TCL_STATI
e1b0: 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  C);...Tcl_Append
e1c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
e1d0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75  unable to set pu
e1e0: 62 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c  blic key file ",
e1f0: 20 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09   keyfile, " ",..
e200: 09 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41  .    GET_ERR_REA
e210: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
e220: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
e230: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
e240: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
e250: 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
e260: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d  ngFree(&ds);...}
e270: 20 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d   else if (key !=
e280: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66   NULL) {..    if
e290: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72   (SSL_CTX_use_Pr
e2a0: 69 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56  ivateKey_ASN1(EV
e2b0: 50 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c  P_PKEY_RSA, ctx,
e2c0: 20 6b 65 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d   key,key_len) <=
e2d0: 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c 75 73 68   0) {.../* flush
e2e0: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
e2f0: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
e300: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
e310: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
e320: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
e330: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
e340: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e350: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
e360: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
e370: 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 52 52   key: ", GET_ERR
e380: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
e390: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
e3a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
e3b0: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
e3c0: 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f 77      }..}../* Now
e3d0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61 20   we know that a 
e3e0: 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61 76  key and cert hav
e3f0: 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69 6e  e been set again
e400: 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20 63  st.. * the SSL c
e410: 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28 21  ontext */..if (!
e420: 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70 72  SSL_CTX_check_pr
e430: 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29 20  ivate_key(ctx)) 
e440: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
e450: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
e460: 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f 65  "private key doe
e470: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
e480: 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62 6c  certificate publ
e490: 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20 20  ic key",....    
e4a0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e4b0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
e4c0: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
e4d0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20  turn NULL;..}.  
e4e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
e4f0: 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74 20 6c  to use default l
e500: 6f 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65  ocation and file
e510: 20 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65   for Certificate
e520: 20 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20   Authority (CA) 
e530: 63 65 72 74 69 66 69 63 61 74 65 73 2e 20 54 68  certificates. Th
e540: 65 0a 20 20 20 20 20 2a 20 76 65 72 69 66 79 20  e.     * verify 
e550: 70 61 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63  path and store c
e560: 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e  an be overridden
e570: 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54   by the SSL_CERT
e580: 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68  _DIR env var. Th
e590: 65 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 61  e verify file ca
e5a0: 6e 0a 20 20 20 20 20 2a 20 62 65 20 6f 76 65 72  n.     * be over
e5b0: 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53  ridden by the SS
e5c0: 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20  L_CERT_FILE env 
e5d0: 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  var. */.    if (
e5e0: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
e5f0: 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
e600: 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74  s(ctx)) {..abort
e610: 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
e620: 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20  * Overrides for 
e630: 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 61  the CA verify pa
e640: 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20  th and file */. 
e650: 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c     {.#if OPENSSL
e660: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
e670: 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69  < 0x30000000L..i
e680: 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c  f (CApath != NUL
e690: 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e  L || CAfile != N
e6a0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
e6b0: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20  DString ds1;..  
e6c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
e6d0: 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69  t(&ds1);...    i
e6e0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
e6f0: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
e700: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
e710: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70  e, &ds), F2N(CAp
e720: 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09  ath, &ds1))) {..
e730: 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
e740: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e750: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e760: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
e770: 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a  (&ds1);...    /*
e780: 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73   Set list of CAs
e790: 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65   to send to clie
e7a0: 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  nt when requesti
e7b0: 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74  ng a client cert
e7c0: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
e7d0: 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63  /* https://sourc
e7e0: 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73  eforge.net/p/tls
e7f0: 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20  /bugs/57/ */..  
e800: 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c    /* XXX:TODO: L
e810: 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70  et the user supp
e820: 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69  ly values here i
e830: 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68  nstead of someth
e840: 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20  ing that exists 
e850: 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  on the filesyste
e860: 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f  m */..    STACK_
e870: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
e880: 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
e890: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
e8a0: 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
e8b0: 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63  ds));..    if (c
e8c0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
e8d0: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65  ) {...SSL_CTX_se
e8e0: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
e8f0: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
e900: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
e910: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
e920: 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 69  s);..}..#else..i
e930: 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c  f (CApath != NUL
e940: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
e950: 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
e960: 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e 28  fy_dir(ctx, F2N(
e970: 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20 7b  CApath, &ds))) {
e980: 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20  ...abort++;..   
e990: 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
e9a0: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
e9b0: 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20  ..if (CAfile != 
e9c0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
e9d0: 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
e9e0: 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c 20  erify_file(ctx, 
e9f0: 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
ea00: 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
ea10: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
ea20: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
ea30: 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
ea40: 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
ea50: 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
ea60: 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
ea70: 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
ea80: 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f  e */..    STACK_
ea90: 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
eaa0: 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
eab0: 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
eac0: 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
ead0: 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63  ds));..    if (c
eae0: 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
eaf0: 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65  ) {...SSL_CTX_se
eb00: 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
eb10: 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
eb20: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
eb30: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
eb40: 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20  s);..}.#endif.  
eb50: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
eb60: 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  ctx;.}.../*. *--
eb70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebb0: 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62  -. *. * StatusOb
ebc0: 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
ebd0: 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63  ertificate for c
ebe0: 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e 0a 20  onnected peer.. 
ebf0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
ec00: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
ec10: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
ec20: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
ec30: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
ec40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ec70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
ec80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 74 61  /.static int.Sta
ec90: 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  tusObjCmd(Client
eca0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
ecb0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
ecc0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
ecd0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
ece0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74 61 74  jv[]) {.    Stat
ecf0: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20  e *statePtr;.   
ed00: 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20 20 20   X509 *peer;.   
ed10: 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
ed20: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  ;.    Tcl_Channe
ed30: 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68 61 72  l chan;.    char
ed40: 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a   *channelName, *
ed50: 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69 6e 74  ciphers;.    int
ed60: 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e 73 74   mode;.    const
ed70: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ed80: 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73 69 67  proto;.    unsig
ed90: 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20  ned int len;.   
eda0: 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b 0a 20   int nid, res;. 
edb0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
edc0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
edd0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
ede0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20     if (objc < 2 
edf0: 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c 20 28  || objc > 3 || (
ee00: 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21 73 74  objc == 3 && !st
ee10: 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74 72 69  rcmp(Tcl_GetStri
ee20: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c  ng(objv[1]), "-l
ee30: 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63 6c 5f  ocal"))) {..Tcl_
ee40: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ee50: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
ee60: 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65 6c 22  -local? channel"
ee70: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
ee80: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
ee90: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20   /* Get channel 
eea0: 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 6e 65  Id */.    channe
eeb0: 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  lName = Tcl_GetS
eec0: 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62 6a 63  tring(objv[(objc
eed0: 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29 5d 29   == 2 ? 1 : 2)])
eee0: 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ;.    chan = Tcl
eef0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
ef00: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  rp, channelName,
ef10: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
ef20: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
ef30: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
ef40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ef50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
ef60: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
ef70: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
ef80: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
ef90: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
efa0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
efb0: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
efc0: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
efd0: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
efe0: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
eff0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f000: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
f010: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
f020: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
f030: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
f040: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
f050: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63  ar *) NULL);..Tc
f060: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
f070: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 53  nterp, "TLS", "S
f080: 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e 45 4c  TATUS", "CHANNEL
f090: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63  ", "INVALID", (c
f0a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
f0b0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65  .    }.    state
f0d0: 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 20  Ptr = (State *) 
f0e0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
f0f0: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
f100: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 65  ;..    /* Get ce
f110: 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 70 65  rtificate for pe
f120: 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a 20 20  er or self */.  
f130: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
f140: 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67   {..peer = SSL_g
f150: 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66 69 63  et_peer_certific
f160: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
f170: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
f180: 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74  ..peer = SSL_get
f190: 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
f1a0: 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
f1b0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 58   }..    /* Get X
f1c0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
f1d0: 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20 28  info */.    if (
f1e0: 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72 20  peer) {..objPtr 
f1f0: 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62 6a  = Tls_NewX509Obj
f200: 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29 3b 0a  (interp, peer);.
f210: 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20  .if (objc == 2) 
f220: 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  {..    X509_free
f230: 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65  (peer);..    pee
f240: 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20  r = NULL;..}.   
f250: 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74   } else {..objPt
f260: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
f270: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
f280: 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20   }..    /* Peer 
f290: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50  name */.    LAPP
f2a0: 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
f2b0: 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d  objPtr, "peernam
f2c0: 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65  e", SSL_get0_pee
f2d0: 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  rname(statePtr->
f2e0: 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c  ssl), -1);.    L
f2f0: 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
f300: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74  p, objPtr, "sbit
f310: 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68  s", SSL_get_ciph
f320: 65 72 5f 62 69 74 73 28 73 74 61 74 65 50 74 72  er_bits(statePtr
f330: 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a  ->ssl, NULL));..
f340: 20 20 20 20 63 69 70 68 65 72 73 20 3d 20 28 63      ciphers = (c
f350: 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70  har*)SSL_get_cip
f360: 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73  her(statePtr->ss
f370: 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  l);.    LAPPEND_
f380: 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
f390: 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69  tr, "cipher", ci
f3a0: 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20  phers, -1);..   
f3b0: 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65 20 58   /* Verify the X
f3c0: 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65 20  509 certificate 
f3d0: 70 72 65 73 65 6e 74 65 64 20 62 79 20 74 68 65  presented by the
f3e0: 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50   peer */.    LAP
f3f0: 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
f400: 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
f410: 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76  Result",..X509_v
f420: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
f430: 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f  _string(SSL_get_
f440: 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74  verify_result(st
f450: 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d  atePtr->ssl)), -
f460: 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  1);..    /* Veri
f470: 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d  fy mode */.    m
f480: 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65  ode = SSL_get_ve
f490: 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50  rify_mode(stateP
f4a0: 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66  tr->ssl);.    if
f4b0: 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
f4c0: 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41  RIFY_NONE) {..LA
f4d0: 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
f4e0: 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66  , objPtr, "verif
f4f0: 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20  yMode", "none", 
f500: 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  -1);.    } else 
f510: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74  {..Tcl_Obj *list
f520: 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  ObjPtr = Tcl_New
f530: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
f540: 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  ;..if (mode && S
f550: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20  SL_VERIFY_PEER) 
f560: 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  {..    Tcl_ListO
f570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
f580: 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50  interp, listObjP
f590: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
f5a0: 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29  gObj("peer", -1)
f5b0: 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20  );..}..if (mode 
f5c0: 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41  && SSL_VERIFY_FA
f5d0: 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45  IL_IF_NO_PEER_CE
f5e0: 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  RT) {..    Tcl_L
f5f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f600: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
f610: 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
f620: 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69  tringObj("fail i
f630: 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c  f no peer cert",
f640: 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
f650: 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
f660: 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b  Y_CLIENT_ONCE) {
f670: 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
f680: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
f690: 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
f6a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
f6b0: 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65  Obj("client once
f6c0: 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
f6d0: 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
f6e0: 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41  IFY_POST_HANDSHA
f6f0: 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c  KE) {..    Tcl_L
f700: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f710: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
f720: 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  ObjPtr, Tcl_NewS
f730: 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68  tringObj("post h
f740: 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b  andshake", -1));
f750: 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a  ..}..LAPPEND_OBJ
f760: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
f770: 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c   "verifyMode", l
f780: 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d  istObjPtr).    }
f790: 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
f7a0: 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20  mode depth */.  
f7b0: 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
f7c0: 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76  terp, objPtr, "v
f7d0: 65 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c  erifyDepth", SSL
f7e0: 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74  _get_verify_dept
f7f0: 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  h(statePtr->ssl)
f800: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72  );..    /* Repor
f810: 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
f820: 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
f830: 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74  ult of the negot
f840: 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53  iation */.    SS
f850: 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65  L_get0_alpn_sele
f860: 63 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73  cted(statePtr->s
f870: 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  sl, &proto, &len
f880: 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
f890: 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
f8a0: 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72  r, "alpn", (char
f8b0: 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53   *)proto, (Tcl_S
f8c0: 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c  ize) len);.    L
f8d0: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
f8e0: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
f8f0: 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76  ocol", SSL_get_v
f900: 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d  ersion(statePtr-
f910: 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  >ssl), -1);..   
f920: 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f   /* Valid for no
f930: 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20  n-RSA signature 
f940: 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20  and TLS 1.3 */. 
f950: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
f960: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  ) {..res = SSL_g
f970: 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72  et_peer_signatur
f980: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
f990: 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
f9a0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
f9b0: 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72  SSL_get_signatur
f9c0: 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
f9d0: 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
f9e0: 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
f9f0: 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c  {nid = 0;}.    L
fa00: 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
fa10: 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e  p, objPtr, "sign
fa20: 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74  atureHashAlgorit
fa30: 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  hm", OBJ_nid2ln(
fa40: 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  nid), -1);..    
fa50: 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b  if (objc == 2) {
fa60: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
fa70: 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 74  peer_signature_t
fa80: 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ype_nid(statePtr
fa90: 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
faa0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
fab0: 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  = SSL_get_signat
fac0: 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61  ure_type_nid(sta
fad0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64  tePtr->ssl, &nid
fae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  );.    }.    if 
faf0: 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b  (!res) {nid = 0;
fb00: 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  }.    LAPPEND_ST
fb10: 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
fb20: 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70 65  , "signatureType
fb30: 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
fb40: 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 54 63  d), -1);..    Tc
fb50: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
fb60: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
fb70: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
fb80: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
fb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fbd0: 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e   *. * Connection
fbe0: 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  InfoObjCmd -- re
fbf0: 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  turn connection 
fc00: 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53  info from OpenSS
fc10: 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
fc20: 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63  :. *.A list of c
fc30: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20  onnection info. 
fc40: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
fc50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
fc90: 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74  atic int Connect
fca0: 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c  ionInfoObjCmd(Cl
fcb0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
fcc0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
fcd0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
fce0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
fcf0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
fd00: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
fd10: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
fd20: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
fd30: 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  on */.    State 
fd40: 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
fd50: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
fd60: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
fd70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
fd80: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
fd90: 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b   const SSL *ssl;
fda0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43  .    const SSL_C
fdb0: 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20  IPHER *cipher;. 
fdc0: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53     const SSL_SES
fdd0: 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20  SION *session;. 
fde0: 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20     const EVP_MD 
fdf0: 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  *md;.    (void) 
fe00: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
fe10: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
fe20: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
fe30: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
fe40: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
fe50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
fe60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
fe70: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
fe80: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
fe90: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fea0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
feb0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
fec0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
fed0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
fee0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
fef0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
ff00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
ff10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
ff20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
ff30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
ff40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
ff50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
ff60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
ff70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
ff80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ff90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
ffa0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
ffb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
ffc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
ffd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
ffe0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
fff0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
10000 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
10010 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22  S", "CONNECTION"
10020 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
10030 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
10040 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
10050 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10060 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
10070 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10080 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20   NULL);..    /* 
10090 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  Connection info 
100a0 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20  */.    statePtr 
100b0 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
100c0 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
100d0 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20  eData(chan);.   
100e0 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d   ssl = statePtr-
100f0 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73  >ssl;.    if (ss
10100 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  l != NULL) {../*
10110 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74   connection stat
10120 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
10130 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10140 2c 20 22 73 74 61 74 65 22 2c 20 53 53 4c 5f 73  , "state", SSL_s
10150 74 61 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67  tate_string_long
10160 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  (ssl), -1);.../*
10170 20 47 65 74 20 53 4e 49 20 72 65 71 75 65 73 74   Get SNI request
10180 65 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a  ed server name *
10190 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
101a0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
101b0 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c  servername", SSL
101c0 5f 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28  _get_servername(
101d0 73 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45  ssl, TLSEXT_NAME
101e0 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c  TYPE_host_name),
101f0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70   -1);.../* Get p
10200 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50  rotocol */..LAPP
10210 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10220 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f  objPtr, "protoco
10230 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73  l", SSL_get_vers
10240 69 6f 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  ion(ssl), -1);..
10250 09 2f 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f  ./* Renegotiatio
10260 6e 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41  n allowed */..LA
10270 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
10280 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65  p, objPtr, "rene
10290 67 6f 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65  gotiation_allowe
102a0 64 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75  d", SSL_get_secu
102b0 72 65 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e  re_renegotiation
102c0 5f 73 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29  _support((SSL *)
102d0 20 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74   ssl));.../* Get
102e0 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
102f0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28  */..LAPPEND_INT(
10300 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10310 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22  "security_level"
10320 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69  , SSL_get_securi
10330 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a  ty_level(ssl));.
10340 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66  ../* Session inf
10350 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  o */..LAPPEND_BO
10360 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
10370 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73  r, "session_reus
10380 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e  ed", SSL_session
10390 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a  _reused(ssl));..
103a0 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e  ./* Is server in
103b0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  fo */..LAPPEND_B
103c0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
103d0 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c  tr, "is_server",
103e0 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73   SSL_is_server(s
103f0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54  sl));.../* Is DT
10400 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  LS */..LAPPEND_B
10410 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
10420 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53  tr, "is_dtls", S
10430 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29  SL_is_dtls(ssl))
10440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10450 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a 20  Cipher info */. 
10460 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c 5f     cipher = SSL_
10470 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70 68  get_current_ciph
10480 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20  er(ssl);.    if 
10490 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c 29  (cipher != NULL)
104a0 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55 46   {..char buf[BUF
104b0 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e 74  SIZ] = {0};..int
104c0 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73 3b   bits, alg_bits;
104d0 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61 6d  .../* Cipher nam
104e0 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54  e */..LAPPEND_ST
104f0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
10500 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c 5f  , "cipher", SSL_
10510 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28  CIPHER_get_name(
10520 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
10530 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20 63  /* RFC name of c
10540 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
10550 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10560 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64 5f  jPtr, "standard_
10570 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48 45  name", SSL_CIPHE
10580 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28  R_standard_name(
10590 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
105a0 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65 20  /* OpenSSL name 
105b0 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  of cipher */..LA
105c0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
105d0 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e 73  , objPtr, "opens
105e0 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53 53  sl_name", OPENSS
105f0 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53 53  L_cipher_name(SS
10600 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
10610 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29 2c  d_name(cipher)),
10620 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62 65   -1);.../* numbe
10630 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74 73  r of secret bits
10640 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65 72   used for cipher
10650 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c 5f   */..bits = SSL_
10660 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73 28  CIPHER_get_bits(
10670 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69 74  cipher, &alg_bit
10680 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54  s);..LAPPEND_INT
10690 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
106a0 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c 20   "secret_bits", 
106b0 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
106c0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
106d0 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f 62  tr, "algorithm_b
106e0 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29 3b  its", alg_bits);
106f0 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69 73  ../* alg_bits is
10700 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63 72   actual key secr
10710 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65 20  et bits. If use 
10720 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74 20  bits and secret 
10730 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74 73  (algorithm) bits
10740 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68 65   differ,..   the
10750 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69 74   rest of the bit
10760 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e 65  s are fixed, i.e
10770 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65 78  . for limited ex
10780 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62 69  port ciphers (bi
10790 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f 2a  ts < 56) */.../*
107a0 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63 68   Indicates which
107b0 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63 6f   SSL/TLS protoco
107c0 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74 20  l version first 
107d0 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70 68  defined the ciph
107e0 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  er */..LAPPEND_S
107f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10800 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e 22  r, "min_version"
10810 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
10820 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72 29  _version(cipher)
10830 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70 68  , -1);.../* Ciph
10840 65 72 20 4e 49 44 2c 20 64 69 67 65 73 74 20 4e  er NID, digest N
10850 49 44 20 28 6e 6f 6e 65 20 66 6f 72 20 41 45 41  ID (none for AEA
10860 44 20 63 69 70 68 65 72 20 73 75 69 74 65 73 29  D cipher suites)
10870 2c 20 4b 65 79 20 45 78 63 68 61 6e 67 65 20 4e  , Key Exchange N
10880 49 44 2c 20 61 6e 64 20 61 75 74 68 65 6e 74 69  ID, and authenti
10890 63 61 74 69 6f 6e 20 4e 49 44 20 2a 2f 0a 09 4c  cation NID */..L
108a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
108b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
108c0 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  erNID", (char *)
108d0 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
108e0 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72  IPHER_get_cipher
108f0 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
10900 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
10910 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10920 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63   "digestNID", (c
10930 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
10940 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
10950 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65  digest_nid(ciphe
10960 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
10970 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10980 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61  bjPtr, "keyExcha
10990 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ngeNID", (char *
109a0 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
109b0 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69  CIPHER_get_kx_ni
109c0 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
109d0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
109e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
109f0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44  uthenticationNID
10a00 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e  ", (char *)OBJ_n
10a10 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52  id2ln(SSL_CIPHER
10a20 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69  _get_auth_nid(ci
10a30 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
10a40 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e  * message authen
10a50 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20  tication code - 
10a60 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28  Cipher is AEAD (
10a70 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43  e.g. GCM or ChaC
10a80 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f  ha20/Poly1305) o
10a90 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74  r not */../* Aut
10aa0 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79  henticated Encry
10ab0 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63  ption with assoc
10ac0 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44  iated data (AEAD
10ad0 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50  ) check */..LAPP
10ae0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
10af0 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
10b00 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43  _is_aead", SSL_C
10b10 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69  IPHER_is_aead(ci
10b20 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 47 65 74  pher));.../* Get
10b30 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63 69 66 69   OpenSSL-specifi
10b40 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e 41 20 49  c ID, not IANA I
10b50 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  D */..LAPPEND_IN
10b60 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
10b70 2c 20 22 63 69 70 68 65 72 5f 69 64 22 2c 20 28  , "cipher_id", (
10b80 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f  int) SSL_CIPHER_
10b90 67 65 74 5f 69 64 28 63 69 70 68 65 72 29 29 3b  get_id(cipher));
10ba0 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74 65 20 49  .../* Two-byte I
10bb0 44 20 75 73 65 64 20 69 6e 20 74 68 65 20 54 4c  D used in the TL
10bc0 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66 20 74 68  S protocol of th
10bd0 65 20 67 69 76 65 6e 20 63 69 70 68 65 72 20 2a  e given cipher *
10be0 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69  /..LAPPEND_INT(i
10bf0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10c00 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c 20 28 69  protocol_id", (i
10c10 6e 74 29 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  nt) SSL_CIPHER_g
10c20 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69 64 28 63  et_protocol_id(c
10c30 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 65  ipher));.../* Te
10c40 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69 6f  xtual descriptio
10c50 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72 2e  n of the cipher.
10c60 20 49 6e 63 6c 75 64 65 73 3a 20 63 69 70 68 65   Includes: ciphe
10c70 72 20 6e 61 6d 65 2c 20 70 72 6f 74 6f 63 6f 6c  r name, protocol
10c80 20 76 65 72 73 69 6f 6e 2c 20 6b 65 79 0a 09 20   version, key.. 
10c90 20 20 65 78 63 68 61 6e 67 65 2c 20 61 75 74 68    exchange, auth
10ca0 65 6e 74 69 63 61 74 69 6f 6e 2c 20 73 79 6d 6d  entication, symm
10cb0 65 74 72 69 63 20 65 6e 63 72 79 70 74 69 6f 6e  etric encryption
10cc0 20 6d 65 74 68 6f 64 2c 20 6d 65 73 73 61 67 65   method, message
10cd0 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20   authentication 
10ce0 63 6f 64 65 20 2a 2f 0a 09 69 66 20 28 53 53 4c  code */..if (SSL
10cf0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
10d00 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
10d10 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
10d20 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
10d30 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10d40 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
10d50 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
10d60 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 69 67 65 73  );..}.../* Diges
10d70 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68  t used during th
10d80 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68  e SSL/TLS handsh
10d90 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74  ake when using t
10da0 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d  he cipher. */..m
10db0 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67  d = SSL_CIPHER_g
10dc0 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  et_handshake_dig
10dd0 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41  est(cipher);..LA
10de0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10df0 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73  , objPtr, "hands
10e00 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63  hake_digest", (c
10e10 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d  har *)EVP_MD_nam
10e20 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 20 20 20 20  e(md), -1);.    
10e30 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  }..    /* Sessio
10e40 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65  n info */.    se
10e50 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f  ssion = SSL_get_
10e60 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20  session(ssl);.  
10e70 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d    if (session !=
10e80 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20   NULL) {..const 
10e90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74  unsigned char *t
10ea0 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c  icket;..size_t l
10eb0 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69  en2;..unsigned i
10ec0 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20  nt ulen;..const 
10ed0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73  unsigned char *s
10ee0 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74  ession_id, *prot
10ef0 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  o;..unsigned cha
10f00 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58  r buffer[SSL_MAX
10f10 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
10f20 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74  TH];.../* Report
10f30 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
10f40 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
10f50 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e  lt of the ALPN n
10f60 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53  egotiation */..S
10f70 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
10f80 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65  alpn_selected(se
10f90 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26  ssion, &proto, &
10fa0 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
10fb0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10fc0 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
10fd0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c  r *) proto, (Tcl
10fe0 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
10ff0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
11000 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
11010 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11020 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69  he NPN negotiati
11030 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45  on */.#ifdef USE
11040 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e  _NPN..SSL_get0_n
11050 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69  ext_proto_negoti
11060 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f  ated(ssl, &proto
11070 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
11080 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11090 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63  bjPtr, "npn", (c
110a0 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54  har *) proto, (T
110b0 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
110c0 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75  #endif.../* Resu
110d0 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f  mable session */
110e0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
110f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11100 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f  resumable", SSL_
11110 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d  SESSION_is_resum
11120 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a  able(session));.
11130 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61  ../* Session sta
11140 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73  rt time (seconds
11150 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f   since epoch) */
11160 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69  ..LAPPEND_LONG(i
11170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11180 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c  start_time", SSL
11190 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
111a0 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  e(session));.../
111b0 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  * Timeout value 
111c0 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69  - SSL_CTX_get_ti
111d0 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64  meout (in second
111e0 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c  s) */..LAPPEND_L
111f0 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ONG(interp, objP
11200 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53  tr, "timeout", S
11210 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
11220 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29  imeout(session))
11230 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69  ;.../* Session i
11240 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20  d - TLSv1.2 and 
11250 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73  below only */..s
11260 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
11270 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73  SESSION_get_id(s
11280 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
11290 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
112a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
112b0 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65  "session_id", se
112c0 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
112d0 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a  ize) ulen);.../*
112e0 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74   Session context
112f0 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20   */..session_id 
11300 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  = SSL_SESSION_ge
11310 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65  t0_id_context(se
11320 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09  ssion, &ulen);..
11330 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
11340 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11350 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22  session_context"
11360 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54  , session_id, (T
11370 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a  cl_Size) ulen);.
11380 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63  ../* Session tic
11390 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c  ket - client onl
113a0 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f  y */..SSL_SESSIO
113b0 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65  N_get0_ticket(se
113c0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
113d0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
113e0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
113f0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
11400 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74  _ticket", ticket
11410 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
11420 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e  2);.../* Session
11430 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65   ticket lifetime
11440 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64   hint (in second
11450 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c  s) */..LAPPEND_L
11460 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ONG(interp, objP
11470 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20  tr, "lifetime", 
11480 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
11490 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f  ticket_lifetime_
114a0 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a  hint(session));.
114b0 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20  ../* Ticket app 
114c0 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  data */.#if OPEN
114d0 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
114e0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
114f0 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
11500 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74  t0_ticket_appdat
11510 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a  a((SSL_SESSION *
11520 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b  ) session, &tick
11530 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50  et, &len2);..LAP
11540 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
11550 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63  rp, objPtr, "tic
11560 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74  ket_app_data", t
11570 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65  icket, (Tcl_Size
11580 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a  ) len2);.#endif.
11590 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20  ../* Get master 
115a0 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53  key */..len2 = S
115b0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d  SL_SESSION_get_m
115c0 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f  aster_key(sessio
115d0 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d  n, buffer, SSL_M
115e0 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45  AX_MASTER_KEY_LE
115f0 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  NGTH);..LAPPEND_
11600 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
11610 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b  bjPtr, "master_k
11620 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63  ey", buffer, (Tc
11630 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
11640 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20  ./* Compression 
11650 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20  id */..unsigned 
11660 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53  int id = SSL_SES
11670 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73  SION_get_compres
11680 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09  s_id(session);..
11690 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
116a0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d  rp, objPtr, "com
116b0 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64  pression_id", id
116c0 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a   == 1 ? "zlib" :
116d0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20   "none", -1);.  
116e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70    }..    /* Comp
116f0 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  ression info */.
11700 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e      if (ssl != N
11710 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41  ULL) {.#ifdef HA
11720 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49  VE_SSL_COMPRESSI
11730 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d  ON..const COMP_M
11740 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78  ETHOD *comp, *ex
11750 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f  pn;..comp = SSL_
11760 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70  get_current_comp
11770 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65  ression(ssl);..e
11780 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  xpn = SSL_get_cu
11790 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28  rrent_expansion(
117a0 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f  ssl);...LAPPEND_
117b0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
117c0 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e  tr, "compression
117d0 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f  ", comp ? SSL_CO
117e0 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70  MP_get_name(comp
117f0 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b  ) : "none", -1);
11800 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11810 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65  terp, objPtr, "e
11820 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20  xpansion", expn 
11830 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e  ? SSL_COMP_get_n
11840 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e  ame(expn) : "non
11850 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09  e", -1);.#else..
11860 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11870 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d  rp, objPtr, "com
11880 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65  pression", "none
11890 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44  ", -1);..LAPPEND
118a0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
118b0 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22  Ptr, "expansion"
118c0 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23  , "none", -1);.#
118d0 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
118e0 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20   /* Server info 
118f0 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d  */.    {..long m
11900 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65  ode = SSL_CTX_ge
11910 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f  t_session_cache_
11920 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63  mode(statePtr->c
11930 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b  tx);..char *msg;
11940 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53  ...if (mode & SS
11950 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46  L_SESS_CACHE_OFF
11960 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
11970 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  off";..} else if
11980 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
11990 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20  S_CACHE_CLIENT) 
119a0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c  {..    msg = "cl
119b0 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69  ient";..} else i
119c0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
119d0 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29  SS_CACHE_SERVER)
119e0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73   {..    msg = "s
119f0 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20  erver";..} else 
11a00 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
11a10 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20  ESS_CACHE_BOTH) 
11a20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f  {..    msg = "bo
11a30 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  th";..} else {..
11a40 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f      msg = "unkno
11a50 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44  wn";..}..LAPPEND
11a60 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11a70 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61  Ptr, "session_ca
11a80 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20  che_mode", msg, 
11a90 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  -1);.    }..    
11aa0 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20  /* CA List */.  
11ab0 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65    /* IF not a se
11ac0 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53  rver, same as SS
11ad0 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c  L_get0_peer_CA_l
11ae0 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73  ist. If server s
11af0 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67  ame as SSL_CTX_g
11b00 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
11b10 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72  t */.    listPtr
11b20 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
11b30 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  j(0, NULL);.    
11b40 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41  STACK_OF(X509_NA
11b50 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20  ME) *ca_list;.  
11b60 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d    if ((ca_list =
11b70 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f   SSL_get_client_
11b80 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d  CA_list(ssl)) !=
11b90 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
11ba0 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 0a  uffer[BUFSIZ];..
11bb0 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b  .for (int i = 0;
11bc0 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d   i < sk_X509_NAM
11bd0 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20  E_num(ca_list); 
11be0 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39  i++) {..    X509
11bf0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
11c00 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65  _X509_NAME_value
11c10 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20  (ca_list, i);.. 
11c20 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09     if (name) {..
11c30 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69  .X509_NAME_oneli
11c40 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c  ne(name, buffer,
11c50 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f   BUFSIZ);...Tcl_
11c60 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11c70 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
11c80 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
11c90 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
11ca0 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  1));..    }..}. 
11cb0 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
11cc0 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
11cd0 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c  Ptr, "caList", l
11ce0 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50  istPtr);.    LAP
11cf0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11d00 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
11d10 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f  Count", sk_X509_
11d20 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
11d30 29 29 3b 0a 0a 0a 20 20 20 20 54 63 6c 5f 53 65  ));...    Tcl_Se
11d40 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11d50 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
11d60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11d70 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
11d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
11dc0 2a 20 4d 69 73 63 4f 62 6a 43 6d 64 20 2d 2d 20  * MiscObjCmd -- 
11dd0 6d 69 73 63 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a  misc commands. *
11de0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
11df0 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
11e00 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64  esult.. *. * Sid
11e10 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f  e effects:. *.No
11e20 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
11e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
11e70 0a 73 74 61 74 69 63 20 69 6e 74 0a 4d 69 73 63  .static int.Misc
11e80 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
11e90 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
11ea0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11eb0 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
11ec0 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
11ed0 5d 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ]) {.    static 
11ee0 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d  const char *comm
11ef0 61 6e 64 73 20 5b 5d 20 3d 20 7b 20 22 72 65 71  ands [] = { "req
11f00 22 2c 20 22 73 74 72 72 65 71 22 2c 20 4e 55 4c  ", "strreq", NUL
11f10 4c 20 7d 3b 0a 20 20 20 20 65 6e 75 6d 20 63 6f  L };.    enum co
11f20 6d 6d 61 6e 64 20 7b 20 43 5f 52 45 51 2c 20 43  mmand { C_REQ, C
11f30 5f 53 54 52 52 45 51 2c 20 43 5f 44 55 4d 4d 59  _STRREQ, C_DUMMY
11f40 20 7d 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65   };.    Tcl_Size
11f50 20 63 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 73   cmd;.    int is
11f60 53 74 72 3b 0a 20 20 20 20 63 68 61 72 20 62 75  Str;.    char bu
11f70 66 66 65 72 5b 31 36 33 38 34 5d 3b 0a 20 20 20  ffer[16384];.   
11f80 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
11f90 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
11fa0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
11fb0 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b   if (objc < 2) {
11fc0 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
11fd0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
11fe0 6a 76 2c 20 22 73 75 62 63 6f 6d 6d 61 6e 64 20  jv, "subcommand 
11ff0 3f 61 72 67 73 3f 22 29 3b 0a 09 72 65 74 75 72  ?args?");..retur
12000 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
12010 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47   }.    if (Tcl_G
12020 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
12030 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
12040 63 6f 6d 6d 61 6e 64 73 2c 20 22 63 6f 6d 6d 61  commands, "comma
12050 6e 64 22 2c 20 30 2c 20 26 63 6d 64 29 20 21 3d  nd", 0, &cmd) !=
12060 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
12070 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12080 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
12090 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
120a0 20 69 73 53 74 72 20 3d 20 28 63 6d 64 20 3d 3d   isStr = (cmd ==
120b0 20 43 5f 53 54 52 52 45 51 29 3b 0a 20 20 20 20   C_STRREQ);.    
120c0 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 63 6f  switch ((enum co
120d0 6d 6d 61 6e 64 29 20 63 6d 64 29 20 7b 0a 09 63  mmand) cmd) {..c
120e0 61 73 65 20 43 5f 52 45 51 3a 0a 09 63 61 73 65  ase C_REQ:..case
120f0 20 43 5f 53 54 52 52 45 51 3a 20 7b 0a 09 20 20   C_STRREQ: {..  
12100 20 20 45 56 50 5f 50 4b 45 59 20 2a 70 6b 65 79    EVP_PKEY *pkey
12110 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39  =NULL;..    X509
12120 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b 0a 09 20 20   *cert=NULL;..  
12130 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a 6e 61 6d    X509_NAME *nam
12140 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 54 63 6c  e=NULL;..    Tcl
12150 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76 3b 0a 09 20  _Obj **listv;.. 
12160 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 69 73 74     Tcl_Size list
12170 63 3b 0a 09 20 20 20 20 69 6e 74 20 69 3b 0a 0a  c;..    int i;..
12180 09 20 20 20 20 42 49 4f 20 2a 6f 75 74 3d 4e 55  .    BIO *out=NU
12190 4c 4c 3b 0a 0a 09 20 20 20 20 63 68 61 72 20 2a  LL;...    char *
121a0 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54 3d 22 22 2c  k_C="",*k_ST="",
121b0 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f 3d 22 22 2c  *k_L="",*k_O="",
121c0 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f 43 4e 3d 22  *k_OU="",*k_CN="
121d0 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22 22 3b 0a 09  ",*k_Email="";..
121e0 20 20 20 20 63 68 61 72 20 2a 6b 65 79 6f 75 74      char *keyout
121f0 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74 72 3b 0a 09  ,*pemout,*str;..
12200 20 20 20 20 69 6e 74 20 6b 65 79 73 69 7a 65 2c      int keysize,
12210 73 65 72 69 61 6c 3d 30 2c 64 61 79 73 3d 33 36  serial=0,days=36
12220 35 3b 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  5;..#if OPENSSL_
12230 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
12240 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
12250 20 20 42 49 47 4e 55 4d 20 2a 62 6e 65 20 3d 20    BIGNUM *bne = 
12260 4e 55 4c 4c 3b 0a 09 20 20 20 20 52 53 41 20 2a  NULL;..    RSA *
12270 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6c 73  rsa = NULL;.#els
12280 65 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  e..    EVP_PKEY_
12290 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
122a0 0a 23 65 6e 64 69 66 0a 0a 09 20 20 20 20 69 66  .#endif...    if
122b0 20 28 28 6f 62 6a 63 3c 35 29 20 7c 7c 20 28 6f   ((objc<5) || (o
122c0 62 6a 63 3e 36 29 29 20 7b 0a 09 09 54 63 6c 5f  bjc>6)) {...Tcl_
122d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
122e0 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 6b  erp, 2, objv, "k
122f0 65 79 73 69 7a 65 20 6b 65 79 66 69 6c 65 20 63  eysize keyfile c
12300 65 72 74 66 69 6c 65 20 3f 69 6e 66 6f 3f 22 29  ertfile ?info?")
12310 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
12320 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  RROR;..    }... 
12330 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
12340 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
12350 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b 65 79 73 69   objv[2], &keysi
12360 7a 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ze) != TCL_OK) {
12370 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
12380 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ROR;..    }..   
12390 20 6b 65 79 6f 75 74 3d 54 63 6c 5f 47 65 74 53   keyout=Tcl_GetS
123a0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
123b0 09 20 20 20 20 70 65 6d 6f 75 74 3d 54 63 6c 5f  .    pemout=Tcl_
123c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34  GetString(objv[4
123d0 5d 29 3b 0a 09 20 20 20 20 69 66 20 28 69 73 53  ]);..    if (isS
123e0 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 56  tr) {...Tcl_SetV
123f0 61 72 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74  ar(interp,keyout
12400 2c 22 22 2c 30 29 3b 0a 09 09 54 63 6c 5f 53 65  ,"",0);...Tcl_Se
12410 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
12420 75 74 2c 22 22 2c 30 29 3b 0a 09 20 20 20 20 7d  ut,"",0);..    }
12430 0a 0a 09 20 20 20 20 69 66 20 28 6f 62 6a 63 3e  ...    if (objc>
12440 3d 36 29 20 7b 0a 09 09 69 66 20 28 54 63 6c 5f  =6) {...if (Tcl_
12450 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e  ListObjGetElemen
12460 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  ts(interp, objv[
12470 35 5d 2c 20 26 6c 69 73 74 63 2c 20 26 6c 69 73  5], &listc, &lis
12480 74 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tv) != TCL_OK) {
12490 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
124a0 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09  L_ERROR;...}....
124b0 69 66 20 28 28 6c 69 73 74 63 25 32 29 20 21 3d  if ((listc%2) !=
124c0 20 30 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f   0) {...    Tcl_
124d0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
124e0 2c 22 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 6c 69  ,"Information li
124f0 73 74 20 6d 75 73 74 20 68 61 76 65 20 65 76 65  st must have eve
12500 6e 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  n number of argu
12510 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29 3b 0a 09 09  ments",NULL);...
12520 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12530 52 52 4f 52 3b 0a 09 09 7d 0a 09 09 66 6f 72 20  RROR;...}...for 
12540 28 69 3d 30 3b 20 69 3c 6c 69 73 74 63 3b 20 69  (i=0; i<listc; i
12550 2b 3d 32 29 20 7b 0a 09 09 20 20 20 20 73 74 72  +=2) {...    str
12560 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
12570 69 73 74 76 5b 69 5d 29 3b 0a 09 09 20 20 20 20  istv[i]);...    
12580 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
12590 64 61 79 73 22 29 3d 3d 30 29 20 7b 0a 09 09 09  days")==0) {....
125a0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
125b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73  omObj(interp,lis
125c0 74 76 5b 69 2b 31 5d 2c 26 64 61 79 73 29 21 3d  tv[i+1],&days)!=
125d0 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72  TCL_OK)....    r
125e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
125f0 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
12600 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 73 65   (strcmp(str,"se
12610 72 69 61 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09  rial")==0) {....
12620 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72  if (Tcl_GetIntFr
12630 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6c 69 73  omObj(interp,lis
12640 74 76 5b 69 2b 31 5d 2c 26 73 65 72 69 61 6c 29  tv[i+1],&serial)
12650 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20 20 20  !=TCL_OK)....   
12660 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12670 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  R;...    } else 
12680 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
12690 43 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43  C")==0) {....k_C
126a0 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
126b0 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
126c0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
126d0 63 6d 70 28 73 74 72 2c 22 53 54 22 29 3d 3d 30  cmp(str,"ST")==0
126e0 29 20 7b 0a 09 09 09 6b 5f 53 54 3d 54 63 6c 5f  ) {....k_ST=Tcl_
126f0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
12700 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
12710 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
12720 74 72 2c 22 4c 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"L")==0) {...
12730 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_L=Tcl_GetStri
12740 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
12750 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
12760 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 22 29  (strcmp(str,"O")
12770 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 3d 54 63  ==0) {....k_O=Tc
12780 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
12790 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
127a0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
127b0 28 73 74 72 2c 22 4f 55 22 29 3d 3d 30 29 20 7b  (str,"OU")==0) {
127c0 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c 5f 47 65 74  ....k_OU=Tcl_Get
127d0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
127e0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
127f0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
12800 22 43 4e 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "CN")==0) {....k
12810 5f 43 4e 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _CN=Tcl_GetStrin
12820 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
12830 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
12840 73 74 72 63 6d 70 28 73 74 72 2c 22 45 6d 61 69  strcmp(str,"Emai
12850 6c 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 45  l")==0) {....k_E
12860 6d 61 69 6c 3d 54 63 6c 5f 47 65 74 53 74 72 69  mail=Tcl_GetStri
12870 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
12880 09 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
12890 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
128a0 69 6e 74 65 72 70 2c 22 55 6e 6b 6e 6f 77 6e 20  interp,"Unknown 
128b0 70 61 72 61 6d 65 74 65 72 22 2c 4e 55 4c 4c 29  parameter",NULL)
128c0 3b 0a 09 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  ;....return TCL_
128d0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 0a 09  ERROR;...    }..
128e0 09 7d 0a 09 20 20 20 20 7d 0a 0a 23 69 66 20 4f  .}..    }..#if O
128f0 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
12900 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
12910 30 30 4c 0a 09 20 20 20 20 62 6e 65 20 3d 20 42  00L..    bne = B
12920 4e 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 72 73  N_new();..    rs
12930 61 20 3d 20 52 53 41 5f 6e 65 77 28 29 3b 0a 09  a = RSA_new();..
12940 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 50      pkey = EVP_P
12950 4b 45 59 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20  KEY_new();..    
12960 69 66 20 28 62 6e 65 20 3d 3d 20 4e 55 4c 4c 20  if (bne == NULL 
12970 7c 7c 20 72 73 61 20 3d 3d 20 4e 55 4c 4c 20 7c  || rsa == NULL |
12980 7c 20 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c  | pkey == NULL |
12990 7c 20 21 42 4e 5f 73 65 74 5f 77 6f 72 64 28 62  | !BN_set_word(b
129a0 6e 65 2c 52 53 41 5f 46 34 29 20 7c 7c 0a 09 09  ne,RSA_F4) ||...
129b0 21 52 53 41 5f 67 65 6e 65 72 61 74 65 5f 6b 65  !RSA_generate_ke
129c0 79 5f 65 78 28 72 73 61 2c 20 6b 65 79 73 69 7a  y_ex(rsa, keysiz
129d0 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c 29 20 7c 7c  e, bne, NULL) ||
129e0 20 21 45 56 50 5f 50 4b 45 59 5f 61 73 73 69 67   !EVP_PKEY_assig
129f0 6e 5f 52 53 41 28 70 6b 65 79 2c 20 72 73 61 29  n_RSA(pkey, rsa)
12a00 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66  ) {...EVP_PKEY_f
12a10 72 65 65 28 70 6b 65 79 29 3b 0a 09 09 2f 2a 20  ree(pkey);.../* 
12a20 52 53 41 5f 66 72 65 65 28 72 73 61 29 3b 20 66  RSA_free(rsa); f
12a30 72 65 65 64 20 62 79 20 45 56 50 5f 50 4b 45 59  reed by EVP_PKEY
12a40 5f 66 72 65 65 20 2a 2f 0a 09 09 42 4e 5f 66 72  _free */...BN_fr
12a50 65 65 28 62 6e 65 29 3b 0a 23 65 6c 73 65 0a 09  ee(bne);.#else..
12a60 20 20 20 20 70 6b 65 79 20 3d 20 45 56 50 5f 52      pkey = EVP_R
12a70 53 41 5f 67 65 6e 28 28 75 6e 73 69 67 6e 65 64  SA_gen((unsigned
12a80 20 69 6e 74 29 20 6b 65 79 73 69 7a 65 29 3b 0a   int) keysize);.
12a90 09 20 20 20 20 63 74 78 20 3d 20 45 56 50 5f 50  .    ctx = EVP_P
12aa0 4b 45 59 5f 43 54 58 5f 6e 65 77 28 70 6b 65 79  KEY_CTX_new(pkey
12ab0 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20  ,NULL);..    if 
12ac0 28 70 6b 65 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c  (pkey == NULL ||
12ad0 20 63 74 78 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20   ctx == NULL || 
12ae0 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e  !EVP_PKEY_keygen
12af0 5f 69 6e 69 74 28 63 74 78 29 20 7c 7c 0a 09 09  _init(ctx) ||...
12b00 21 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65  !EVP_PKEY_CTX_se
12b10 74 5f 72 73 61 5f 6b 65 79 67 65 6e 5f 62 69 74  t_rsa_keygen_bit
12b20 73 28 63 74 78 2c 20 6b 65 79 73 69 7a 65 29 20  s(ctx, keysize) 
12b30 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65 79  || !EVP_PKEY_key
12b40 67 65 6e 28 63 74 78 2c 20 26 70 6b 65 79 29 29  gen(ctx, &pkey))
12b50 20 7b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72   {...EVP_PKEY_fr
12b60 65 65 28 70 6b 65 79 29 3b 0a 09 09 45 56 50 5f  ee(pkey);...EVP_
12b70 50 4b 45 59 5f 43 54 58 5f 66 72 65 65 28 63 74  PKEY_CTX_free(ct
12b80 78 29 3b 0a 23 65 6e 64 69 66 0a 09 09 54 63 6c  x);.#endif...Tcl
12b90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
12ba0 70 2c 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74  p,"Error generat
12bb0 69 6e 67 20 70 72 69 76 61 74 65 20 6b 65 79 22  ing private key"
12bc0 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e  ,NULL);...return
12bd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
12be0 20 7d 20 65 6c 73 65 20 7b 0a 09 09 69 66 20 28   } else {...if (
12bf0 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20 6f  isStr) {...    o
12c00 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
12c10 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20 50  _mem());...    P
12c20 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69  EM_write_bio_Pri
12c30 76 61 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79  vateKey(out,pkey
12c40 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c  ,NULL,NULL,0,NUL
12c50 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 69  L,NULL);...    i
12c60 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
12c70 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
12c80 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
12c90 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
12ca0 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
12cb0 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
12cc0 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65 79  etVar(interp,key
12cd0 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
12ce0 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
12cf0 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
12d00 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
12d10 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
12d20 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
12d30 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
12d40 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
12d50 75 74 2c 6b 65 79 6f 75 74 29 3b 0a 09 09 20 20  ut,keyout);...  
12d60 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
12d70 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 70  PrivateKey(out,p
12d80 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c  key,NULL,NULL,0,
12d90 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  NULL,NULL);...  
12da0 20 20 2f 2a 20 50 45 4d 5f 77 72 69 74 65 5f 62    /* PEM_write_b
12db0 69 6f 5f 52 53 41 50 72 69 76 61 74 65 4b 65 79  io_RSAPrivateKey
12dc0 28 6f 75 74 2c 20 72 73 61 2c 20 4e 55 4c 4c 2c  (out, rsa, NULL,
12dd0 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 2c 20   NULL, 0, NULL, 
12de0 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09 20 20 20 20  NULL); */...    
12df0 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74  BIO_free_all(out
12e00 29 3b 0a 09 20 09 7d 0a 0a 09 09 69 66 20 28 28  );.. .}....if ((
12e10 63 65 72 74 3d 58 35 30 39 5f 6e 65 77 28 29 29  cert=X509_new())
12e20 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20  ==NULL) {...    
12e30 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
12e40 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e 65  terp,"Error gene
12e50 72 61 74 69 6e 67 20 63 65 72 74 69 66 69 63 61  rating certifica
12e60 74 65 20 72 65 71 75 65 73 74 22 2c 4e 55 4c 4c  te request",NULL
12e70 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45  );...    EVP_PKE
12e80 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69  Y_free(pkey);.#i
12e90 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
12ea0 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30  N_NUMBER < 0x300
12eb0 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f  00000L...    BN_
12ec0 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69  free(bne);.#endi
12ed0 66 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  f...    return T
12ee0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
12ef0 09 58 35 30 39 5f 73 65 74 5f 76 65 72 73 69 6f  .X509_set_versio
12f00 6e 28 63 65 72 74 2c 32 29 3b 0a 09 09 41 53 4e  n(cert,2);...ASN
12f10 31 5f 49 4e 54 45 47 45 52 5f 73 65 74 28 58 35  1_INTEGER_set(X5
12f20 30 39 5f 67 65 74 5f 73 65 72 69 61 6c 4e 75 6d  09_get_serialNum
12f30 62 65 72 28 63 65 72 74 29 2c 73 65 72 69 61 6c  ber(cert),serial
12f40 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
12f50 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
12f60 6f 74 42 65 66 6f 72 65 28 63 65 72 74 29 2c 30  otBefore(cert),0
12f70 29 3b 0a 09 09 58 35 30 39 5f 67 6d 74 69 6d 65  );...X509_gmtime
12f80 5f 61 64 6a 28 58 35 30 39 5f 67 65 74 6d 5f 6e  _adj(X509_getm_n
12f90 6f 74 41 66 74 65 72 28 63 65 72 74 29 2c 28 6c  otAfter(cert),(l
12fa0 6f 6e 67 29 36 30 2a 36 30 2a 32 34 2a 64 61 79  ong)60*60*24*day
12fb0 73 29 3b 0a 09 09 58 35 30 39 5f 73 65 74 5f 70  s);...X509_set_p
12fc0 75 62 6b 65 79 28 63 65 72 74 2c 70 6b 65 79 29  ubkey(cert,pkey)
12fd0 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35 30 39 5f 67  ;....name=X509_g
12fe0 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65 28  et_subject_name(
12ff0 63 65 72 74 29 3b 0a 0a 09 09 58 35 30 39 5f 4e  cert);....X509_N
13000 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
13010 5f 74 78 74 28 6e 61 6d 65 2c 22 43 22 2c 20 4d  _txt(name,"C", M
13020 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
13030 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
13040 72 20 2a 29 20 6b 5f 43 2c 20 2d 31 2c 20 2d 31  r *) k_C, -1, -1
13050 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
13060 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
13070 78 74 28 6e 61 6d 65 2c 22 53 54 22 2c 20 4d 42  xt(name,"ST", MB
13080 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
13090 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
130a0 20 2a 29 20 6b 5f 53 54 2c 20 2d 31 2c 20 2d 31   *) k_ST, -1, -1
130b0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
130c0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
130d0 78 74 28 6e 61 6d 65 2c 22 4c 22 2c 20 4d 42 53  xt(name,"L", MBS
130e0 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
130f0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13100 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20 2d 31 2c 20  *) k_L, -1, -1, 
13110 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f  0);...X509_NAME_
13120 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74  add_entry_by_txt
13130 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d 42 53 54 52  (name,"O", MBSTR
13140 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20  ING_ASC, (const 
13150 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
13160 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31 2c 20 30 29   k_O, -1, -1, 0)
13170 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13180 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13190 61 6d 65 2c 22 4f 55 22 2c 20 4d 42 53 54 52 49  ame,"OU", MBSTRI
131a0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
131b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
131c0 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_OU, -1, -1, 0)
131d0 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
131e0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
131f0 61 6d 65 2c 22 43 4e 22 2c 20 4d 42 53 54 52 49  ame,"CN", MBSTRI
13200 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
13210 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
13220 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  k_CN, -1, -1, 0)
13230 3b 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ;...X509_NAME_ad
13240 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13250 61 6d 65 2c 22 45 6d 61 69 6c 22 2c 20 4d 42 53  ame,"Email", MBS
13260 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73  TRING_ASC, (cons
13270 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
13280 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20 2d 31 2c 20  *) k_Email, -1, 
13290 2d 31 2c 20 30 29 3b 0a 0a 09 09 58 35 30 39 5f  -1, 0);....X509_
132a0 73 65 74 5f 73 75 62 6a 65 63 74 5f 6e 61 6d 65  set_subject_name
132b0 28 63 65 72 74 2c 6e 61 6d 65 29 3b 0a 0a 09 09  (cert,name);....
132c0 69 66 20 28 21 58 35 30 39 5f 73 69 67 6e 28 63  if (!X509_sign(c
132d0 65 72 74 2c 70 6b 65 79 2c 45 56 50 5f 73 68 61  ert,pkey,EVP_sha
132e0 32 35 36 28 29 29 29 20 7b 0a 09 09 20 20 20 20  256())) {...    
132f0 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
13300 0a 09 09 20 20 20 20 45 56 50 5f 50 4b 45 59 5f  ...    EVP_PKEY_
13310 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66 20  free(pkey);.#if 
13320 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
13330 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
13340 30 30 30 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72  000L...    BN_fr
13350 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a  ee(bne);.#endif.
13360 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
13370 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
13380 72 20 73 69 67 6e 69 6e 67 20 63 65 72 74 69 66  r signing certif
13390 69 63 61 74 65 22 2c 4e 55 4c 4c 29 3b 0a 09 09  icate",NULL);...
133a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
133b0 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20  RROR;...}....if 
133c0 28 69 73 53 74 72 29 20 7b 0a 09 09 20 20 20 20  (isStr) {...    
133d0 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
133e0 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20 20 20 20  s_mem());...    
133f0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35  PEM_write_bio_X5
13400 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09  09(out,cert);...
13410 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f      i=BIO_read(o
13420 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66  ut,buffer,sizeof
13430 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20  (buffer)-1);... 
13440 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a     i=(i<0) ? 0 :
13450 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72   i;...    buffer
13460 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20  [i]='\0';...    
13470 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
13480 70 2c 70 65 6d 6f 75 74 2c 62 75 66 66 65 72 2c  p,pemout,buffer,
13490 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c  0);...    BIO_fl
134a0 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20  ush(out);...    
134b0 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09  BIO_free(out);..
134c0 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
134d0 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f  out=BIO_new(BIO_
134e0 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20  s_file());...   
134f0 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e   BIO_write_filen
13500 61 6d 65 28 6f 75 74 2c 70 65 6d 6f 75 74 29 3b  ame(out,pemout);
13510 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
13520 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
13530 72 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  rt);...    BIO_f
13540 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 09  ree_all(out);...
13550 7d 0a 0a 09 09 58 35 30 39 5f 66 72 65 65 28 63  }....X509_free(c
13560 65 72 74 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59  ert);...EVP_PKEY
13570 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 23 69 66  _free(pkey);.#if
13580 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
13590 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
135a0 30 30 30 30 4c 0a 09 09 42 4e 5f 66 72 65 65 28  0000L...BN_free(
135b0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 20 20  bne);.#endif..  
135c0 20 20 7d 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20    }..}..break;. 
135d0 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 62 72 65     default:..bre
135e0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ak;.    }.    re
135f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
13600 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
13610 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49 6e 69 74 20  ******/./* Init 
13620 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f              */./
13630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13640 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  ****/../*. *----
13650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
13690 20 2a 0a 20 2a 20 54 6c 73 5f 46 72 65 65 20 2d   *. * Tls_Free -
136a0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f  -. *. *.This pro
136b0 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70  cedure cleans up
136c0 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b   when a SSL sock
136d0 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c  et based channel
136e0 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e  . *.is closed an
136f0 64 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20  d its reference 
13700 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f  count falls belo
13710 77 20 31 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  w 1. *. * Result
13720 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.none. *. *
13730 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
13740 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20  *.Frees all the 
13750 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  state. *. *-----
13760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
137a0 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 46 72 65 65  */.void.Tls_Free
137b0 28 63 68 61 72 20 2a 62 6c 6f 63 6b 50 74 72 29  (char *blockPtr)
137c0 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
137d0 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
137e0 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20  *)blockPtr;..   
137f0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
13800 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65  ");..    Tls_Cle
13810 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20  an(statePtr);.  
13820 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74    ckfree(blockPt
13830 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13880 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e  . *. * Tls_Clean
13890 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
138a0 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20  rocedure cleans 
138b0 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f  up when a SSL so
138c0 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e 6e  cket based chann
138d0 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64 20  el. *.is closed 
138e0 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e 63  and its referenc
138f0 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65  e count falls be
13900 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68 6f  low 1.  This sho
13910 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64  uld. *.be called
13920 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62   synchronously b
13930 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c  y the CloseProc,
13940 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09 45   not in the. *.E
13950 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63 61  ventuallyFree ca
13960 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
13970 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
13980 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13990 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
139a0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
139b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
139f0 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f  --. */.void Tls_
13a00 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74 61  Clean(State *sta
13a10 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70 72  tePtr) {.    dpr
13a20 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
13a30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77  .    /*.     * w
13a40 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20 68 65  e're assuming he
13a50 72 65 20 74 68 61 74 20 77 65 27 72 65 20 73 69  re that we're si
13a60 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a 20 20  ngle-threaded.  
13a70 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74     */.    if (st
13a80 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d  atePtr->timer !=
13a90 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e   (Tcl_TimerToken
13aa0 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44  ) NULL) {..Tcl_D
13ab0 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65  eleteTimerHandle
13ac0 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  r(statePtr->time
13ad0 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74  r);..statePtr->t
13ae0 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  imer = NULL;.   
13af0 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74   }..    if (stat
13b00 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a  ePtr->protos) {.
13b10 09 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 72  .ckfree(statePtr
13b20 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74  ->protos);..stat
13b30 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e  ePtr->protos = N
13b40 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ULL;.    }.    i
13b50 66 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  f (statePtr->bio
13b60 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c  ) {../* This wil
13b70 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64  l call SSL_shutd
13b80 6f 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35  own. Bug 1414045
13b90 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49   */..dprintf("BI
13ba0 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c  O_free_all(%p)",
13bb0 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b   statePtr->bio);
13bc0 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73  ..BIO_free_all(s
13bd0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09  tatePtr->bio);..
13be0 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20  statePtr->bio = 
13bf0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
13c00 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73  if (statePtr->ss
13c10 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53  l) {..dprintf("S
13c20 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74  SL_free(%p)", st
13c30 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
13c40 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
13c50 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
13c60 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
13c70 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
13c80 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53  tePtr->ctx) {..S
13c90 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74  SL_CTX_free(stat
13ca0 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61  ePtr->ctx);..sta
13cb0 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c  tePtr->ctx = NUL
13cc0 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
13cd0 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
13ce0 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72  ack) {..Tcl_Decr
13cf0 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
13d00 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73  r->callback);..s
13d10 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
13d20 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  k = NULL;.    }.
13d30 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
13d40 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54  ->password) {..T
13d50 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
13d60 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
13d70 72 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  rd);..statePtr->
13d80 70 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b  password = NULL;
13d90 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
13da0 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b  tatePtr->vcmd) {
13db0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
13dc0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  nt(statePtr->vcm
13dd0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76  d);..statePtr->v
13de0 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  cmd = NULL;.    
13df0 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  }..    dprintf("
13e00 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c  Returning");.}..
13e10 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
13e20 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69  ERSION > 8.#defi
13e30 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22  ne MIN_VERSION "
13e40 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69  9.0".#else.#defi
13e50 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22  ne MIN_VERSION "
13e60 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  8.5".#endif../*.
13e70 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13eb0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
13ec0 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Init --. *. *.Th
13ed0 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20  is is a package 
13ee0 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
13ef0 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20  rocedure, which 
13f00 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20  is called. *.by 
13f10 54 63 6c 20 77 68 65 6e 20 74 68 69 73 20 70 61  Tcl when this pa
13f20 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61  ckage is to be a
13f30 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72  dded to an inter
13f40 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  preter.. *. * Re
13f50 73 75 6c 74 73 3a 20 20 53 73 6c 20 63 6f 6e 66  sults:  Ssl conf
13f60 69 67 75 72 65 64 20 61 6e 64 20 6c 6f 61 64 65  igured and loade
13f70 64 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  d. *. * Side eff
13f80 65 63 74 73 3a 0a 20 2a 09 20 63 72 65 61 74 65  ects:. *. create
13f90 20 74 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64   the ssl command
13fa0 2c 20 69 6e 69 74 69 61 6c 69 7a 65 20 73 73 6c  , initialize ssl
13fb0 20 63 6f 6e 74 65 78 74 0a 20 2a 0a 20 2a 2d 2d   context. *. *--
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14000 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20  -. */.DLLEXPORT 
14010 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c  int Tls_Init(Tcl
14020 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
14030 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
14040 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  r tlsTclInitScri
14050 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64  pt[] = {.#includ
14060 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 09 30  e "tls.tcl.h"..0
14070 78 30 30 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20  x00.    };..    
14080 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
14090 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54  );..#ifdef USE_T
140a0 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20  CL_STUBS.    if 
140b0 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69  (Tcl_InitStubs(i
140c0 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49  nterp, MIN_VERSI
140d0 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20  ON, 0) == NULL) 
140e0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
140f0 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
14100 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b  f.    if (Tcl_Pk
14110 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c  gRequire(interp,
14120 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53   "Tcl", MIN_VERS
14130 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29  ION, 0) == NULL)
14140 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
14150 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
14160 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28   if (TlsLibInit(
14170 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  0) != TCL_OK) {.
14180 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
14190 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64  t(interp, "could
141a0 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20   not initialize 
141b0 53 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63  SSL library", (c
141c0 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
141d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
141e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
141f0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
14200 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
14210 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f  :connection", Co
14220 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
14230 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
14240 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
14250 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
14260 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
14270 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
14280 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e  erp, "::tls::han
14290 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
142a0 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
142b0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
142c0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
142d0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
142e0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
142f0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
14300 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f  s::import", Impo
14310 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
14320 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
14330 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
14340 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
14350 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
14360 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
14370 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62  s::misc", MiscOb
14380 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
14390 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
143a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
143b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
143c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
143d0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75  nterp, "::tls::u
143e0 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69 6d 70 6f  nimport", Unimpo
143f0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
14400 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
14410 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
14420 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
14430 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
14440 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
14450 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74  s::status", Stat
14460 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  usObjCmd, (Clien
14470 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
14480 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
14490 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 54  *) NULL);..    T
144a0 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64  ls_DigestCommand
144b0 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54  s(interp);.    T
144c0 6c 73 5f 45 6e 63 72 79 70 74 43 6f 6d 6d 61 6e  ls_EncryptComman
144d0 64 73 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  ds(interp);.    
144e0 54 6c 73 5f 49 6e 66 6f 43 6f 6d 6d 61 6e 64 73  Tls_InfoCommands
144f0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 6c  (interp);.    Tl
14500 73 5f 4b 44 46 43 6f 6d 6d 61 6e 64 73 28 69 6e  s_KDFCommands(in
14510 74 65 72 70 29 3b 0a 20 20 20 20 54 6c 73 5f 52  terp);.    Tls_R
14520 61 6e 64 43 6f 6d 6d 61 6e 64 73 28 69 6e 74 65  andCommands(inte
14530 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  rp);..    if (in
14540 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c  terp && Tcl_Eval
14550 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49  (interp, tlsTclI
14560 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43  nitScript) != TC
14570 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
14580 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
14590 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  ..    return Tcl
145a0 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
145b0 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45  rp, PACKAGE_NAME
145c0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
145d0 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  N);.}../*. *----
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 2a 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61  --*. *. *.Tls_Sa
14620 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  feInit --. *. *.
14630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14660 2a 0a 20 2a 09 53 74 61 6e 64 61 72 64 20 70 72  *. *.Standard pr
14670 6f 63 65 64 75 72 65 20 72 65 71 75 69 72 65 64  ocedure required
14680 20 62 79 20 27 6c 6f 61 64 27 2e 0a 20 2a 09 49   by 'load'.. *.I
14690 6e 69 74 69 61 6c 69 7a 65 73 20 74 68 69 73 20  nitializes this 
146a0 65 78 74 65 6e 73 69 6f 6e 20 66 6f 72 20 61 20  extension for a 
146b0 73 61 66 65 20 69 6e 74 65 72 70 72 65 74 65 72  safe interpreter
146c0 2e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *.-----------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146f0 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64  -----*. *. *.Sid
14700 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 09 41  e effects:. *..A
14710 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a  s of 'Tls_Init'.
14720 20 2a 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a   *. *.Result:. *
14730 09 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  ..A standard Tcl
14740 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 0a   error code.. *.
14750 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 44 4c  --------*. */.DL
14790 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
147a0 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74  SafeInit(Tcl_Int
147b0 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20  erp *interp) {. 
147c0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
147d0 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
147e0 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72 70   Tls_Init(interp
147f0 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
14800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14830 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49  -*. *. *.TlsLibI
14840 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d  nit --. *. *.---
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
14880 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  *.Initializes SS
14890 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70  L library once p
148a0 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  er application. 
148b0 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *.--------------
148c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148e0 2d 2d 2a 0a 20 2a 0a 20 2a 09 53 69 64 65 20 65  --*. *. *.Side e
148f0 66 66 65 63 74 73 3a 0a 20 2a 09 09 69 6e 69 74  ffects:. *..init
14900 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
14910 61 72 79 0a 20 2a 0a 20 2a 09 52 65 73 75 6c 74  ary. *. *.Result
14920 3a 0a 20 2a 09 09 6e 6f 6e 65 0a 20 2a 0a 20 2a  :. *..none. *. *
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14960 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74  ------*. */.stat
14970 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69  ic int TlsLibIni
14980 74 28 69 6e 74 20 75 6e 69 6e 69 74 69 61 6c 69  t(int uninitiali
14990 7a 65 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63  ze) {.    static
149a0 20 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64   int initialized
149b0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 73 74   = 0;.    int st
149c0 61 74 75 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 23  atus = TCL_OK;.#
149d0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
149e0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
149f0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14a00 44 53 29 0a 20 20 20 20 73 69 7a 65 5f 74 20 6e  DS).    size_t n
14a10 75 6d 5f 6c 6f 63 6b 73 3b 0a 23 65 6e 64 69 66  um_locks;.#endif
14a20 0a 0a 20 20 20 20 69 66 20 28 75 6e 69 6e 69 74  ..    if (uninit
14a30 69 61 6c 69 7a 65 29 20 7b 0a 09 69 66 20 28 21  ialize) {..if (!
14a40 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09  initialized) {..
14a50 20 20 20 20 64 70 72 69 6e 74 66 28 22 41 73 6b      dprintf("Ask
14a60 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
14a70 7a 65 2c 20 62 75 74 20 77 65 20 61 72 65 20 6e  ze, but we are n
14a80 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 22 29  ot initialized")
14a90 3b 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
14aa0 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 64 70 72 69  CL_OK;..}...dpri
14ab0 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
14ac0 69 6e 69 74 69 61 6c 69 7a 65 22 29 3b 0a 0a 23  initialize");..#
14ad0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
14ae0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
14af0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
14b00 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 4c 6f  DS)..Tcl_MutexLo
14b10 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 0a 09  ck(&init_mx);...
14b20 69 66 20 28 6c 6f 63 6b 73 29 20 7b 0a 09 20 20  if (locks) {..  
14b30 20 20 66 72 65 65 28 6c 6f 63 6b 73 29 3b 0a 09    free(locks);..
14b40 20 20 20 20 6c 6f 63 6b 73 20 3d 20 4e 55 4c 4c      locks = NULL
14b50 3b 0a 09 20 20 20 20 6c 6f 63 6b 73 43 6f 75 6e  ;..    locksCoun
14b60 74 20 3d 20 30 3b 0a 09 7d 0a 23 65 6e 64 69 66  t = 0;..}.#endif
14b70 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20  ..initialized = 
14b80 30 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  0;..#if defined(
14b90 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29  OPENSSL_THREADS)
14ba0 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f   && defined(TCL_
14bb0 54 48 52 45 41 44 53 29 0a 09 54 63 6c 5f 4d 75  THREADS)..Tcl_Mu
14bc0 74 65 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f  texUnlock(&init_
14bd0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 72 65  mx);.#endif...re
14be0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
14bf0 20 7d 0a 0a 20 20 20 20 69 66 20 28 69 6e 69 74   }..    if (init
14c00 69 61 6c 69 7a 65 64 29 20 7b 0a 09 64 70 72 69  ialized) {..dpri
14c10 6e 74 66 28 22 43 61 6c 6c 65 64 2c 20 62 75 74  ntf("Called, but
14c20 20 75 73 69 6e 67 20 63 61 63 68 65 64 20 76 61   using cached va
14c30 6c 75 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 73  lue");..return s
14c40 74 61 74 75 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  tatus;.    }..  
14c50 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
14c60 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
14c70 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
14c80 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
14c90 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 54  L_THREADS).    T
14ca0 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e  cl_MutexLock(&in
14cb0 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20  it_mx);.#endif. 
14cc0 20 20 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d     initialized =
14cd0 20 31 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   1;..#if defined
14ce0 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53  (OPENSSL_THREADS
14cf0 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c  ) && defined(TCL
14d00 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 6e 75  _THREADS).    nu
14d10 6d 5f 6c 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20  m_locks = 1;.   
14d20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69   locksCount = (i
14d30 6e 74 29 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20  nt) num_locks;. 
14d40 20 20 20 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f     locks = mallo
14d50 63 28 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29  c(sizeof(*locks)
14d60 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20   * num_locks);. 
14d70 20 20 20 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c     memset(locks,
14d80 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b   0, sizeof(*lock
14d90 73 29 20 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b  s) * num_locks);
14da0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
14db0 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20  Initialize BOTH 
14dc0 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69  libcrypto and li
14dd0 62 73 73 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45  bssl. */.    OPE
14de0 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50  NSSL_init_ssl(OP
14df0 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
14e00 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50  SSL_STRINGS | OP
14e10 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f  ENSSL_INIT_LOAD_
14e20 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09  CRYPTO_STRINGS..
14e30 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
14e40 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c  DD_ALL_CIPHERS |
14e50 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
14e60 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e  D_ALL_DIGESTS, N
14e70 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e  ULL);..    BIO_n
14e80 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b  ew_tcl(NULL, 0);
14e90 0a 0a 23 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20  ..#if 0.    /*. 
14ea0 20 20 20 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20      * XXX:TODO: 
14eb0 52 65 6d 6f 76 65 20 74 68 69 73 20 63 6f 64 65  Remove this code
14ec0 20 61 6e 64 20 72 65 70 6c 61 63 65 20 69 74 20   and replace it 
14ed0 77 69 74 68 20 61 20 63 68 65 63 6b 0a 20 20 20  with a check.   
14ee0 20 20 2a 20 66 6f 72 20 65 6e 6f 75 67 68 20 65    * for enough e
14ef0 6e 74 72 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f  ntropy and do no
14f00 74 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20  t try to create 
14f10 6f 75 72 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74  our own.     * t
14f20 65 72 72 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a  errible entropy.
14f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20       */.    /*. 
14f40 20 20 20 20 2a 20 53 65 65 64 20 74 68 65 20 72      * Seed the r
14f50 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e  andom number gen
14f60 65 72 61 74 6f 72 20 69 6e 20 74 68 65 20 53 53  erator in the SS
14f70 4c 20 6c 69 62 72 61 72 79 2c 0a 20 20 20 20 20  L library,.     
14f80 2a 20 75 73 69 6e 67 20 74 68 65 20 64 6f 2f 77  * using the do/w
14f90 68 69 6c 65 20 63 6f 6e 73 74 72 75 63 74 20 62  hile construct b
14fa0 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 62 75  ecause of the bu
14fb0 67 20 6e 6f 74 65 20 69 6e 20 74 68 65 0a 20 20  g note in the.  
14fc0 20 20 20 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51     * OpenSSL FAQ
14fd0 20 61 74 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f   at http://www.o
14fe0 70 65 6e 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f  penssl.org/suppo
14ff0 72 74 2f 66 61 71 2e 68 74 6d 6c 23 55 53 45 52  rt/faq.html#USER
15000 31 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  1.     *.     * 
15010 54 68 65 20 63 72 75 78 20 6f 66 20 74 68 65 20  The crux of the 
15020 70 72 6f 62 6c 65 6d 20 69 73 20 74 68 61 74 20  problem is that 
15030 53 6f 6c 61 72 69 73 20 37 20 64 6f 65 73 20 6e  Solaris 7 does n
15040 6f 74 20 68 61 76 65 20 61 0a 20 20 20 20 20 2a  ot have a.     *
15050 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20   /dev/random or 
15060 2f 64 65 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76  /dev/urandom dev
15070 69 63 65 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74  ice so it cannot
15080 20 67 61 74 68 65 72 20 65 6e 6f 75 67 68 0a 20   gather enough. 
15090 20 20 20 20 2a 20 65 6e 74 72 6f 70 79 20 66 72      * entropy fr
150a0 6f 6d 20 74 68 65 20 52 41 4e 44 5f 73 65 65 64  om the RAND_seed
150b0 28 29 20 77 68 65 6e 20 54 4c 53 20 69 6e 69 74  () when TLS init
150c0 69 61 6c 69 7a 65 73 20 61 6e 64 20 72 65 66 75  ializes and refu
150d0 73 65 73 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f  ses.     * to go
150e0 20 66 75 72 74 68 65 72 2e 20 45 61 72 6c 69 65   further. Earlie
150f0 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70  r versions of Op
15100 65 6e 53 53 4c 20 63 61 72 72 69 65 64 20 6f 6e  enSSL carried on
15110 20 72 65 67 61 72 64 6c 65 73 73 2e 0a 20 20 20   regardless..   
15120 20 20 2a 2f 0a 20 20 20 20 73 72 61 6e 64 28 28    */.    srand((
15130 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 74 69  unsigned int) ti
15140 6d 65 28 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55  me((time_t *) NU
15150 4c 4c 29 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09  LL));.    do {..
15160 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
15170 31 36 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  16; i++) {..    
15180 72 6e 64 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20  rnd_seed[i] = 1 
15190 2b 20 28 63 68 61 72 29 20 28 32 35 35 2e 30 20  + (char) (255.0 
151a0 2a 20 72 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d  * rand()/(RAND_M
151b0 41 58 2b 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41  AX+1.0));..}..RA
151c0 4e 44 5f 73 65 65 64 28 72 6e 64 5f 73 65 65 64  ND_seed(rnd_seed
151d0 2c 20 73 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65  , sizeof(rnd_see
151e0 64 29 29 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65  d));.    } while
151f0 20 28 52 41 4e 44 5f 73 74 61 74 75 73 28 29 20   (RAND_status() 
15200 21 3d 20 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  != 1);.#endif..#
15210 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15220 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15230 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15240 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74 65  DS).    Tcl_Mute
15250 78 55 6e 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  xUnlock(&init_mx
15260 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 72  );.#endif..    r
15270 65 74 75 72 6e 20 73 74 61 74 75 73 3b 0a 7d 0a  eturn status;.}.