Hex Artifact Content

Artifact 893e5c4546fa9aac55faddfec737411ffe01446ac9113358b6d3c7d595e653db:


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: 72 73 61 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  rsa.h>.#include 
03a0: 3c 6f 70 65 6e 73 73 6c 2f 73 61 66 65 73 74 61  <openssl/safesta
03b0: 63 6b 2e 68 3e 0a 0a 2f 2a 20 4d 69 6e 20 4f 70  ck.h>../* Min Op
03c0: 65 6e 53 53 4c 20 76 65 72 73 69 6f 6e 20 2a 2f  enSSL version */
03d0: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
03e0: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
03f0: 31 30 31 30 31 30 30 30 4c 0a 23 65 72 72 6f 72  10101000L.#error
0400: 20 22 4f 6e 6c 79 20 4f 70 65 6e 53 53 4c 20 76   "Only OpenSSL v
0410: 31 2e 31 2e 31 20 6f 72 20 6c 61 74 65 72 20 69  1.1.1 or later i
0420: 73 20 73 75 70 70 6f 72 74 65 64 22 0a 23 65 6e  s supported".#en
0430: 64 69 66 0a 0a 2f 2a 0a 20 2a 20 45 78 74 65 72  dif../*. * Exter
0440: 6e 61 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 20 2a  nal functions. *
0450: 2f 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64  /../*. * Forward
0460: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a   declarations. *
0470: 2f 0a 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b  /..#define F2N(k
0480: 65 79 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b  ey, dsp) \..(((k
0490: 65 79 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28  ey) == NULL) ? (
04a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c  char *) NULL : \
04b0: 0a 09 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65  ...Tcl_Translate
04c0: 46 69 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c  FileName(interp,
04d0: 20 28 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a   (key), (dsp))).
04e0: 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20  .static SSL_CTX 
04f0: 2a 43 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20  *CTX_Init(State 
0500: 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69  *statePtr, int i
0510: 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f  sServer, int pro
0520: 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09  to, char *key,..
0530: 09 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c  .char *certfile,
0540: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
0550: 6b 65 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e  key_asn1, unsign
0560: 65 64 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73  ed char *cert_as
0570: 6e 31 2c 0a 09 09 69 6e 74 20 6b 65 79 5f 61 73  n1,...int key_as
0580: 6e 31 5f 6c 65 6e 2c 20 69 6e 74 20 63 65 72 74  n1_len, int cert
0590: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 63 68 61 72 20  _asn1_len, char 
05a0: 2a 43 41 64 69 72 2c 20 63 68 61 72 20 2a 43 41  *CAdir, char *CA
05b0: 66 69 6c 65 2c 0a 09 09 63 68 61 72 20 2a 63 69  file,...char *ci
05c0: 70 68 65 72 73 2c 20 63 68 61 72 20 2a 63 69 70  phers, char *cip
05d0: 68 65 72 73 75 69 74 65 73 2c 20 69 6e 74 20 6c  hersuites, int l
05e0: 65 76 65 6c 2c 20 63 68 61 72 20 2a 44 48 70 61  evel, char *DHpa
05f0: 72 61 6d 73 29 3b 0a 0a 73 74 61 74 69 63 20 69  rams);..static i
0600: 6e 74 09 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e  nt.TlsLibInit(in
0610: 74 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 3b  t uninitialize);
0620: 0a 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52  ..#define TLS_PR
0630: 4f 54 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23  OTO_SSL2..0x01.#
0640: 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f  define TLS_PROTO
0650: 5f 53 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66  _SSL3..0x02.#def
0660: 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ine TLS_PROTO_TL
0670: 53 31 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65  S1..0x04.#define
0680: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
0690: 31 09 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54  1.0x08.#define T
06a0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09  LS_PROTO_TLS1_2.
06b0: 30 78 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x10.#define TLS
06c0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78  _PROTO_TLS1_3.0x
06d0: 32 30 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c  20.#define ENABL
06e0: 45 44 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28  ED(flag, mask).(
06f0: 28 28 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29  ((flag) & (mask)
0700: 29 20 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64  ) == (mask))..#d
0710: 65 66 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46  efine SSLKEYLOGF
0720: 49 4c 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46  ILE.."SSLKEYLOGF
0730: 49 4c 45 22 0a 0a 2f 2a 0a 20 2a 20 54 68 72 65  ILE"../*. * Thre
0740: 61 64 2d 53 61 66 65 20 54 4c 53 20 43 6f 64 65  ad-Safe TLS Code
0750: 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c  . */..#ifdef TCL
0760: 5f 54 48 52 45 41 44 53 0a 23 64 65 66 69 6e 65  _THREADS.#define
0770: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 5f   OPENSSL_THREAD_
0780: 44 45 46 49 4e 45 53 0a 23 69 6e 63 6c 75 64 65  DEFINES.#include
0790: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73   <openssl/openss
07a0: 6c 63 6f 6e 66 2e 68 3e 0a 0a 23 69 66 64 65 66  lconf.h>..#ifdef
07b0: 20 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53   OPENSSL_THREADS
07c0: 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73  .#include <opens
07d0: 73 6c 2f 63 72 79 70 74 6f 2e 68 3e 0a 23 69 6e  sl/crypto.h>.#in
07e0: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 73  clude <openssl/s
07f0: 73 6c 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 54 68 72  sl.h>../*. * Thr
0800: 65 61 64 65 64 20 6f 70 65 72 61 74 69 6f 6e 20  eaded operation 
0810: 72 65 71 75 69 72 65 73 20 6c 6f 63 6b 69 6e 67  requires locking
0820: 20 63 61 6c 6c 62 61 63 6b 73 0a 20 2a 20 42 61   callbacks. * Ba
0830: 73 65 64 20 66 72 6f 6d 20 2f 63 72 79 70 74 6f  sed from /crypto
0840: 2f 63 72 79 70 74 6c 69 62 2e 63 20 6f 66 20 4f  /cryptlib.c of O
0850: 70 65 6e 53 53 4c 20 61 6e 64 20 4e 53 4f 70 65  penSSL and NSOpe
0860: 6e 53 53 4c 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69  nSSL.. */..stati
0870: 63 20 54 63 6c 5f 4d 75 74 65 78 20 2a 6c 6f 63  c Tcl_Mutex *loc
0880: 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 73 74 61 74 69  ks = NULL;.stati
0890: 63 20 69 6e 74 20 6c 6f 63 6b 73 43 6f 75 6e 74  c int locksCount
08a0: 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 54 63 6c   = 0;.static Tcl
08b0: 5f 4d 75 74 65 78 20 69 6e 69 74 5f 6d 78 3b 0a  _Mutex init_mx;.
08c0: 23 65 6e 64 69 66 20 2f 2a 20 4f 50 45 4e 53 53  #endif /* OPENSS
08d0: 4c 5f 54 48 52 45 41 44 53 20 2a 2f 0a 23 65 6e  L_THREADS */.#en
08e0: 64 69 66 20 2f 2a 20 54 43 4c 5f 54 48 52 45 41  dif /* TCL_THREA
08f0: 44 53 20 2a 2f 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  DS */..../******
0900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
0910: 2f 2a 20 43 61 6c 6c 62 61 63 6b 73 20 20 20 20  /* Callbacks    
0920: 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
0930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
0940: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76  -------. *. * Ev
0990: 61 6c 20 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d  al Callback Comm
09a0: 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61  and --. *. *.Eva
09b0: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
09c0: 6e 64 20 61 6e 64 20 63 61 74 63 68 20 61 6e 79  nd and catch any
09d0: 20 65 72 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65   errors. *. * Re
09e0: 73 75 6c 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f  sults:. *.0 = Co
09f0: 6d 6d 61 6e 64 20 72 65 74 75 72 6e 65 64 20 66  mmand returned f
0a00: 61 69 6c 20 6f 72 20 65 76 61 6c 20 72 65 74 75  ail or eval retu
0a10: 72 6e 65 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20  rned TCL_ERROR. 
0a20: 2a 09 31 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65  *.1 = Command re
0a30: 74 75 72 6e 65 64 20 73 75 63 63 65 73 73 20 6f  turned success o
0a40: 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65 64 20  r eval returned 
0a50: 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64  TCL_OK. *. * Sid
0a60: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 45 76  e effects:. *.Ev
0a70: 61 6c 75 61 74 65 73 20 63 61 6c 6c 62 61 63 6b  aluates callback
0a80: 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d   command. *. *--
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ad0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
0ae0: 0a 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63  .EvalCallback(Tc
0af0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
0b00: 2c 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  , State *statePt
0b10: 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50  r, Tcl_Obj *cmdP
0b20: 74 72 29 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f  tr) {.    int co
0b30: 64 65 2c 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20  de, ok = 0;..   
0b40: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
0b50: 22 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65  ");..    Tcl_Pre
0b60: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
0b70: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
0b80: 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c  Tcl_Preserve((Cl
0b90: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50  ientData) stateP
0ba0: 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  tr);..    /* Eva
0bb0: 6c 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l callback with 
0bc0: 73 75 63 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f  success for ok o
0bd0: 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 31  r return value 1
0be0: 2c 20 66 61 69 6c 20 66 6f 72 20 65 72 72 6f 72  , fail for error
0bf0: 20 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65   or return value
0c00: 20 30 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65   0 */.    Tcl_Re
0c10: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0c20: 29 3b 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63  );.    code = Tc
0c30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65  l_EvalObjEx(inte
0c40: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f  rp, cmdPtr, TCL_
0c50: 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20  EVAL_GLOBAL);.  
0c60: 20 20 64 70 72 69 6e 74 66 28 22 45 76 61 6c 43    dprintf("EvalC
0c70: 61 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f  allback: %d", co
0c80: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64  de);.    if (cod
0c90: 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  e == TCL_OK) {..
0ca0: 2f 2a 20 43 68 65 63 6b 20 72 65 73 75 6c 74 20  /* Check result 
0cb0: 66 6f 72 20 72 65 74 75 72 6e 20 76 61 6c 75 65  for return value
0cc0: 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65   */..Tcl_Obj *re
0cd0: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
0ce0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
0cf0: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20  ..if (result == 
0d00: 4e 55 4c 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49  NULL || Tcl_GetI
0d10: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
0d20: 2c 20 72 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21  , result, &ok) !
0d30: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
0d40: 20 6f 6b 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72   ok = 1;..}..dpr
0d50: 69 6e 74 66 28 22 52 65 73 75 6c 74 3a 20 25 64  intf("Result: %d
0d60: 22 2c 20 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c  ", ok);.    } el
0d70: 73 65 20 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d  se {../* Error -
0d80: 20 72 65 6a 65 63 74 20 74 68 65 20 63 65 72 74   reject the cert
0d90: 69 66 69 63 61 74 65 20 2a 2f 0a 09 64 70 72 69  ificate */..dpri
0da0: 6e 74 66 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f  ntf("Tcl_Backgro
0db0: 75 6e 64 45 72 72 6f 72 22 29 3b 0a 23 69 66 20  undError");.#if 
0dc0: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
0dd0: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
0de0: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
0df0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
0e00: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
0e10: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
0e20: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
0e30: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
0e40: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
0e50: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
0e60: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
0e70: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65  Ptr);.    Tcl_Re
0e80: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
0e90: 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  a) interp);.    
0ea0: 72 65 74 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f  return ok;.}.../
0eb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e  -------. *. * In
0f00: 66 6f 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a  foCallback --. *
0f10: 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c  . *.Monitors SSL
0f20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63   connection proc
0f30: 65 73 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ess. *. * Result
0f40: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
0f50: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
0f60: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
0f70: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
0f80: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0fc0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
0fd0: 63 20 76 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62  c void.InfoCallb
0fe0: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
0ff0: 73 6c 2c 20 69 6e 74 20 77 68 65 72 65 2c 20 69  sl, int where, i
1000: 6e 74 20 72 65 74 29 20 7b 0a 20 20 20 20 53 74  nt ret) {.    St
1010: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
1020: 28 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f  (State*)SSL_get_
1030: 61 70 70 5f 64 61 74 61 28 28 53 53 4c 20 2a 29  app_data((SSL *)
1040: 73 73 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  ssl);.    Tcl_In
1050: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
1060: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
1070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
1080: 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a  dPtr;.    char *
1090: 6d 61 6a 6f 72 3b 20 63 68 61 72 20 2a 6d 69 6e  major; char *min
10a0: 6f 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  or;..    dprintf
10b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
10c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
10d0: 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f  allback == (Tcl_
10e0: 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74 75  Obj*)NULL)..retu
10f0: 72 6e 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65  rn;..    if (whe
1100: 72 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44  re & SSL_CB_HAND
1110: 53 48 41 4b 45 5f 53 54 41 52 54 29 20 7b 0a 09  SHAKE_START) {..
1120: 6d 61 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61  major = "handsha
1130: 6b 65 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 73  ke";..minor = "s
1140: 74 61 72 74 22 3b 0a 20 20 20 20 7d 20 65 6c 73  tart";.    } els
1150: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1160: 4c 5f 43 42 5f 48 41 4e 44 53 48 41 4b 45 5f 44  L_CB_HANDSHAKE_D
1170: 4f 4e 45 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20  ONE) {..major = 
1180: 22 68 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69  "handshake";..mi
1190: 6e 6f 72 20 3d 20 22 64 6f 6e 65 22 3b 0a 20 20  nor = "done";.  
11a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28    } else {..if (
11b0: 77 68 65 72 65 20 26 20 53 53 4c 5f 43 42 5f 41  where & SSL_CB_A
11c0: 4c 45 52 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22  LERT)..major = "
11d0: 61 6c 65 72 74 22 3b 0a 09 65 6c 73 65 20 69 66  alert";..else if
11e0: 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 53 54   (where & SSL_ST
11f0: 5f 43 4f 4e 4e 45 43 54 29 09 6d 61 6a 6f 72 20  _CONNECT).major 
1200: 3d 20 22 63 6f 6e 6e 65 63 74 22 3b 0a 09 65 6c  = "connect";..el
1210: 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53  se if (where & S
1220: 53 4c 5f 53 54 5f 41 43 43 45 50 54 29 09 09 6d  SL_ST_ACCEPT)..m
1230: 61 6a 6f 72 20 3d 20 22 61 63 63 65 70 74 22 3b  ajor = "accept";
1240: 0a 09 65 6c 73 65 09 09 09 09 09 6d 61 6a 6f 72  ..else.....major
1250: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 0a 09   = "unknown";...
1260: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
1270: 43 42 5f 52 45 41 44 29 09 09 6d 69 6e 6f 72 20  CB_READ)..minor 
1280: 3d 20 22 72 65 61 64 22 3b 0a 09 65 6c 73 65 20  = "read";..else 
1290: 69 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f  if (where & SSL_
12a0: 43 42 5f 57 52 49 54 45 29 09 09 6d 69 6e 6f 72  CB_WRITE)..minor
12b0: 20 3d 20 22 77 72 69 74 65 22 3b 0a 09 65 6c 73   = "write";..els
12c0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
12d0: 4c 5f 43 42 5f 4c 4f 4f 50 29 09 09 6d 69 6e 6f  L_CB_LOOP)..mino
12e0: 72 20 3d 20 22 6c 6f 6f 70 22 3b 0a 09 65 6c 73  r = "loop";..els
12f0: 65 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53  e if (where & SS
1300: 4c 5f 43 42 5f 45 58 49 54 29 09 09 6d 69 6e 6f  L_CB_EXIT)..mino
1310: 72 20 3d 20 22 65 78 69 74 22 3b 0a 09 65 6c 73  r = "exit";..els
1320: 65 09 09 09 09 09 6d 69 6e 6f 72 20 3d 20 22 75  e.....minor = "u
1330: 6e 6b 6e 6f 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a  nknown";.    }..
1340: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
1350: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
1360: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
1370: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
1380: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
1390: 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  k);.    Tcl_List
13a0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
13b0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
13c0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
13d0: 6a 28 22 69 6e 66 6f 22 2c 20 2d 31 29 29 3b 0a  j("info", -1));.
13e0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
13f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1400: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
1410: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
1420: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
1430: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
1440: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
1450: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1460: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
1470: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
1480: 77 53 74 72 69 6e 67 4f 62 6a 28 6d 61 6a 6f 72  wStringObj(major
1490: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
14a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
14b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
14c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
14d0: 6e 67 4f 62 6a 28 6d 69 6e 6f 72 2c 20 2d 31 29  ngObj(minor, -1)
14e0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 77 68 65 72  );..    if (wher
14f0: 65 20 26 20 53 53 4c 5f 43 42 5f 41 4c 45 52 54  e & SSL_CB_ALERT
1500: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
1510: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1520: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20  terp, cmdPtr,.. 
1530: 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1540: 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 64 65  Obj(SSL_alert_de
1550: 73 63 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 72  sc_string_long(r
1560: 65 74 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  et), -1));..Tcl_
1570: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1580: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1590: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
15a0: 77 53 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 61  wStringObj(SSL_a
15b0: 6c 65 72 74 5f 74 79 70 65 5f 73 74 72 69 6e 67  lert_type_string
15c0: 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d 31 29 29  _long(ret), -1))
15d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
15e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
15f0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
1600: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
1610: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53  l_NewStringObj(S
1620: 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67 5f  SL_state_string_
1630: 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 29 3b  long(ssl), -1));
1640: 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70  ..Tcl_ListObjApp
1650: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1660: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1670: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1680: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a  o", -1));.    }.
1690: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
16a0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
16b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
16c0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
16d0: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
16e0: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
16f0: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
1700: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
1710: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  cmdPtr);.}.../*.
1720: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1760: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73  -----. *. * Mess
1770: 61 67 65 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20  ageCallback --. 
1780: 2a 0a 20 2a 09 4d 6f 6e 69 74 6f 72 73 20 53 53  *. *.Monitors SS
1790: 4c 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  L protocol messa
17a0: 67 65 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ges. *. * Result
17b0: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
17c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
17d0: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
17e0: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
17f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
1800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1830: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 6e 64  ------. */.#ifnd
1840: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
1850: 4c 5f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76  L_TRACE.static v
1860: 6f 69 64 0a 4d 65 73 73 61 67 65 43 61 6c 6c 62  oid.MessageCallb
1870: 61 63 6b 28 69 6e 74 20 77 72 69 74 65 5f 70 2c  ack(int write_p,
1880: 20 69 6e 74 20 76 65 72 73 69 6f 6e 2c 20 69 6e   int version, in
1890: 74 20 63 6f 6e 74 65 6e 74 5f 74 79 70 65 2c 20  t content_type, 
18a0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 62 75 66 2c  const void *buf,
18b0: 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 53 53 4c   size_t len, SSL
18c0: 20 2a 73 73 6c 2c 20 76 6f 69 64 20 2a 61 72 67   *ssl, void *arg
18d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
18e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
18f0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
1900: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
1910: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
1920: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
1930: 6d 64 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20  mdPtr;.    char 
1940: 2a 76 65 72 2c 20 2a 74 79 70 65 3b 0a 20 20 20  *ver, *type;.   
1950: 20 42 49 4f 20 2a 62 69 6f 3b 0a 20 20 20 20 63   BIO *bio;.    c
1960: 68 61 72 20 62 75 66 66 65 72 5b 31 35 30 30 30  har buffer[15000
1970: 5d 3b 0a 20 20 20 20 62 75 66 66 65 72 5b 30 5d  ];.    buffer[0]
1980: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e   = 0;..    dprin
1990: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
19a0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
19b0: 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63  >callback == (Tc
19c0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65  l_Obj*)NULL)..re
19d0: 74 75 72 6e 3b 0a 0a 20 20 20 20 73 77 69 74 63  turn;..    switc
19e0: 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23 69 66  h(version) {.#if
19f0: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
1a00: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
1a10: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
1a20: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
1a30: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
1a40: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65  O_SSL2).    case
1a50: 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a 0a 09   SSL2_VERSION:..
1a60: 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b 0a 09  ver = "SSLv2";..
1a70: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
1a80: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
1a90: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
1aa0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
1ab0: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 56  .    case SSL3_V
1ac0: 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22  ERSION:..ver = "
1ad0: 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b 3b 0a  SSLv3";..break;.
1ae0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
1af0: 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a 09 76  TLS1_VERSION:..v
1b00: 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a 09 62  er = "TLSv1";..b
1b10: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1b20: 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a 0a 09  LS1_1_VERSION:..
1b30: 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31 22 3b  ver = "TLSv1.1";
1b40: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1b50: 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49 4f 4e  e TLS1_2_VERSION
1b60: 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e  :..ver = "TLSv1.
1b70: 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  2";..break;.    
1b80: 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45 52 53  case TLS1_3_VERS
1b90: 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53  ION:..ver = "TLS
1ba0: 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  v1.3";..break;. 
1bb0: 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65 72 20     case 0:..ver 
1bc0: 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65 61 6b  = "none";..break
1bd0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09  ;.    default:..
1be0: 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  ver = "unknown";
1bf0: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
1c00: 20 20 20 20 73 77 69 74 63 68 20 28 63 6f 6e 74      switch (cont
1c10: 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20 20 20  ent_type) {.    
1c20: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48 45 41  case SSL3_RT_HEA
1c30: 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22 48 65  DER:..type = "He
1c40: 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a 20  ader";..break;. 
1c50: 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f     case SSL3_RT_
1c60: 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f 54 59  INNER_CONTENT_TY
1c70: 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49 6e 6e  PE:..type = "Inn
1c80: 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70 65 22  er Content Type"
1c90: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1ca0: 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41 4e 47  se SSL3_RT_CHANG
1cb0: 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a 0a 09  E_CIPHER_SPEC:..
1cc0: 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65 20 43  type = "Change C
1cd0: 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b 3b 0a  ipher";..break;.
1ce0: 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54      case SSL3_RT
1cf0: 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20 3d 20  _ALERT:..type = 
1d00: 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61 6b 3b  "Alert";..break;
1d10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1d20: 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09 74 79  T_HANDSHAKE:..ty
1d30: 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b 65 22  pe = "Handshake"
1d40: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;..break;.    ca
1d50: 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50 4c 49  se SSL3_RT_APPLI
1d60: 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09 74 79  CATION_DATA:..ty
1d70: 70 65 20 3d 20 22 41 70 70 20 44 61 74 61 22 3b  pe = "App Data";
1d80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ..break;.    cas
1d90: 65 20 44 54 4c 53 31 5f 52 54 5f 48 45 41 52 54  e DTLS1_RT_HEART
1da0: 42 45 41 54 3a 0a 09 74 79 70 65 20 3d 20 22 48  BEAT:..type = "H
1db0: 65 61 72 74 62 65 61 74 22 3b 0a 09 62 72 65 61  eartbeat";..brea
1dc0: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1dd0: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  .type = "unknown
1de0: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  ";.    }..    /*
1df0: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74   Needs compile t
1e00: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62  ime option "enab
1e10: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a  le-ssl-trace". *
1e20: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d  /.    if ((bio =
1e30: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d   BIO_new(BIO_s_m
1e40: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20  em())) != NULL) 
1e50: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74  {..int n;..SSL_t
1e60: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65  race(write_p, ve
1e70: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74  rsion, content_t
1e80: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73  ype, buf, len, s
1e90: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29  sl, (void *)bio)
1ea0: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28  ;..n = BIO_read(
1eb0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 6d 69 6e  bio, buffer, min
1ec0: 28 42 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f  (BIO_pending(bio
1ed0: 29 2c 20 31 34 39 39 39 29 29 3b 0a 09 6e 20 3d  ), 14999));..n =
1ee0: 20 28 6e 3c 30 29 20 3f 20 30 20 3a 20 6e 3b 0a   (n<0) ? 0 : n;.
1ef0: 09 62 75 66 66 65 72 5b 6e 5d 20 3d 20 30 3b 0a  .buffer[n] = 0;.
1f00: 09 28 76 6f 69 64 29 42 49 4f 5f 66 6c 75 73 68  .(void)BIO_flush
1f10: 28 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65  (bio);..BIO_free
1f20: 28 62 69 6f 29 3b 0a 20 20 20 7d 0a 0a 20 20 20  (bio);.   }..   
1f30: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
1f40: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
1f50: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
1f60: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
1f70: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
1f80: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
1f90: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
1fa0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
1fb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
1fc0: 6d 65 73 73 61 67 65 22 2c 20 2d 31 29 29 3b 0a  message", -1));.
1fd0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
1fe0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
1ff0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
2000: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
2010: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2020: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2030: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2040: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2050: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2060: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2070: 77 53 74 72 69 6e 67 4f 62 6a 28 77 72 69 74 65  wStringObj(write
2080: 5f 70 20 3f 20 22 53 65 6e 74 22 20 3a 20 22 52  _p ? "Sent" : "R
2090: 65 63 65 69 76 65 64 22 2c 20 2d 31 29 29 3b 0a  eceived", -1));.
20a0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
20b0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
20c0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
20d0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 76 65  _NewStringObj(ve
20e0: 72 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  r, -1));.    Tcl
20f0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2100: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2110: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2120: 69 6e 67 4f 62 6a 28 74 79 70 65 2c 20 2d 31 29  ingObj(type, -1)
2130: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2140: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2150: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2160: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2170: 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 0a  (buffer, -1));..
2180: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
2190: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
21a0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
21b0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
21c0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
21d0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
21e0: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
21f0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
2200: 6d 64 50 74 72 29 3b 0a 7d 0a 23 65 6e 64 69 66  mdPtr);.}.#endif
2210: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
2260: 2a 20 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  * VerifyCallback
2270: 20 2d 2d 0a 20 2a 0a 20 2a 09 4d 6f 6e 69 74 6f   --. *. *.Monito
2280: 72 73 20 53 53 4c 20 63 65 72 74 69 66 69 63 61  rs SSL certifica
2290: 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 20 70 72  te validation pr
22a0: 6f 63 65 73 73 2e 20 55 73 65 64 20 74 6f 20 63  ocess. Used to c
22b0: 6f 6e 74 72 6f 6c 20 74 68 65 0a 20 2a 09 62 65  ontrol the. *.be
22c0: 68 61 76 69 6f 72 20 77 68 65 6e 20 74 68 65 20  havior when the 
22d0: 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 20  SSL_VERIFY_PEER 
22e0: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 54 68 69  flag is set. Thi
22f0: 73 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 77  s is called. *.w
2300: 68 65 6e 65 76 65 72 20 61 20 63 65 72 74 69 66  henever a certif
2310: 69 63 61 74 65 20 69 73 20 69 6e 73 70 65 63 74  icate is inspect
2320: 65 64 20 6f 72 20 64 65 63 69 64 65 64 20 69 6e  ed or decided in
2330: 76 61 6c 69 64 2e 20 43 61 6c 6c 65 64 20 66 6f  valid. Called fo
2340: 72 0a 20 2a 09 65 61 63 68 20 63 65 72 74 69 66  r. *.each certif
2350: 69 63 61 74 65 20 69 6e 20 74 68 65 20 63 65 72  icate in the cer
2360: 74 20 63 68 61 69 6e 2e 0a 20 2a 0a 20 2a 20 43  t chain.. *. * C
2370: 68 65 63 6b 73 3a 0a 20 2a 09 63 65 72 74 69 66  hecks:. *.certif
2380: 69 63 61 74 65 20 63 68 61 69 6e 20 69 73 20 63  icate chain is c
2390: 68 65 63 6b 65 64 20 73 74 61 72 74 69 6e 67 20  hecked starting 
23a0: 77 69 74 68 20 74 68 65 20 64 65 65 70 65 73 74  with the deepest
23b0: 20 6e 65 73 74 69 6e 67 20 6c 65 76 65 6c 0a 20   nesting level. 
23c0: 2a 09 20 20 28 74 68 65 20 72 6f 6f 74 20 43 41  *.  (the root CA
23d0: 20 63 65 72 74 69 66 69 63 61 74 65 29 20 61 6e   certificate) an
23e0: 64 20 77 6f 72 6b 65 64 20 75 70 77 61 72 64 20  d worked upward 
23f0: 74 6f 20 74 68 65 20 70 65 65 72 27 73 20 63 65  to the peer's ce
2400: 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 41 6c  rtificate.. *.Al
2410: 6c 20 73 69 67 6e 61 74 75 72 65 73 20 61 72 65  l signatures are
2420: 20 76 61 6c 69 64 2c 20 63 75 72 72 65 6e 74 20   valid, current 
2430: 74 69 6d 65 20 69 73 20 77 69 74 68 69 6e 20 66  time is within f
2440: 69 72 73 74 20 61 6e 64 20 6c 61 73 74 20 76 61  irst and last va
2450: 6c 69 64 69 74 79 20 74 69 6d 65 2e 0a 20 2a 09  lidity time.. *.
2460: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 63  Check that the c
2470: 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69 73  ertificate is is
2480: 73 75 65 64 20 62 79 20 74 68 65 20 69 73 73 75  sued by the issu
2490: 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20 69  er certificate i
24a0: 73 73 75 65 72 2e 0a 20 2a 09 43 68 65 63 6b 20  ssuer.. *.Check 
24b0: 74 68 65 20 72 65 76 6f 63 61 74 69 6f 6e 20 73  the revocation s
24c0: 74 61 74 75 73 20 66 6f 72 20 65 61 63 68 20 63  tatus for each c
24d0: 65 72 74 69 66 69 63 61 74 65 2e 0a 20 2a 09 43  ertificate.. *.C
24e0: 68 65 63 6b 20 74 68 65 20 76 61 6c 69 64 69 74  heck the validit
24f0: 79 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 43  y of the given C
2500: 52 4c 20 61 6e 64 20 74 68 65 20 63 65 72 74 20  RL and the cert 
2510: 72 65 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75  revocation statu
2520: 73 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20  s.. *.Check the 
2530: 70 6f 6c 69 63 69 65 73 20 6f 66 20 61 6c 6c 20  policies of all 
2540: 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65 73  the certificates
2550: 0a 20 2a 0a 20 2a 20 41 72 67 73 0a 20 2a 09 70  . *. * Args. *.p
2560: 72 65 76 65 72 69 66 79 5f 6f 6b 20 69 6e 64 69  reverify_ok indi
2570: 63 61 74 65 73 20 77 68 65 74 68 65 72 20 74 68  cates whether th
2580: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 76 65  e certificate ve
2590: 72 69 66 69 63 61 74 69 6f 6e 20 70 61 73 73 65  rification passe
25a0: 64 20 28 31 29 20 6f 72 20 6e 6f 74 20 28 30 29  d (1) or not (0)
25b0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
25c0: 20 2a 09 41 20 63 61 6c 6c 62 61 63 6b 20 62 6f   *.A callback bo
25d0: 75 6e 64 20 74 6f 20 74 68 65 20 73 6f 63 6b 65  und to the socke
25e0: 74 20 6d 61 79 20 72 65 74 75 72 6e 20 6f 6e 65  t may return one
25f0: 20 6f 66 3a 0a 20 2a 09 20 20 20 20 30 09 09 09   of:. *.    0...
2600: 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  - the certificat
2610: 65 20 69 73 20 64 65 65 6d 65 64 20 69 6e 76 61  e is deemed inva
2620: 6c 69 64 2c 20 73 65 6e 64 20 76 65 72 69 66 69  lid, send verifi
2630: 63 61 74 69 6f 6e 0a 20 2a 09 09 09 09 20 20 66  cation. *....  f
2640: 61 69 6c 75 72 65 20 61 6c 65 72 74 20 74 6f 20  ailure alert to 
2650: 70 65 65 72 2c 20 61 6e 64 20 74 65 72 6d 69 6e  peer, and termin
2660: 61 74 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20  ate handshake.. 
2670: 2a 09 20 20 20 20 31 09 09 09 2d 20 74 68 65 20  *.    1...- the 
2680: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
2690: 65 65 6d 65 64 20 76 61 6c 69 64 2c 20 63 6f 6e  eemed valid, con
26a0: 74 69 6e 75 65 20 77 69 74 68 20 68 61 6e 64 73  tinue with hands
26b0: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 65 6d 70  hake.. *.    emp
26c0: 74 79 20 73 74 72 69 6e 67 09 2d 20 6e 6f 20 63  ty string.- no c
26d0: 68 61 6e 67 65 20 74 6f 20 63 65 72 74 69 66 69  hange to certifi
26e0: 63 61 74 65 20 76 61 6c 69 64 61 74 69 6f 6e 0a  cate validation.
26f0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
2700: 74 73 3a 0a 20 2a 09 54 68 65 20 65 72 72 20 66  ts:. *.The err f
2710: 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
2720: 65 6e 74 6c 79 20 6f 70 65 72 61 74 69 76 65 20  ently operative 
2730: 53 74 61 74 65 20 69 73 20 73 65 74 0a 20 2a 09  State is set. *.
2740: 20 20 74 6f 20 61 20 73 74 72 69 6e 67 20 64 65    to a string de
2750: 73 63 72 69 62 69 6e 67 20 74 68 65 20 53 53 4c  scribing the SSL
2760: 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 66 61 69   negotiation fai
2770: 6c 75 72 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20  lure reason. *. 
2780: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
2790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
27d0: 69 6e 74 0a 56 65 72 69 66 79 43 61 6c 6c 62 61  int.VerifyCallba
27e0: 63 6b 28 69 6e 74 20 6f 6b 2c 20 58 35 30 39 5f  ck(int ok, X509_
27f0: 53 54 4f 52 45 5f 43 54 58 20 2a 63 74 78 29 20  STORE_CTX *ctx) 
2800: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  {.    Tcl_Obj *c
2810: 6d 64 50 74 72 3b 0a 20 20 20 20 53 53 4c 20 20  mdPtr;.    SSL  
2820: 20 2a 73 73 6c 09 09 3d 20 28 53 53 4c 2a 29 58   *ssl..= (SSL*)X
2830: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65  509_STORE_CTX_ge
2840: 74 5f 65 78 5f 64 61 74 61 28 63 74 78 2c 20 53  t_ex_data(ctx, S
2850: 53 4c 5f 67 65 74 5f 65 78 5f 64 61 74 61 5f 58  SL_get_ex_data_X
2860: 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 69 64  509_STORE_CTX_id
2870: 78 28 29 29 3b 0a 20 20 20 20 58 35 30 39 20 20  x());.    X509  
2880: 2a 63 65 72 74 09 09 3d 20 58 35 30 39 5f 53 54  *cert..= X509_ST
2890: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 63 75 72 72  ORE_CTX_get_curr
28a0: 65 6e 74 5f 63 65 72 74 28 63 74 78 29 3b 0a 20  ent_cert(ctx);. 
28b0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
28c0: 74 72 09 3d 20 28 53 74 61 74 65 2a 29 53 53 4c  tr.= (State*)SSL
28d0: 5f 67 65 74 5f 61 70 70 5f 64 61 74 61 28 73 73  _get_app_data(ss
28e0: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  l);.    Tcl_Inte
28f0: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
2900: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
2910: 20 20 20 69 6e 74 20 64 65 70 74 68 09 09 3d 20     int depth..= 
2920: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
2930: 65 74 5f 65 72 72 6f 72 5f 64 65 70 74 68 28 63  et_error_depth(c
2940: 74 78 29 3b 0a 20 20 20 20 69 6e 74 20 65 72 72  tx);.    int err
2950: 09 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43  ..= X509_STORE_C
2960: 54 58 5f 67 65 74 5f 65 72 72 6f 72 28 63 74 78  TX_get_error(ctx
2970: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  );..    dprintf(
2980: 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 64  "Called");.    d
2990: 70 72 69 6e 74 66 28 22 56 65 72 69 66 79 43 61  printf("VerifyCa
29a0: 6c 6c 62 61 63 6b 3a 20 25 64 22 2c 20 6f 6b 29  llback: %d", ok)
29b0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
29c0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
29d0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
29e0: 2f 2a 20 55 73 65 20 6f 6b 20 76 61 6c 75 65 20  /* Use ok value 
29f0: 69 66 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20  if verification 
2a00: 69 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 09  is required */..
2a10: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66  if (statePtr->vf
2a20: 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46  lags & SSL_VERIF
2a30: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
2a40: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72  R_CERT) {..    r
2a50: 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73  eturn ok;..} els
2a60: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
2a70: 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  1;..}.    } else
2a80: 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c   if (cert == NUL
2a90: 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c  L || ssl == NULL
2aa0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
2ab0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
2ac0: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2ad0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b  k: eval callback
2ae0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61  ");..    /* Crea
2af0: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
2b00: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
2b10: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2b20: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63  Obj(statePtr->vc
2b30: 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  md);.    Tcl_Lis
2b40: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2b50: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
2b60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2b70: 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31 29  bj("verify", -1)
2b80: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2b90: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ba0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
2bb0: 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  .Tcl_NewStringOb
2bc0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
2bd0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
2be0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
2bf0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c00: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c10: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2c20: 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b 0a  IntObj(depth));.
2c30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c 73  erp, cmdPtr, Tls
2c60: 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
2c70: 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20 20  rp, cert));.    
2c80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2ca0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2cb0: 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20 20  IntObj(ok));.   
2cc0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2cd0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2ce0: 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e  , cmdPtr,..Tcl_N
2cf0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
2d00: 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f 63  r*)X509_verify_c
2d10: 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  ert_error_string
2d20: 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20 20  (err), -1));..  
2d30: 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f 4f    /* Prevent I/O
2d40: 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b 20   while callback 
2d50: 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 2a  is in progress *
2d60: 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74  /.    /* statePt
2d70: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
2d80: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a 2f  TCL_CALLBACK; */
2d90: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
2da0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
2db0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
2dc0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2dd0: 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61 6c      ok = EvalCal
2de0: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2df0: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2e00: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2e10: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
2e20: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2e30: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 63 6f 6d  ifyCallback: com
2e40: 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d 20 25 64  mand result = %d
2e50: 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  ", ok);..    /* 
2e60: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2e70: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 43 41 4c  &= ~(TLS_TCL_CAL
2e80: 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  LBACK); */.    r
2e90: 65 74 75 72 6e 28 6f 6b 29 3b 09 2f 2a 20 42 79  eturn(ok);./* By
2ea0: 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76 65 20   default, leave 
2eb0: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75 6e 63  verification unc
2ec0: 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c 0a 2f  hanged. */.}.../
2ed0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
2f20: 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a  s_Error --. *. *
2f30: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
2f40: 77 69 74 68 20 6c 69 73 74 20 6f 66 20 65 72 72  with list of err
2f50: 6f 72 73 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ors.. *. * Side 
2f60: 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20  effects:. *.The 
2f70: 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68 65  err field of the
2f80: 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72 61   currently opera
2f90: 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73 65  tive State is se
2fa0: 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72 69  t. *.  to a stri
2fb0: 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74 68  ng describing th
2fc0: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
2fd0: 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f 6e  n failure reason
2fe0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
3030: 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74 61  id.Tls_Error(Sta
3040: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68  te *statePtr, ch
3050: 61 72 20 2a 6d 73 67 29 20 7b 0a 20 20 20 20 54  ar *msg) {.    T
3060: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3070: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
3080: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
3090: 6a 20 2a 63 6d 64 50 74 72 2c 20 2a 6c 69 73 74  j *cmdPtr, *list
30a0: 50 74 72 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  Ptr;.    unsigne
30b0: 64 20 6c 6f 6e 67 20 65 72 72 3b 0a 20 20 20 20  d long err;.    
30c0: 73 74 61 74 65 50 74 72 2d 3e 65 72 72 20 3d 20  statePtr->err = 
30d0: 6d 73 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  msg;..    dprint
30e0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
30f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3100: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
3110: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 0a 09 72 65 74  _Obj*)NULL)..ret
3120: 75 72 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  urn;..    /* Cre
3130: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
3140: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
3150: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
3160: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63  eObj(statePtr->c
3170: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63  allback);.    Tc
3180: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3190: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
31a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
31b0: 72 69 6e 67 4f 62 6a 28 22 65 72 72 6f 72 22 2c  ringObj("error",
31c0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
31d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
31e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
31f0: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
3200: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
3210: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
3220: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
3230: 29 29 3b 0a 20 20 20 20 69 66 20 28 6d 73 67 20  ));.    if (msg 
3240: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
3250: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3260: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3270: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3280: 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29 29 3b  ngObj(msg, -1));
3290: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
32a0: 28 28 6d 73 67 20 3d 20 54 63 6c 5f 47 65 74 53  ((msg = Tcl_GetS
32b0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c  tringFromObj(Tcl
32c0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
32d0: 74 65 72 70 29 2c 20 28 54 63 6c 5f 53 69 7a 65  terp), (Tcl_Size
32e0: 20 2a 29 20 4e 55 4c 4c 29 29 20 21 3d 20 4e 55   *) NULL)) != NU
32f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f  LL) {..Tcl_ListO
3300: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
3310: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3320: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3330: 28 6d 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  (msg, -1));..   
3340: 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50   } else {..listP
3350: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
3360: 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77  Obj(0, NULL);..w
3370: 68 69 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52  hile ((err = ERR
3380: 5f 67 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d  _get_error()) !=
3390: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c   0) {..    Tcl_L
33a0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
33b0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
33c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
33d0: 6e 67 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e  ngObj(ERR_reason
33e0: 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72  _error_string(er
33f0: 72 29 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63  r), -1));..}..Tc
3400: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3410: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3420: 6d 64 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b  mdPtr, listPtr);
3430: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
3440: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
3450: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
3460: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
3470: 50 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61  Ptr);.    EvalCa
3480: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
3490: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
34a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
34b0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
34c0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
34d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
3510: 20 2a 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63   * KeyLogCallbac
3520: 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65  k --. *. *.Write
3530: 20 72 65 63 65 69 76 65 64 20 6b 65 79 20 64 61   received key da
3540: 74 61 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a  ta to log file..
3550: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3560: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65  ----. */.void Ke
35c0: 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  yLogCallback(con
35d0: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  st SSL *ssl, con
35e0: 73 74 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b  st char *line) {
35f0: 0a 20 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d  .    char *str =
3600: 20 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f   getenv(SSLKEYLO
3610: 47 46 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45  GFILE);.    FILE
3620: 20 2a 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e   *fd;..    dprin
3630: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3640: 20 20 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66     if (str) {..f
3650: 64 20 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22  d = fopen(str, "
3660: 61 22 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64  a");..fprintf(fd
3670: 2c 20 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a  , "%s\n",line);.
3680: 09 66 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20  .fclose(fd);.   
3690: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
36e0: 20 2a 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43   *. * Password C
36f0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
3700: 09 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70  .Called when a p
3710: 61 73 73 77 6f 72 64 20 66 6f 72 20 61 20 70 72  assword for a pr
3720: 69 76 61 74 65 20 6b 65 79 20 6c 6f 61 64 69 6e  ivate key loadin
3730: 67 2f 73 74 6f 72 69 6e 67 20 61 20 50 45 4d 0a  g/storing a PEM.
3740: 20 2a 09 63 65 72 74 69 66 69 63 61 74 65 20 77   *.certificate w
3750: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20  ith encryption. 
3760: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 20 73  Evals callback s
3770: 63 72 69 70 74 20 61 6e 64 20 72 65 74 75 72 6e  cript and return
3780: 73 0a 20 2a 09 74 68 65 20 72 65 73 75 6c 74 20  s. *.the result 
3790: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  as the password 
37a0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20  string in buf.. 
37b0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
37c0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
37d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
37e0: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
37f0: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
3800: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77  eturns:. *.Passw
3810: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ord size in byte
3820: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  s or -1 for an e
3830: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3880: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
3890: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63  sswordCallback(c
38a0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69  har *buf, int si
38b0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20  ze, int rwflag, 
38c0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20  void *udata) {. 
38d0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
38e0: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75  tr.= (State *) u
38f0: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  data;.    Tcl_In
3900: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3910: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3920: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3930: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3940: 64 65 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  de;..    dprintf
3950: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3960: 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c 62 61   /* If no callba
3970: 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c 74 20  ck, use default 
3980: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 20 20  callback */.    
3990: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
39a0: 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c 29 20  ssword == NULL) 
39b0: 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61 6c 45  {..if (Tcl_EvalE
39c0: 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  x(interp, "tls::
39d0: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c 20 54  password", -1, T
39e0: 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 20  CL_EVAL_GLOBAL) 
39f0: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  == TCL_OK) {..  
3a00: 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63    char *ret = (c
3a10: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3a20: 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
3a30: 70 29 3b 0a 09 20 20 20 20 73 74 72 6e 63 70 79  p);..    strncpy
3a40: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3a50: 5f 74 29 20 73 69 7a 65 29 3b 0a 09 20 20 20 20  _t) size);..    
3a60: 72 65 74 75 72 6e 20 28 69 6e 74 29 73 74 72 6c  return (int)strl
3a70: 65 6e 28 72 65 74 29 3b 0a 09 7d 20 65 6c 73 65  en(ret);..} else
3a80: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d   {..    return -
3a90: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  1;..}.    }..   
3aa0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3ab0: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
3ac0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
3ad0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
3ae0: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
3af0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3b00: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3b10: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3b20: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3b30: 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b  password", -1));
3b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
3b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3b70: 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c  l_NewIntObj(rwfl
3b80: 61 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ag));.    Tcl_Li
3b90: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
3ba0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
3bb0: 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  r, Tcl_NewIntObj
3bc0: 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63  (size));..    Tc
3bd0: 6c 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65  l_Preserve((Clie
3be0: 6e 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b  ntData) interp);
3bf0: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
3c00: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
3c10: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
3c20: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
3c30: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
3c40: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
3c50: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64  cmdPtr);.    cod
3c60: 65 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  e = Tcl_EvalObjE
3c70: 78 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  x(interp, cmdPtr
3c80: 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41  , TCL_EVAL_GLOBA
3c90: 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65  L);.    if (code
3ca0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69   != TCL_OK) {.#i
3cb0: 66 20 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52  f (TCL_MAJOR_VER
3cc0: 53 49 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54  SION == 8) && (T
3cd0: 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e  CL_MINOR_VERSION
3ce0: 20 3c 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67   < 6)..Tcl_Backg
3cf0: 72 6f 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72  roundError(inter
3d00: 70 29 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42  p);.#else..Tcl_B
3d10: 61 63 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69  ackgroundExcepti
3d20: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29  on(interp, code)
3d30: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
3d40: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
3d50: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20  unt(cmdPtr);..  
3d60: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
3d70: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
3d80: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Ptr);..    /* If
3d90: 20 73 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73   successful, pas
3da0: 73 20 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20  s back password 
3db0: 73 74 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63  string and trunc
3dc0: 61 74 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20  ate if too long 
3dd0: 2a 2f 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20  */.    if (code 
3de0: 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  == TCL_OK) {..Tc
3df0: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 09 63 68 61  l_Size len;..cha
3e00: 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a  r *ret = (char *
3e10: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
3e20: 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62  romObj(Tcl_GetOb
3e30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  jResult(interp),
3e40: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
3e50: 20 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   > (Tcl_Size) si
3e60: 7a 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e  ze-1) {..    len
3e70: 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69   = (Tcl_Size) si
3e80: 7a 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70  ze-1;..}..strncp
3e90: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3ea0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b  e_t) len);..buf[
3eb0: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63  len] = '\0';..Tc
3ec0: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3ed0: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3ee0: 09 72 65 74 75 72 6e 28 28 69 6e 74 29 20 6c 65  .return((int) le
3ef0: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  n);.    }.    Tc
3f00: 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e  l_Release((Clien
3f10: 74 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a  tData) interp);.
3f20: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d      return -1;.}
3f30: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
3f80: 2a 20 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61  * Session Callba
3f90: 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d  ck for Clients -
3fa0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
3fb0: 68 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f  hen a new sessio
3fc0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  n is added to th
3fd0: 65 20 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20  e cache. In TLS 
3fe0: 31 2e 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20  1.3. *.this may 
3ff0: 62 65 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74  be received mult
4000: 69 70 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72  iple times after
4010: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20   the handshake. 
4020: 46 6f 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76  For. *.earlier v
4030: 65 72 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69  ersions, this wi
4040: 6c 6c 20 62 65 20 72 65 63 65 69 76 65 64 20 64  ll be received d
4050: 75 72 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68  uring the handsh
4060: 61 6b 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20  ake.. *.This is 
4070: 74 68 65 20 70 72 65 66 65 72 72 65 64 20 77 61  the preferred wa
4080: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65  y to obtain a re
4090: 73 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e  sumable session.
40a0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
40b0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
40c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
40d0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
40e0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
40f0: 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20   Return codes:. 
4100: 2a 09 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72  *.0 = error wher
4110: 65 20 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62  e session will b
4120: 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65  e immediately re
4130: 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69  moved from the i
4140: 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20  nternal cache.. 
4150: 2a 09 31 20 3d 20 73 75 63 63 65 73 73 20 77 68  *.1 = success wh
4160: 65 72 65 20 61 70 70 20 72 65 74 61 69 6e 73 20  ere app retains 
4170: 73 65 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69  session in sessi
4180: 6f 6e 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75  on cache, and mu
4190: 73 74 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53  st call SSL_SESS
41a0: 49 4f 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20  ION_free() when 
41b0: 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  done.. *. *-----
41c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
41f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
4200: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65  */.static int.Se
4210: 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 63 6f  ssionCallback(co
4220: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 53 53  nst SSL *ssl, SS
4230: 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69  L_SESSION *sessi
4240: 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  on) {.    State 
4250: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
4260: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
4270: 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29  data((SSL *)ssl)
4280: 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  ;.    Tcl_Interp
4290: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
42a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
42b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
42c0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69  ;.    const unsi
42d0: 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
42e0: 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  t;.    const uns
42f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
4300: 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65  ion_id;.    size
4310: 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73  _t len2;.    uns
4320: 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a  igned int ulen;.
4330: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4340: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4350: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4360: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
4370: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
4380: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4390: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  OK;.    } else i
43a0: 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20  f (ssl == NULL) 
43b0: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
43c0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
43d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
43e0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
43f0: 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50  eval */.    cmdP
4400: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
4410: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
4420: 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54  callback);.    T
4430: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4440: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4450: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
4460: 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69 6f  tringObj("sessio
4470: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
4480: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4490: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
44a0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
44b0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
44c0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
44d0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
44e0: 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   -1));..    /* S
44f0: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  ession id */.   
4500: 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53   session_id = SS
4510: 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64  L_SESSION_get_id
4520: 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29  (session, &ulen)
4530: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
4540: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4550: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4560: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
4570: 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  bj(session_id, (
4580: 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 29  Tcl_Size) ulen))
4590: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
45a0: 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20 20  n ticket */.    
45b0: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
45c0: 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
45d0: 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
45e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
45f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4600: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
4610: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
4620: 62 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f  bj(ticket, (Tcl_
4630: 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a 20  Size) len2));.. 
4640: 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20 2d     /* Lifetime -
4650: 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f 6e   number of secon
4660: 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c 69  ds */.    Tcl_Li
4670: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4680: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4690: 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67 4f  r,..Tcl_NewLongO
46a0: 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53 45  bj((long) SSL_SE
46b0: 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74  SSION_get_ticket
46c0: 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73  _lifetime_hint(s
46d0: 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20 20  ession)));..    
46e0: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
46f0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
4700: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
4710: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76  (cmdPtr);.    Ev
4720: 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72  alCallback(inter
4730: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64  p, statePtr, cmd
4740: 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  Ptr);.    Tcl_De
4750: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
4760: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  r);.    return 0
4770: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
4780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
47c0: 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62 61  *. * ALPN Callba
47d0: 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20 61  ck for Servers a
47e0: 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b 20  nd NPN Callback 
47f0: 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a 20  for Clients --. 
4800: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72 6f  *. *.Perform pro
4810: 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31 2c  tocol (http/1.1,
4820: 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20 73   h2, h3, etc.) s
4830: 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68 65  election for the
4840: 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f 6e  . *.incoming con
4850: 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64 20  nection. Called 
4860: 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64 20  after Hello and 
4870: 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73  server callbacks
4880: 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74 27  .. *.Where 'out'
4890: 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72 6f   is selected pro
48a0: 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20 69  tocol and 'in' i
48b0: 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65 72  s the peer adver
48c0: 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a 20  tised list.. *. 
48d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
48e0: 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
48f0: 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20  fects:. *.Calls 
4900: 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65 66  callback (if def
4910: 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75  ined). *. * Retu
4920: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
4930: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
4940: 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65  ALPN protocol se
4950: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
4960: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4970: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4980: 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a  ERR_ALERT_FATAL:
4990: 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f 76   There was no ov
49a0: 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74 68  erlap between th
49b0: 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20 20  e client's. *.  
49c0: 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20    supplied list 
49d0: 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20 63  and the server c
49e0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68  onfiguration. Th
49f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 6c  e connection wil
4a00: 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20 2a  l be aborted.. *
4a10: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4a20: 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f 74  NOACK: ALPN prot
4a30: 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65  ocol not selecte
4a40: 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73 65  d, e.g., because
4a50: 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20 20   no ALPN. *.    
4a60: 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63 6f  protocols are co
4a70: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68 69  nfigured for thi
4a80: 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54 68  s connection. Th
4a90: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
4aa0: 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d  tinues.. *. *---
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4af0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
4b00: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  ALPNCallback(con
4b10: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  st SSL *ssl, con
4b20: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4b30: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64   **out, unsigned
4b40: 20 63 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09   char *outlen,..
4b50: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
4b60: 68 61 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65  har *in, unsigne
4b70: 64 20 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69  d int inlen, voi
4b80: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
4b90: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
4ba0: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
4bb0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
4bc0: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
4bd0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
4be0: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
4bf0: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
4c00: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
4c10: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
4c20: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
4c30: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
4c40: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
4c50: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
4c60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63   }..    /* Selec
4c70: 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20  t protocol */.  
4c80: 20 20 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74    if (SSL_select
4c90: 5f 6e 65 78 74 5f 70 72 6f 74 6f 28 6f 75 74 2c  _next_proto(out,
4ca0: 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74   outlen, statePt
4cb0: 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65  r->protos, state
4cc0: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c  Ptr->protos_len,
4cd0: 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20  ..in, inlen) == 
4ce0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f  OPENSSL_NPN_NEGO
4cf0: 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61  TIATED) {../* Ma
4d00: 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65  tch found */..re
4d10: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4d20: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4d30: 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f  e {../* OPENSSL_
4d40: 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d  NPN_NO_OVERLAP =
4d50: 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20   No overlap, so 
4d60: 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20 66  use first item f
4d70: 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f  rom client proto
4d80: 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73  col list */..res
4d90: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
4da0: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a  R_NOACK;.    }..
4db0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
4dc0: 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f  ->vcmd == (Tcl_O
4dd0: 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  bj*)NULL) {..ret
4de0: 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a  urn res;.    }..
4df0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
4e00: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
4e10: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
4e20: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
4e30: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
4e40: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4e50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4e60: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4e70: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61  _NewStringObj("a
4e80: 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lpn", -1));.    
4e90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4ea0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4eb0: 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63   cmdPtr,..    Tc
4ec0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54  l_NewStringObj(T
4ed0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
4ee0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
4ef0: 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ), -1));.    Tcl
4f00: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
4f10: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
4f20: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
4f30: 69 6e 67 4f 62 6a 28 2a 6f 75 74 2c 20 2d 31 29  ingObj(*out, -1)
4f40: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4f50: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4f60: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4f70: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
4f80: 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53  j(res == SSL_TLS
4f90: 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20  EXT_ERR_OK));.. 
4fa0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
4fb0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
4fc0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
4fd0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
4fe0: 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61   if ((code = Eva
4ff0: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
5000: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
5010: 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73  tr)) > 1) {..res
5020: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5030: 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65  R_NOACK;.    } e
5040: 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20  lse if (code == 
5050: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
5060: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
5070: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
5080: 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   = SSL_TLSEXT_ER
5090: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20  R_ALERT_FATAL;. 
50a0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
50b0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
50c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
50d0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5120: 20 2a 0a 20 2a 20 41 64 76 65 72 74 69 73 65 20   *. * Advertise 
5130: 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61  Protocols Callba
5140: 63 6b 20 66 6f 72 20 4e 65 78 74 20 50 72 6f 74  ck for Next Prot
5150: 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e  ocol Negotiation
5160: 20 28 4e 50 4e 29 20 69 6e 20 53 65 72 76 65 72   (NPN) in Server
5170: 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63  Hello --. *. *.c
5180: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 54 4c 53  alled when a TLS
5190: 20 73 65 72 76 65 72 20 6e 65 65 64 73 20 61 20   server needs a 
51a0: 6c 69 73 74 20 6f 66 20 73 75 70 70 6f 72 74 65  list of supporte
51b0: 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20  d protocols for 
51c0: 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c  Next. *.Protocol
51d0: 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a   Negotiation.. *
51e0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
51f0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
5200: 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52  effects:. *. * R
5210: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
5220: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f  SSL_TLSEXT_ERR_O
5230: 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20  K: NPN protocol 
5240: 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f  selected. The co
5250: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
5260: 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es.. *.SSL_TLSEX
5270: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e  T_ERR_NOACK: NPN
5280: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65   protocol not se
5290: 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  lected. The conn
52a0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
52b0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23  ----------. */.#
5300: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74  ifdef USE_NPN.st
5310: 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c  atic int.NPNCall
5320: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
5330: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ssl, const unsig
5340: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20  ned char **out, 
5350: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75  unsigned int *ou
5360: 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29  tlen, void *arg)
5370: 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74   {.    State *st
5380: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a  atePtr = (State*
5390: 29 61 72 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e  )arg;..    dprin
53a0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
53b0: 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55     if (ssl == NU
53c0: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c  LL || arg == NUL
53d0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
53e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
53f0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  K;.    }..    /*
5400: 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c   Set protocols l
5410: 69 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73  ist */.    if (s
5420: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
5430: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74  != NULL) {..*out
5440: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
5450: 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20  tos;..*outlen = 
5460: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
5470: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
5480: 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b   {..*out = NULL;
5490: 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09  ..*outlen = 0;..
54a0: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
54b0: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
54c0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 53 53   }.    return SS
54d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
54e0: 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20  .}.#endif.../*. 
54f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
5500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5530: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43  ----. *. * SNI C
5540: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76  allback for Serv
5550: 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72  ers --. *. *.Per
5560: 66 6f 72 6d 20 73 65 72 76 65 72 2d 73 69 64 65  form server-side
5570: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 73 65   SNI hostname se
5580: 6c 65 63 74 69 6f 6e 20 61 66 74 65 72 20 72 65  lection after re
5590: 63 65 69 76 69 6e 67 20 53 4e 49 20 65 78 74 65  ceiving SNI exte
55a0: 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65  nsion. *.in Clie
55b0: 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64  nt Hello. Called
55c0: 20 61 66 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c   after hello cal
55d0: 6c 62 61 63 6b 20 62 75 74 20 62 65 66 6f 72 65  lback but before
55e0: 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a   ALPN callback..
55f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
5600: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
5610: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
5620: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
5630: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
5640: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
5650: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
5660: 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  OK: SNI hostname
5670: 20 69 73 20 61 63 63 65 70 74 65 64 2e 20 54 68   is accepted. Th
5680: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5690: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
56a0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
56b0: 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e  FATAL: SNI hostn
56c0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70  ame is not accep
56d0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
56e0: 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73 20 61 62  ion. *.    is ab
56f0: 6f 72 74 65 64 2e 20 44 65 66 61 75 6c 74 20 66  orted. Default f
5700: 6f 72 20 61 6c 65 72 74 20 69 73 20 53 53 4c 5f  or alert is SSL_
5710: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
5720: 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  NAME.. *.SSL_TLS
5730: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41  EXT_ERR_ALERT_WA
5740: 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e  RNING: SNI hostn
5750: 61 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70  ame is not accep
5760: 74 65 64 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65  ted, warning ale
5770: 72 74 0a 20 2a 09 20 20 20 20 73 65 6e 74 20 28  rt. *.    sent (
5780: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
5790: 20 54 4c 53 76 31 2e 33 29 2e 20 54 68 65 20 63   TLSv1.3). The c
57a0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
57b0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
57c0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e  XT_ERR_NOACK: SN
57d0: 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f  I hostname is no
57e0: 74 20 61 63 63 65 70 74 65 64 20 61 6e 64 20 6e  t accepted and n
57f0: 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c  ot acknowledged,
5800: 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20 69 66 20  . *.    e.g. if 
5810: 53 4e 49 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  SNI has not been
5820: 20 63 6f 6e 66 69 67 75 72 65 64 2e 20 54 68 65   configured. The
5830: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
5840: 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  inues.. *. *----
5850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5890: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
58a0: 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  NICallback(const
58b0: 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a   SSL *ssl, int *
58c0: 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67  alert, void *arg
58d0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
58e0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
58f0: 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49  *)arg;.    Tcl_I
5900: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20  nterp *interp.= 
5910: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70  statePtr->interp
5920: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63  ;.    Tcl_Obj *c
5930: 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63  mdPtr;.    int c
5940: 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 68  ode, res;.    ch
5950: 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 20 3d  ar *servername =
5960: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 70 72 69   NULL;..    dpri
5970: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
5980: 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e      if (ssl == N
5990: 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55  ULL || arg == NU
59a0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
59b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
59c0: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  CK;.    }..    /
59d0: 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72  * Only works for
59e0: 20 54 4c 53 20 31 2e 32 20 61 6e 64 20 65 61 72   TLS 1.2 and ear
59f0: 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73 65 72 76  lier */.    serv
5a00: 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f 67 65 74  ername = SSL_get
5a10: 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c  _servername(ssl,
5a20: 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45   TLSEXT_NAMETYPE
5a30: 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a 20 20 20  _host_name);.   
5a40: 20 69 66 20 28 21 73 65 72 76 65 72 6e 61 6d 65   if (!servername
5a50: 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d 65 5b 30   || servername[0
5a60: 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a 09 72 65  ] == '\0') {..re
5a70: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5a80: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5a90: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
5aa0: 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c  tr->vcmd == (Tcl
5ab0: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
5ac0: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5ad0: 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  _ERR_OK;.    }..
5ae0: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f      /* Create co
5af0: 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f  mmand to eval */
5b00: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
5b10: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
5b20: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
5b30: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5b40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5b50: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5b60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
5b70: 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ni", -1));.    T
5b80: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5b90: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5ba0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
5bb0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
5bc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
5bd0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
5be0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5bf0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5c00: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5c10: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5c20: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
5c30: 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a   , -1));..    /*
5c40: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
5c50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
5c60: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
5c70: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  mdPtr);.    if (
5c80: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c  (code = EvalCall
5c90: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
5ca0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20  tePtr, cmdPtr)) 
5cb0: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  > 1) {..res = SS
5cc0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5cd0: 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c  RT_WARNING;..*al
5ce0: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
5cf0: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
5d00: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
5d10: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
5d20: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f     } else if (co
5d30: 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20  de == 1) {..res 
5d40: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
5d50: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
5d60: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5d70: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
5d80: 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  TAL;..*alert = S
5d90: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
5da0: 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20  ED_NAME; /* Not 
5db0: 73 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53  supported by TLS
5dc0: 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20   1.3 */.    }.  
5dd0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
5de0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
5df0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
5e00: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
5e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
5e50: 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73  lientHello Hands
5e60: 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f  hake Callback fo
5e70: 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a  r Servers --. *.
5e80: 20 2a 09 55 73 65 64 20 62 79 20 73 65 72 76 65   *.Used by serve
5e90: 72 20 74 6f 20 65 78 61 6d 69 6e 65 20 74 68 65  r to examine the
5ea0: 20 73 65 72 76 65 72 20 6e 61 6d 65 20 69 6e 64   server name ind
5eb0: 69 63 61 74 69 6f 6e 20 28 53 4e 49 29 20 65 78  ication (SNI) ex
5ec0: 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69  tension. *.provi
5ed0: 64 65 64 20 62 79 20 74 68 65 20 63 6c 69 65 6e  ded by the clien
5ee0: 74 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 65  t in order to se
5ef0: 6c 65 63 74 20 61 6e 20 61 70 70 72 6f 70 72 69  lect an appropri
5f00: 61 74 65 20 63 65 72 74 69 66 69 63 61 74 65 20  ate certificate 
5f10: 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74 2c 20 61  to. *.present, a
5f20: 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f  nd make other co
5f30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 61 64 6a 75  nfiguration adju
5f40: 73 74 6d 65 6e 74 73 20 72 65 6c 65 76 61 6e 74  stments relevant
5f50: 20 74 6f 20 74 68 61 74 20 73 65 72 76 65 72 0a   to that server.
5f60: 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69 74 73 20   *.name and its 
5f70: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
5f80: 68 69 73 20 69 6e 63 6c 75 64 65 73 20 73 77 61  his includes swa
5f90: 70 70 69 6e 67 20 6f 75 74 20 74 68 65 20 61 73  pping out the as
5fa0: 73 6f 63 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f  sociated. *.SSL_
5fb0: 43 54 58 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64  CTX pointer, mod
5fc0: 69 66 79 69 6e 67 20 74 68 65 20 73 65 72 76 65  ifying the serve
5fd0: 72 27 73 20 6c 69 73 74 20 6f 66 20 70 65 72 6d  r's list of perm
5fe0: 69 74 74 65 64 20 54 4c 53 20 76 65 72 73 69 6f  itted TLS versio
5ff0: 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20  ns,. *.changing 
6000: 74 68 65 20 73 65 72 76 65 72 27 73 20 63 69 70  the server's cip
6010: 68 65 72 20 6c 69 73 74 20 69 6e 20 72 65 73 70  her list in resp
6020: 6f 6e 73 65 20 74 6f 20 74 68 65 20 63 6c 69 65  onse to the clie
6030: 6e 74 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  nt's cipher list
6040: 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64  , etc.. *.Called
6050: 20 62 65 66 6f 72 65 20 53 4e 49 20 61 6e 64 20   before SNI and 
6060: 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a  ALPN callbacks..
6070: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
6080: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
6090: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
60a0: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
60b0: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
60c0: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
60d0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
60e0: 4f 5f 52 45 54 52 59 3a 20 73 75 73 70 65 6e 64  O_RETRY: suspend
60f0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 2c 20   the handshake, 
6100: 61 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b  and the handshak
6110: 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  e function will 
6120: 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65  return immediate
6130: 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  ly. *.SSL_CLIENT
6140: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61  _HELLO_ERROR: fa
6150: 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e 61 74 65  ilure, terminate
6160: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74   connection. Set
6170: 20 61 6c 65 72 74 20 74 6f 20 65 72 72 6f 72 20   alert to error 
6180: 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49  code.. *.SSL_CLI
6190: 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53  ENT_HELLO_SUCCES
61a0: 53 3a 20 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a  S: success. *. *
61b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
61f0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
6200: 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b  nt.HelloCallback
6210: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
6220: 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69   int *alert, voi
6230: 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74  d *arg) {.    St
6240: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
6250: 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20  (State*)arg;.   
6260: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
6270: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
6280: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
6290: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
62a0: 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a   int code, res;.
62b0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
62c0: 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20  servername;.    
62d0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
62e0: 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65  har *p;.    size
62f0: 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e  _t len, remainin
6300: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
6310: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
6320: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63  if (statePtr->vc
6330: 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29  md == (Tcl_Obj*)
6340: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
6350: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6360: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
6370: 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d 20  else if (ssl == 
6380: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c  (const SSL *)NUL
6390: 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69  L || arg == (voi
63a0: 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  d *)NULL) {..ret
63b0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
63c0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
63d0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e 61  }..    /* Get na
63e0: 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  mes */.    if (!
63f0: 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f  SSL_client_hello
6400: 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20 54  _get0_ext(ssl, T
6410: 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76 65  LSEXT_TYPE_serve
6420: 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d  r_name, &p, &rem
6430: 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69  aining) || remai
6440: 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61  ning <= 2) {..*a
6450: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c  lert = SSL_R_SSL
6460: 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c  V3_ALERT_ILLEGAL
6470: 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74  _PARAMETER;..ret
6480: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
6490: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
64a0: 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63  }..    /* Extrac
64b0: 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  t the length of 
64c0: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69 73  the supplied lis
64d0: 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20  t of names. */. 
64e0: 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29     len = (*(p++)
64f0: 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20   << 8);.    len 
6500: 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69  += *(p++);.    i
6510: 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65  f (len + 2 != re
6520: 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65  maining) {..*ale
6530: 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33  rt = SSL_R_SSLV3
6540: 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50  _ALERT_ILLEGAL_P
6550: 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72  ARAMETER;..retur
6560: 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c  n SSL_CLIENT_HEL
6570: 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  LO_ERROR;.    }.
6580: 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20      remaining = 
6590: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65  len;..    /* The
65a0: 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69 63   list in practic
65b0: 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69 6e  e only has a sin
65c0: 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20  gle element, so 
65d0: 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72  we only consider
65e0: 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e 20   the first one. 
65f0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69  */.    if (remai
6600: 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b  ning == 0 || *p+
6610: 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45  + != TLSEXT_NAME
6620: 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20  TYPE_host_name) 
6630: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
6640: 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e  R_TLSV1_ALERT_IN
6650: 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72  TERNAL_ERROR;..r
6660: 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54  eturn SSL_CLIENT
6670: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20  _HELLO_ERROR;.  
6680: 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e    }.    remainin
6690: 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77  g--;..    /* Now
66a0: 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20   we can finally 
66b0: 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79 74  pull out the byt
66c0: 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65  e array with the
66d0: 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65   actual hostname
66e0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d  . */.    if (rem
66f0: 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09  aining <= 2) {..
6700: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
6710: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
6720: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
6730: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6740: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6750: 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b  .    len = (*(p+
6760: 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65  +) << 8);.    le
6770: 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20  n += *(p++);.   
6780: 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72   if (len + 2 > r
6790: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
67a0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
67b0: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
67c0: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
67d0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
67e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
67f0: 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65    remaining = le
6800: 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d  n;.    servernam
6810: 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  e = (const char 
6820: 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65  *)p;..    /* Cre
6830: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
6840: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
6850: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
6860: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
6870: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
6880: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
6890: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
68a0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
68b0: 4f 62 6a 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29  Obj("hello", -1)
68c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
68d0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
68e0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
68f0: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
6900: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
6910: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
6920: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
6930: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6940: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6950: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
6960: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
6970: 72 76 65 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53  rvername, (Tcl_S
6980: 69 7a 65 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20  ize) len));..   
6990: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
69a0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
69b0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
69c0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
69d0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
69e0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
69f0: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
6a00: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
6a10: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6a20: 4f 5f 52 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74  O_RETRY;..*alert
6a30: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6a40: 4c 45 52 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c  LERT_USER_CANCEL
6a50: 4c 45 44 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  LED;.    } else 
6a60: 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b  if (code == 1) {
6a70: 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45  ..res = SSL_CLIE
6a80: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
6a90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6aa0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6ab0: 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a  _HELLO_ERROR;..*
6ac0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6ad0: 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e  SV1_ALERT_INTERN
6ae0: 41 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  AL_ERROR;.    }.
6af0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
6b00: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
6b10: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
6b20: 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
6b30: 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d  *******/./* Comm
6b40: 61 6e 64 73 20 20 20 20 20 20 20 20 20 2a 2f 0a  ands         */.
6b50: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
6b60: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  *****/../*. *---
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bb0: 0a 20 2a 0a 20 2a 20 43 69 70 68 65 72 73 4f 62  . *. * CiphersOb
6bc0: 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20 61 76 61  jCmd -- list ava
6bd0: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 0a 20  ilable ciphers. 
6be0: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
6bf0: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
6c00: 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74  o process the "t
6c10: 6c 73 3a 3a 63 69 70 68 65 72 73 22 20 63 6f 6d  ls::ciphers" com
6c20: 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20  mand. *.to list 
6c30: 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72  available cipher
6c40: 73 2c 20 62 61 73 65 64 20 75 70 6f 6e 20 70 72  s, based upon pr
6c50: 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e  otocol selected.
6c60: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
6c70: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
6c80: 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20  l result list.. 
6c90: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6ca0: 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73  s:. *.constructs
6cb0: 20 61 6e 64 20 64 65 73 74 72 6f 79 73 20 53 53   and destroys SS
6cc0: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
6cd0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
6ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
6d20: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
6d30: 70 72 6f 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a  protocols[] = {.
6d40: 09 22 73 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c  ."ssl2", "ssl3",
6d50: 20 22 74 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31   "tls1", "tls1.1
6d60: 22 2c 20 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c  ", "tls1.2", "tl
6d70: 73 31 2e 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65  s1.3", NULL.};.e
6d80: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20  num protocol {. 
6d90: 20 20 20 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53     TLS_SSL2, TLS
6da0: 5f 53 53 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c  _SSL3, TLS_TLS1,
6db0: 20 54 4c 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53   TLS_TLS1_1, TLS
6dc0: 5f 54 4c 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53  _TLS1_2, TLS_TLS
6dd0: 31 5f 33 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b  1_3, TLS_NONE.};
6de0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 69 70  ..static int.Cip
6df0: 68 65 72 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  hersObjCmd(Clien
6e00: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
6e10: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
6e20: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
6e30: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
6e40: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
6e50: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e  _Obj *objPtr = N
6e60: 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58  ULL;.    SSL_CTX
6e70: 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ctx = NULL;.  
6e80: 20 20 53 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c    SSL *ssl = NUL
6e90: 4c 3b 0a 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  L;.    STACK_OF(
6ea0: 53 53 4c 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b  SSL_CIPHER) *sk;
6eb0: 0a 20 20 20 20 63 68 61 72 20 2a 63 70 2c 20 62  .    char *cp, b
6ec0: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
6ed0: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
6ee0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
6ef0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
6f00: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
6f10: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
6f20: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
6f30: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
6f40: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
6f50: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
6f60: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
6f70: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
6f80: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
6f90: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
6fa0: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
6fb0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
6fc0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
6fd0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
6fe0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
6ff0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
7000: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
7010: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
7020: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7030: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7040: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7050: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
7060: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7070: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7080: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7090: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
70a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
70b0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
70c0: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
70d0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
70e0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
70f0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
7100: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7120: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
7130: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
7140: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
7150: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
7160: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7170: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7180: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7190: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
71a0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
71b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
71c0: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
71d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
71e0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
71f0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7200: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7210: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7220: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7230: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7240: 68 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68  hod = SSLv2_meth
7250: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7260: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  dif..case TLS_SS
7270: 4c 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  L3:.#if defined(
7280: 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69  NO_SSL3) || defi
7290: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
72a0: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
72b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f  OPENSSL_NO_SSL3_
72c0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
72d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
72e0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
72f0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7300: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7310: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7320: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7330: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7340: 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68  hod = SSLv3_meth
7350: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7360: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
7370: 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  S1:.#if defined(
7380: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
7390: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
73a0: 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  LS1) || defined(
73b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
73c0: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
73d0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
73e0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
73f0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7400: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7410: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7420: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7430: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7440: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68  hod = TLSv1_meth
7450: 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e  od(); break;.#en
7460: 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c  dif..case TLS_TL
7470: 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  S1_1:.#if define
7480: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20  d(NO_TLS1_1) || 
7490: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
74a0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
74b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
74c0: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
74d0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
74e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
74f0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7500: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7510: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7520: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7530: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7540: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
7550: 53 76 31 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20  Sv1_1_method(); 
7560: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63  break;.#endif..c
7570: 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a  ase TLS_TLS1_2:.
7580: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
7590: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
75a0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
75b0: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
75c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
75d0: 32 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  2_METHOD)..    T
75e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
75f0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
7600: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
7610: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
7620: 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  ted", NULL);..  
7630: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7640: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7650: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f  ethod = TLSv1_2_
7660: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7670: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7680: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65  S_TLS1_3:.#if de
7690: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
76a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
76b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
76c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
76d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
76e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
76f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7700: 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29  upported", NULL)
7710: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
7720: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09  L_ERROR;.#else..
7730: 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53      method = TLS
7740: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20 20  _method();..    
7750: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
7760: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
7770: 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f  x, TLS1_3_VERSIO
7780: 4e 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  N);..    SSL_CTX
7790: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
77a0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
77b0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20  _3_VERSION);..  
77c0: 20 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a    break;.#endif.
77d0: 09 64 65 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d  .default:..    m
77e0: 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68  ethod = TLS_meth
77f0: 6f 64 28 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  od();..    break
7800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 74 78  ;.    }..    ctx
7810: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
7820: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
7830: 63 74 78 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ctx == NULL) {..
7840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
7850: 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52  (interp, GET_ERR
7860: 5f 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29  _REASON(), NULL)
7870: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7880: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7890: 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74  ssl = SSL_new(ct
78a0: 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20  x);.    if (ssl 
78b0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
78c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
78d0: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
78e0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53  SON(), NULL);..S
78f0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
7900: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
7910: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
7920: 2f 2a 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20  /* Use list and 
7930: 6f 72 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62  order as would b
7940: 65 20 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65  e sent in a Clie
7950: 6e 74 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61  ntHello or all a
7960: 76 61 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73  vailable ciphers
7970: 20 2a 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f   */.    if (use_
7980: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b  supported) {..sk
7990: 20 3d 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70   = SSL_get1_supp
79a0: 6f 72 74 65 64 5f 63 69 70 68 65 72 73 28 73 73  orted_ciphers(ss
79b0: 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  l);.    } else {
79c0: 0a 09 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63  ..sk = SSL_get_c
79d0: 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20  iphers(ssl);.   
79e0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21   }..    if (sk !
79f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21  = NULL) {..if (!
7a00: 76 65 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20  verbose) {..    
7a10: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7a20: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7a30: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
7a40: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
7a50: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
7a60: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
7a70: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
7a80: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
7a90: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
7aa0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
7ab0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
7ac0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
7ad0: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
7ae0: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
7af0: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
7b00: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
7b10: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
7b20: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7b30: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7b40: 77 53 74 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d  wStringObj(cp, -
7b50: 31 29 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20  1));..    }...} 
7b60: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50  else {..    objP
7b70: 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  tr = Tcl_NewStri
7b80: 6e 67 4f 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20  ngObj("",0);..  
7b90: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
7ba0: 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50  ; i < sk_SSL_CIP
7bb0: 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b  HER_num(sk); i++
7bc0: 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f  ) {...const SSL_
7bd0: 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53  CIPHER *c = sk_S
7be0: 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75 65 28  SL_CIPHER_value(
7bf0: 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28 63 20  sk, i);...if (c 
7c00: 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75  == NULL) continu
7c10: 65 3b 0a 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c  e;..../* textual
7c20: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   description of 
7c30: 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 09  the cipher */...
7c40: 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
7c50: 65 73 63 72 69 70 74 69 6f 6e 28 63 2c 20 62 75  escription(c, bu
7c60: 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
7c70: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20  != NULL) {...   
7c80: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
7c90: 28 6f 62 6a 50 74 72 2c 20 62 75 66 2c 20 28 54  (objPtr, buf, (T
7ca0: 63 6c 5f 53 69 7a 65 29 20 73 74 72 6c 65 6e 28  cl_Size) strlen(
7cb0: 62 75 66 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20  buf));...} else 
7cc0: 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65  {...    Tcl_Appe
7cd0: 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20  ndToObj(objPtr, 
7ce0: 22 55 4e 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b  "UNKNOWN\n", 8);
7cf0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ...}..    }..}..
7d00: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7d10: 64 29 20 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c  d) {..    sk_SSL
7d20: 5f 43 49 50 48 45 52 5f 66 72 65 65 28 73 6b 29  _CIPHER_free(sk)
7d30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53  ;..}.    }.    S
7d40: 53 4c 5f 66 72 65 65 28 73 73 6c 29 3b 0a 20 20  SL_free(ssl);.  
7d50: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
7d60: 74 78 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65  tx);..    Tcl_Se
7d70: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
7d80: 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20  p, objPtr);.    
7d90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
7da0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
7db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
7df0: 2a 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d  * ProtocolsObjCm
7e00: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
7e10: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a  ble protocols. *
7e20: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
7e30: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
7e40: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c   process the "tl
7e50: 73 3a 3a 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f  s::protocols" co
7e60: 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74  mmand. *.to list
7e70: 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f   available proto
7e80: 63 6f 6c 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cols.. *. * Resu
7e90: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
7ea0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
7eb0: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
7ec0: 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  ffects:. *.none.
7ed0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
7f20: 74 69 63 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c  tic int.Protocol
7f30: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
7f40: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
7f50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
7f60: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
7f70: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
7f80: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
7f90: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28  j *objPtr;.    (
7fa0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
7fb0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
7fc0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
7fd0: 66 20 28 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a  f (objc != 1) {.
7fe0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
7ff0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8000: 76 2c 20 22 22 29 3b 0a 09 72 65 74 75 72 6e 20  v, "");..return 
8010: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8020: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
8030: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62  error();..    ob
8040: 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
8050: 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
8060: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
8070: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
8080: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
8090: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
80a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
80b0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
80c0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
80d0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
80e0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
80f0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8100: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d  ols[TLS_SSL2], -
8110: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8120: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
8130: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8140: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26  ENSSL_NO_SSL3) &
8150: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8160: 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f  SL_NO_SSL3_METHO
8170: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8180: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8190: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
81a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
81b0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53  (protocols[TLS_S
81c0: 53 4c 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  SL3], -1));.#end
81d0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
81e0: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
81f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8200: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
8210: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8220: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63  1_METHOD).    Tc
8230: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
8240: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
8250: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
8260: 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c  ringObj(protocol
8270: 73 5b 54 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29  s[TLS_TLS1], -1)
8280: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
8290: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
82a0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
82b0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
82c0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
82d0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d  NSSL_NO_TLS1_1_M
82e0: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
82f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
8300: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
8310: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
8320: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
8330: 4c 53 5f 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29  LS_TLS1_1], -1))
8340: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8350: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
8360: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8370: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20  NSSL_NO_TLS1_2) 
8380: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8390: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45  SSL_NO_TLS1_2_ME
83a0: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
83b0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
83c0: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
83d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
83e0: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
83f0: 53 5f 54 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b  S_TLS1_2], -1));
8400: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8410: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
8420: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
8430: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
8440: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8450: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8460: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8470: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8480: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
8490: 33 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  3], -1));.#endif
84a0: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
84b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
84c0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
84d0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
84e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
84f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8520: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61  -------. *. * Ha
8530: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d  ndshakeObjCmd --
8540: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d  . *. *.This comm
8550: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 76  and is used to v
8560: 65 72 69 66 79 20 77 68 65 74 68 65 72 20 74 68  erify whether th
8570: 65 20 68 61 6e 64 73 68 61 6b 65 20 69 73 20 63  e handshake is c
8580: 6f 6d 70 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f  omplete. *.or no
8590: 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  t.. *. * Results
85a0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
85b0: 54 63 6c 20 72 65 73 75 6c 74 2e 20 31 20 6d 65  Tcl result. 1 me
85c0: 61 6e 73 20 68 61 6e 64 73 68 61 6b 65 20 63 6f  ans handshake co
85d0: 6d 70 6c 65 74 65 2c 20 30 20 6d 65 61 6e 73 20  mplete, 0 means 
85e0: 70 65 6e 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53  pending.. *. * S
85f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
8600: 4d 61 79 20 66 6f 72 63 65 20 53 53 4c 20 6e 65  May force SSL ne
8610: 67 6f 74 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b  gotiation to tak
8620: 65 20 70 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d  e place.. *. *--
8630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8670: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
8680: 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
8690: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
86a0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
86b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
86c0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
86d0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
86e0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
86f0: 68 61 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  han;        /* T
8700: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
8710: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
8720: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
8730: 50 74 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 63  Ptr;        /* c
8740: 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
8750: 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
8760: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72    const char *er
8770: 72 53 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  rStr = NULL;.   
8780: 20 69 6e 74 20 72 65 74 20 3d 20 31 3b 0a 20 20   int ret = 1;.  
8790: 20 20 69 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20    int err = 0;. 
87a0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
87b0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
87c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
87d0: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
87e0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
87f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
8800: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
8810: 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
8820: 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
8830: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
8840: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
8850: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
8860: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
8870: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
8880: 76 5b 31 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20  v[1], (Tcl_Size 
8890: 2a 29 20 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b  *) NULL), NULL);
88a0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
88b0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
88c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 28 54  ULL) {..return(T
88d0: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
88e0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
88f0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
8900: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
8910: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
8920: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
8930: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
8940: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
8950: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
8960: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
8970: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
8980: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8990: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
89a0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
89b0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
89c0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
89d0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
89e0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
89f0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
8a00: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 43   "HANDSHAKE", "C
8a10: 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49  HANNEL", "INVALI
8a20: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
8a30: 4c 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  L);..return(TCL_
8a40: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20  ERROR);.    }.  
8a50: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
8a60: 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61  ate *)Tcl_GetCha
8a70: 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61  nnelInstanceData
8a80: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72  (chan);..    dpr
8a90: 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c  intf("Calling Tl
8aa0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
8ab0: 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20 54 6c  ");.    ret = Tl
8ac0: 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74  s_WaitForConnect
8ad0: 28 73 74 61 74 65 50 74 72 2c 20 26 65 72 72 2c  (statePtr, &err,
8ae0: 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66   1);.    dprintf
8af0: 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e  ("Tls_WaitForCon
8b00: 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a 20 25  nect returned: %
8b10: 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20 20 69  i", ret);..    i
8b20: 66 20 28 72 65 74 20 3c 20 30 20 26 26 20 28 28  f (ret < 0 && ((
8b30: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
8b40: 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29  & TLS_TCL_ASYNC)
8b50: 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41 47 41   && (err == EAGA
8b60: 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e 74 66  IN))) {..dprintf
8b70: 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e 64 20  ("Async set and 
8b80: 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a  err = EAGAIN");.
8b90: 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20  .ret = 0;.    } 
8ba0: 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c 20 30  else if (ret < 0
8bb0: 29 20 7b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  ) {..errStr = st
8bc0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8bd0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8be0: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8bf0: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8c00: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8c10: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8c20: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8c30: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8c40: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8c50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8c60: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8c70: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8c80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8c90: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
8ca0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
8cb0: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46   "HANDSHAKE", "F
8cc0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
8cd0: 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66   NULL);..dprintf
8ce0: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
8cf0: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73  ERROR with hands
8d00: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22  hake failed: %s"
8d10: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75  , errStr);..retu
8d20: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8d30: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
8d40: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
8d50: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
8d60: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
8d70: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
8d80: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
8d90: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
8da0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
8db0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
8dc0: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
8dd0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
8de0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
8df0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
8e00: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
8e10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ;.    return(TCL
8e20: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  _OK);.}../*. *--
8e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e70: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
8e80: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
8e90: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
8ea0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
8eb0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
8ec0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
8ed0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
8ee0: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
8ef0: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
8f00: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
8f10: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8f20: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8f30: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
8f40: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
8f50: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
8f60: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
8f70: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
8fc0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f  .static int.Impo
8fd0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
8fe0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
8ff0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9000: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
9010: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
9020: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
9030: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
9040: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
9050: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
9060: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
9070: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
9080: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
9090: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53  socket */.    SS
90a0: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20  L_CTX *ctx.     
90b0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
90c0: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20  cl_Obj *script. 
90d0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
90e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73     Tcl_Obj *pass
90f0: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e  word.        = N
9100: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9110: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d   *vcmd.        =
9120: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
9130: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e  String upperChan
9140: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  nelTranslation, 
9150: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
9160: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  king, upperChann
9170: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65  elEncoding, uppe
9180: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b  rChannelEOFChar;
9190: 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  .    int idx;.  
91a0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
91b0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20      int flags.. 
91c0: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c         = TLS_TCL
91d0: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
91e0: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d  erver..        =
91f0: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
9200: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
9210: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
9220: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09    char *keyfile.
9230: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9240: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
9250: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9260: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
9270: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55  char *key  .= NU
9280: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  LL;.    Tcl_Size
9290: 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20   key_len        
92a0: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20           = 0;.  
92b0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
92c0: 2a 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20  *cert         = 
92d0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
92e0: 7a 65 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20  ze cert_len     
92f0: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
9300: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
9310: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
9320: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9330: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20  ersuites.       
9340: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
9350: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20  r *CAfile.      
9360: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
9370: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20  ar *CAdir..     
9380: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
9390: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20  har *DHparams.  
93a0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
93b0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20    char *model.. 
93c0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
93d0: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
93e0: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ame.        = NU
93f0: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
9400: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
9410: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
9420: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
9430: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
9440: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  d = NULL;.    Tc
9450: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e  l_Obj *alpn..= N
9460: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c  ULL;.    int ssl
9470: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
9480: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
9490: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
94a0: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
94b0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
94c0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20  roto = 0, level 
94d0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65  = -1;.    int ve
94e0: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72  rify = 0, requir
94f0: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d  e = 0, request =
9500: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   1, post_handsha
9510: 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69  ke = 0;.    (voi
9520: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
9530: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
9540: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
9550: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
9560: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9570: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73  NO_TLS1).    tls
9580: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  1 = 0;.#endif.#i
9590: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
95a0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
95b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
95c0: 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20  1).    tls1_1 = 
95d0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
95e0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
95f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
9600: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
9610: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23     tls1_2 = 0;.#
9620: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
9630: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
9640: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9650: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74  NO_TLS1_3).    t
9660: 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_3 = 0;.#endi
9670: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  f..    if (objc 
9680: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  < 2) {..Tcl_Wron
9690: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
96a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
96b0: 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a  el ?options?");.
96c0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
96d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
96e0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
96f0: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
9700: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
9710: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
9720: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
9730: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e  , (Tcl_Size *) N
9740: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ULL), NULL);.   
9750: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
9760: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
9770: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
9780: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
9790: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
97a0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
97b0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
97c0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
97d0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
97e0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20  chan);..    for 
97f0: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20  (idx = 2; idx < 
9800: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
9810: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f  char *opt = Tcl_
9820: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9830: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c  (objv[idx], (Tcl
9840: 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a  _Size *)NULL);..
9850: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
9860: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
9870: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22  ..OPTOBJ("-alpn"
9880: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52  , alpn);..OPTSTR
9890: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72  ("-cadir", CAdir
98a0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66  );..OPTSTR("-caf
98b0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
98c0: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c  OPTBYTE("-cert",
98d0: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29   cert, cert_len)
98e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74  ;..OPTSTR("-cert
98f0: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29  file", certfile)
9900: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9910: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  er", ciphers);..
9920: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9930: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9940: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69  TSTR("-ciphersui
9950: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74  tes", ciphersuit
9960: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63  es);..OPTOBJ("-c
9970: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29  ommand", script)
9980: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61  ;..OPTSTR("-dhpa
9990: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29  rams", DHparams)
99a0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79  ;..OPTBYTE("-key
99b0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  ", key, key_len)
99c0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66  ;..OPTSTR("-keyf
99d0: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a  ile", keyfile);.
99e0: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22  .OPTSTR("-model"
99f0: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42  , model);..OPTOB
9a00: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70  J("-password", p
9a10: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f  assword);..OPTBO
9a20: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68  OL("-post_handsh
9a30: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73  ake", post_hands
9a40: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  hake);..OPTBOOL(
9a50: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
9a60: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  est);..OPTBOOL("
9a70: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69  -require", requi
9a80: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73  re);..OPTINT("-s
9a90: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
9aa0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
9ab0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
9ac0: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
9ad0: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
9ae0: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
9af0: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
9b00: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
9b10: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73  TBOOL("-ssl2", s
9b20: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl2);..OPTBOOL("
9b30: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09  -ssl3", ssl3);..
9b40: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c  OPTBOOL("-tls1",
9b50: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c   tls1);..OPTBOOL
9b60: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31  ("-tls1.1", tls1
9b70: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _1);..OPTBOOL("-
9b80: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29  tls1.2", tls1_2)
9b90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9ba0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09  1.3", tls1_3);..
9bb0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74  OPTOBJ("-validat
9bc0: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29  ecommand", vcmd)
9bd0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64  ;..OPTOBJ("-vcmd
9be0: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42  ", vcmd);...OPTB
9bf0: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61  AD("option", "-a
9c00: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61  lpn, -cadir, -ca
9c10: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65  file, -cert, -ce
9c20: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c  rtfile, -cipher,
9c30: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   -ciphersuites, 
9c40: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72  -command, -dhpar
9c50: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66  ams, -key, -keyf
9c60: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
9c70: 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61  ssword, -post_ha
9c80: 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73  ndshake, -reques
9c90: 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65  t, -require, -se
9ca0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73  curity_level, -s
9cb0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
9cc0: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
9cd0: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
9ce0: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
9cf0: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
9d00: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
9d10: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
9d20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9d30: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
9d40: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53  t)..verify |= SS
9d50: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
9d60: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
9d70: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
9d80: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
9d90: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  re).verify |= SS
9da0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
9db0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
9dc0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
9dd0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
9de0: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ).verify |= SSL_
9df0: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
9e00: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
9e10: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72  erify == 0)..ver
9e20: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
9e30: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
9e40: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
9e50: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
9e60: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9e70: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
9e80: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
9e90: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
9ea0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
9eb0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9ec0: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
9ed0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
9ee0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9ef0: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
9f00: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
9f10: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9f20: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
9f30: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
9f40: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
9f50: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
9f60: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
9f70: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
9f80: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
9f90: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
9fa0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9fb0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
9fc0: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
9fd0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
9fe0: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
9ff0: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
a000: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
a010: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
a020: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
a030: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
a040: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a050: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
a060: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
a070: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
a080: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a090: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
a0a0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
a0b0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
a0c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a0d0: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
a0e0: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
a0f0: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
a100: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
a110: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
a120: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
a130: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a140: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a150: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a160: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a170: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a180: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a190: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a1a0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a1b0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a1c0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a1d0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a1e0: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a1f0: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a200: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a210: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a220: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a230: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a240: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a250: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a260: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a270: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a280: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a290: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a2a0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a2b0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a2c0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a2d0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a2e0: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a2f0: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a300: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a310: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a320: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a330: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a340: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a350: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a360: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a370: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a380: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a390: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a3a0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a3b0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a3c0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a3d0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a3e0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a3f0: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a400: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a410: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a420: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a430: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a440: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a450: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a460: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a470: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a480: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a490: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a4a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a4b0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a4c0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a4d0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a4e0: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a4f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a500: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a510: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a520: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a530: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a540: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a550: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a570: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
a580: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
a590: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
a5a0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
a5b0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
a5c0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
a5d0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
a5e0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
a5f0: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
a600: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a610: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a620: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
a630: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
a640: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
a650: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
a660: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
a670: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a680: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a690: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a6a0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
a6b0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
a6c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a6d0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a6e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a6f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a700: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a710: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a720: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a730: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a740: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a750: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a760: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a770: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a780: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a790: 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65  rt, (int) key_le
a7a0: 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65  n,..    (int) ce
a7b0: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43  rt_len, CAdir, C
a7c0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
a7d0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
a7e0: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
a7f0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
a800: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
a810: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a820: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a830: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
a840: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20    statePtr->ctx 
a850: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20  = ctx;..    /*. 
a860: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
a870: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
a880: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b  the channel work
a890: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72  s in binary (for
a8a0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72   the.     * encr
a8b0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
a8c0: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20  t goofed up)..  
a8d0: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e     * We only wan
a8e0: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  t to adjust the 
a8f0: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65  buffering in pre
a900: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68  -v2 channels, wh
a910: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20  ere.     * each 
a920: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73  channel in the s
a930: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20  tack maintained 
a940: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e  its own buffers.
a950: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
a960: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
a970: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
a980: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
a990: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
a9a0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
a9b0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
a9c0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a9d0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
a9e0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
a9f0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
aa00: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
aa10: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
aa20: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
aa30: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
aa40: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
aa50: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
aa60: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
aa70: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
aa80: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
aa90: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
aaa0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
aab0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aac0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
aad0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
aae0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
aaf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ab00: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ab10: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
ab20: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
ab30: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
ab40: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ab50: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ab60: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ab70: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
ab80: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ab90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aba0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
abb0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
abc0: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
abd0: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
abe0: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
abf0: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
ac00: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
ac10: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
ac20: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
ac30: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
ac40: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
ac50: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52  tatePtr,..(TCL_R
ac60: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
ac70: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
ac80: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
ac90: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
aca0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
acb0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
acc0: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
acd0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
ace0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
acf0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
ad00: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
ad10: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
ad20: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
ad30: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
ad40: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
ad50: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
ad60: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
ad70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ad80: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
ad90: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ada0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
adb0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
adc0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
add0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
ade0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20  Translation));. 
adf0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ae00: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ae10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
ae20: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
ae30: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
ae40: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
ae50: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ing));.    Tcl_S
ae60: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ae70: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
ae80: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61  ->self, "-eofcha
ae90: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
aea0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
aeb0: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
aec0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
aed0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
aee0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
aef0: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
af00: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
af10: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
af20: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  g));..    /*.   
af30: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
af40: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
af50: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
af60: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
af70: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
af80: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
af90: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
afa0: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
afb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
afc0: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
afd0: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
afe0: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f  session: ", GET_
aff0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b000: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b010: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b020: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b030: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e  ", "IMPORT", "IN
b040: 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  IT", "FAILED", (
b050: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b060: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b070: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
b080: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b090: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b0a0: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
b0b0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
b0c0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
b0d0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
b0e0: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
b0f0: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
b100: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
b110: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
b120: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
b130: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
b140: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
b150: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
b160: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
b170: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
b180: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
b190: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b1a0: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
b1b0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b1c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b1d0: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20  t SNI extension 
b1e0: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b1f0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b200: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b210: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b220: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b230: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b240: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b250: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b260: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b270: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b280: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b290: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  RROR;..}.../* Se
b2a0: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70  t hostname for p
b2b0: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  eer certificate 
b2c0: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63  hostname verific
b2d0: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73  ation in clients
b2e0: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20  ...   Don't use 
b2f0: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69  SSL_set1_host si
b300: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74  nce it has limit
b310: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28  ations. */..if (
b320: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73  !SSL_add1_host(s
b330: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
b340: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20  rvername)) {..  
b350: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b360: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b370: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69  DNS hostname fai
b380: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b390: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b3a0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b3b0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b3c0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b3d0: 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41  IMPORT", "HOSTNA
b3e0: 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ME", "FAILED", (
b3f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b400: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b410: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b420: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b430: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b440: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b450: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b460: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b470: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b480: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b490: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b4a0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b4b0: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b4c0: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b4d0: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b4e0: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b4f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
b500: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
b510: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
b520: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
b530: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b540: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b550: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66  Resume session f
b560: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b570: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b580: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b590: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b5a0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b5b0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53   "IMPORT", "SESS
b5c0: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  ION", "FAILED", 
b5d0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b5e0: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
b5f0: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b600: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b610: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
b620: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  }..    /* Enable
b630: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79   Application-Lay
b640: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  er Protocol Nego
b650: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65  tiation. Example
b660: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c  s are: http/1.0,
b670: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20  ..http/1.1, h2, 
b680: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70  h3, ftp, imap, p
b690: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74  op3, xmpp-client
b6a0: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d  , xmpp-server, m
b6b0: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a  qtt, irc, etc. *
b6c0: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20  /.    if (alpn) 
b6d0: 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20  {../* Convert a 
b6e0: 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  TCL list into a 
b6f0: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e  protocol-list in
b700: 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a   wire-format */.
b710: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
b720: 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73  protos, *p;..uns
b730: 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73  igned int protos
b740: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53  _len = 0;..Tcl_S
b750: 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74  ize cnt, i;..int
b760: 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c   j;..Tcl_Obj **l
b770: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c  ist;...if (Tcl_L
b780: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
b790: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20  s(interp, alpn, 
b7a0: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20  &cnt, &list) != 
b7b0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
b7c0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b7d0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b7e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b7f0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
b800: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
b810: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
b820: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
b830: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
b840: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
b850: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b860: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
b870: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
b880: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
b890: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b8a0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
b8b0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
b8c0: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
b8d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f  *) NULL);...Tcl_
b8e0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b8f0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b900: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
b910: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b920: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72   NULL);...Tls_Fr
b930: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b940: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20  ePtr);...return 
b950: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
b960: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65  }..    protos_le
b970: 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c  n += 1 + (int) l
b980: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c  en;..}.../* Buil
b990: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70  d the complete p
b9a0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
b9b0: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f  .protos = ckallo
b9c0: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09  c(protos_len);..
b9d0: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  /* protocol-list
b9e0: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62  s consist of 8-b
b9f0: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78  it length-prefix
ba00: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73  ed, byte strings
ba10: 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c   */..for (j = 0,
ba20: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c   p = protos; j <
ba30: 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20   cnt; j++) {..  
ba40: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63    char *str = Tc
ba50: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ba60: 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e  bj(list[j], &len
ba70: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28  );..    *p++ = (
ba80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c  unsigned char) l
ba90: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28  en;..    memcpy(
baa0: 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29  p, str, (size_t)
bab0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d   len);..    p +=
bac0: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53   len;..}.../* SS
bad0: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f  L_set_alpn_proto
bae0: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f  s makes a copy o
baf0: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  f the protocol-l
bb00: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a  ist */../* Note:
bb10: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   This functions 
bb20: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74  reverses the ret
bb30: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e  urn value conven
bb40: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c  tion */..if (SSL
bb50: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
bb60: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bb70: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c  protos, protos_l
bb80: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  en)) {..    Tcl_
bb90: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bba0: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70  erp, "Set ALPN p
bbb0: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a  rotocols failed:
bbc0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
bbd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
bbe0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
bbf0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
bc00: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
bc10: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
bc20: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
bc30: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
bc40: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
bc50: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b  atePtr);..    ck
bc60: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20  free(protos);.. 
bc70: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bc80: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f  ROR;..}.../* Sto
bc90: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  re protocols lis
bca0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  t */..statePtr->
bcb0: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b  protos = protos;
bcc0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bcd0: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f  os_len = protos_
bce0: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
bcf0: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  {..statePtr->pro
bd00: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61  tos = NULL;..sta
bd10: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
bd20: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
bd30: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
bd40: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a  Callbacks.     *
bd50: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70  /.    SSL_set_ap
bd60: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d  p_data(statePtr-
bd70: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
bd80: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e  atePtr);./* poin
bd90: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a  t back to us */.
bda0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
bdb0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
bdc0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
bdd0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
bde0: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  SL_set_info_call
bdf0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
be00: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  sl, InfoCallback
be10: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62  );..    /* Callb
be20: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e  ack for observin
be30: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  g protocol messa
be40: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ges */.#ifndef O
be50: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52  PENSSL_NO_SSL_TR
be60: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20  ACE.    /* void 
be70: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
be80: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
be90: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
bea0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
beb0: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f     void SSL_CTX_
bec0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
bed0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bee0: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
bef0: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  ; */.    SSL_set
bf00: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
bf10: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  g(statePtr->ssl,
bf20: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
bf30: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  r);.    SSL_set_
bf40: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
bf50: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73  tePtr->ssl, Mess
bf60: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65  ageCallback);.#e
bf70: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ndif..    /* Cre
bf80: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  ate Tcl_Channel 
bf90: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BIO Handler */. 
bfa0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62     statePtr->p_b
bfb0: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  io.= BIO_new_tcl
bfc0: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e  (statePtr, BIO_N
bfd0: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61  OCLOSE);.    sta
bfe0: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f  tePtr->bio.= BIO
bff0: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29  _new(BIO_f_ssl()
c000: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76  );..    if (serv
c010: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72  er) {../* Server
c020: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53   callbacks */..S
c030: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c040: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67  t_servername_arg
c050: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c060: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c070: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c080: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c090: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  e_callback(state
c0a0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c  Ptr->ctx, SNICal
c0b0: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58  lback);..SSL_CTX
c0c0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  _set_client_hell
c0d0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  o_cb(statePtr->c
c0e0: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  tx, HelloCallbac
c0f0: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c100: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65  Ptr);..if (state
c110: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c120: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
c130: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c  CTX_set_alpn_sel
c140: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c150: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c160: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c170: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53  ePtr);.#ifdef US
c180: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74  E_NPN..    if (t
c190: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c1a0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53  s1_3 == 0) {...S
c1b0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
c1c0: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65  protos_advertise
c1d0: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  d_cb(statePtr->c
c1e0: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c  tx, NPNCallback,
c1f0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c200: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69  r);..    }.#endi
c210: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65  f..}.../* Enable
c220: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20   server to send 
c230: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74  cert request aft
c240: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c  er handshake (TL
c250: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09  S 1.3 only) */..
c260: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61  /* A write opera
c270: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70  tion must take p
c280: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72  lace for the Cer
c290: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74  tificate Request
c2a0: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20   to be..   sent 
c2b0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74  to the client, t
c2c0: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  his can be done 
c2d0: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  with SSL_do_hand
c2e0: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
c2f0: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c300: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c  _handshake && tl
c310: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c  s1_3) {..    SSL
c320: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
c330: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
c340: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
c350: 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61  .../* set automa
c360: 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74  tic curve select
c370: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ion */..SSL_set_
c380: 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50  ecdh_auto(stateP
c390: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f  tr->ssl, 1);.../
c3a0: 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64  * Set server mod
c3b0: 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  e */..statePtr->
c3c0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
c3d0: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65  _SERVER;..SSL_se
c3e0: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73  t_accept_state(s
c3f0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
c400: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
c410: 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73  Client callbacks
c420: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
c430: 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72  PN..if (statePtr
c440: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c  ->protos != NULL
c450: 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20   && tls1_2 == 0 
c460: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
c470: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
c480: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65  et_next_proto_se
c490: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
c4a0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
c4b0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c4c0: 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69  tePtr);..}.#endi
c4d0: 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63  f.../* Session c
c4e0: 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43  aching */..SSL_C
c4f0: 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_set_session_c
c500: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
c510: 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53  tr->ctx, SSL_SES
c520: 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c  S_CACHE_CLIENT |
c530: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
c540: 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52  NO_INTERNAL_STOR
c550: 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73  E);..SSL_CTX_ses
c560: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61  s_set_new_cb(sta
c570: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73  tePtr->ctx, Sess
c580: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09  ionCallback);...
c590: 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68  /* Enable post h
c5a0: 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74  andshake Authent
c5b0: 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f  ication extensio
c5c0: 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c  n. TLS 1.3 only,
c5d0: 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a   not http/2. */.
c5e0: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c5f0: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
c600: 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70  {..    SSL_set_p
c610: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75  ost_handshake_au
c620: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
c630: 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  , 1);..}.../* Se
c640: 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f  t client mode */
c650: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63  ..SSL_set_connec
c660: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c670: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
c680: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74    SSL_set_bio(st
c690: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61  atePtr->ssl, sta
c6a0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74  tePtr->p_bio, st
c6b0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a  atePtr->p_bio);.
c6c0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28      BIO_set_ssl(
c6d0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73  statePtr->bio, s
c6e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49  tatePtr->ssl, BI
c6f0: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20  O_NOCLOSE);..   
c700: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f   /*.     * End o
c710: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20  f SSL Init.     
c720: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
c730: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54  Returning %s", T
c740: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
c750: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
c760: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  ));.    Tcl_SetR
c770: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c780: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  har *) Tcl_GetCh
c790: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
c7a0: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56  tr->self), TCL_V
c7b0: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72  OLATILE);..    r
c7c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
c7d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
c7e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
c820: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   UnimportObjCmd 
c830: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
c840: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
c850: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
c860: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
c870: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52   filter.. *. * R
c880: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
c890: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
c8a0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
c8b0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
c8c0: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
c8d0: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
c8e0: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
c8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
c930: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
c940: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
c950: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
c960: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c970: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
c980: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
c990: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
c9a0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
c9b0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
c9c0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
c9d0: 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  */.    (void) cl
c9e0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
c9f0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
ca00: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
ca10: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
ca20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ca30: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
ca40: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
ca50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ca60: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ca70: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
ca80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ca90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
caa0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
cab0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
cac0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
cad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cae0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
caf0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cb00: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cb10: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cb20: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cb30: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
cb40: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
cb50: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
cb60: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
cb70: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
cb80: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cb90: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
cba0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
cbb0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
cbc0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
cbd0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  nnel", NULL);.. 
cbe0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
cbf0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
cc00: 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22  ", "UNIMPORT", "
cc10: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
cc20: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
cc30: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
cc40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cc50: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
cc60: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
cc70: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45  , chan) == TCL_E
cc80: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20  RROR) {..return 
cc90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cca0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
ccb0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
ccc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74  -. *. * CTX_Init
cd10: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20   -- construct a 
cd20: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
cd30: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
cd40: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43   *.A valid SSL_C
cd50: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e  TX instance or N
cd60: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ULL.. *. * Side 
cd70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
cd80: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65  tructs SSL conte
cd90: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c  -. */.static SSL
cdf0: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28  _CTX *.CTX_Init(
ce00: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
ce10: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69   int isServer, i
ce20: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a  nt proto, char *
ce30: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  keyfile, char *c
ce40: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73  ertfile,.    uns
ce50: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c  igned char *key,
ce60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ce70: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65  cert, int key_le
ce80: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c  n, int cert_len,
ce90: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20   char *CAdir,.  
cea0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20    char *CAfile, 
ceb0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
cec0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
ced0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
cee0: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a  ar *DHparams) {.
cef0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
cf00: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74  interp = statePt
cf10: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53  r->interp;.    S
cf20: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
cf30: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
cf40: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f  ing ds;.    Tcl_
cf50: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20  DString ds1;.   
cf60: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20   int off = 0;.  
cf70: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61    int load_priva
cf80: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  te_key;.    cons
cf90: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
cfa0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
cfb0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
cfc0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b     if (!proto) {
cfd0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
cfe0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76  lt(interp, "no v
cff0: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65  alid protocol se
d000: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a  lected", (char *
d010: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d020: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
d030: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20    /* create SSL 
d040: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f  context */.#if O
d050: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d060: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
d070: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
d080: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
d090: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d0a0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL2).    if (ENA
d0b0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d0c0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09  PROTO_SSL2)) {..
d0d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d0e0: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70  (interp, "SSL2 p
d0f0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d100: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d110: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d120: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d130: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d140: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
d150: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
d160: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  L3).    if (ENAB
d170: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d180: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54  ROTO_SSL3)) {..T
d190: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d1a0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72  interp, "SSL3 pr
d1b0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d1c0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d1d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d1e0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d1f0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d200: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
d210: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d220: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
d230: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d240: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
d250: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d260: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20  nterp, "TLS 1.0 
d270: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d280: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d290: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d2a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d2b0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d2c0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
d2d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d2e0: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20  _TLS1_1).    if 
d2f0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d300: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
d310: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d320: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d330: 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c  TLS 1.1 protocol
d340: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d350: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d360: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d370: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
d380: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d390: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
d3a0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
d3b0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d3c0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d3d0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63  O_TLS1_2)) {..Tc
d3e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d3f0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20  nterp, "TLS 1.2 
d400: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d410: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d420: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d430: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d440: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d450: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
d460: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d470: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
d480: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d490: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
d4a0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d4b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d4c0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c  TLS 1.3 protocol
d4d0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d4e0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d4f0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d500: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d510: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20  if (proto == 0) 
d520: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72  {../* Use full r
d530: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  ange */..SSL_CTX
d540: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
d550: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a  ersion(ctx, 0);.
d560: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
d570: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
d580: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  tx, 0);.    }.. 
d590: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f     switch (proto
d5a0: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  ) {.#if OPENSSL_
d5b0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
d5c0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
d5d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
d5e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d5f0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
d600: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d610: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20  O_SSL2:..method 
d620: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c  = isServer ? SSL
d630: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v2_server_method
d640: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e  () : SSLv2_clien
d650: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d660: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d670: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d680: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d690: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
d6a0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d6b0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
d6c0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
d6d0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68  ROTO_SSL3:..meth
d6e0: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d6f0: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv3_server_met
d700: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c  hod() : SSLv3_cl
d710: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
d720: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
d730: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d740: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
d750: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d760: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d770: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
d780: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
d790: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d  S_PROTO_TLS1:..m
d7a0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
d7b0: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f   ? TLSv1_server_
d7c0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
d7d0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d7e0: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
d7f0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d800: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
d810: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d820: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
d830: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d840: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_1_METHOD).  
d850: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d860: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64  _TLS1_1:..method
d870: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
d880: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_1_server_met
d890: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f  hod() : TLSv1_1_
d8a0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
d8b0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d8c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d8d0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
d8e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d8f0: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
d900: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d910: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
d920: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d930: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_2:..method 
d940: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
d950: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68  v1_2_server_meth
d960: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63  od() : TLSv1_2_c
d970: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d980: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
d990: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
d9a0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
d9b0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d9c0: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54  S1_3).    case T
d9d0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a  LS_PROTO_TLS1_3:
d9e0: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e  ../* Use the gen
d9f0: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20  eric method and 
da00: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65  constraint range
da10: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69   after context i
da20: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65  s created */..me
da30: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
da40: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
da50: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
da60: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
da70: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
da80: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67  default:../* Neg
da90: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61  otiate highest a
daa0: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53  vailable SSL/TLS
dab0: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74   version */..met
dac0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
dad0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68   TLS_server_meth
dae0: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e  od() : TLS_clien
daf0: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20  t_method();.#if 
db00: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
db10: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
db20: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
db30: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
db40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
db50: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL2)..off |= (
db60: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
db70: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20  LS_PROTO_SSL2)  
db80: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
db90: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv2);.#endif.
dba0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
dbb0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
dbc0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
dbd0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  3)..off |= (ENAB
dbe0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
dbf0: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30  ROTO_SSL3)   ? 0
dc00: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
dc10: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v3);.#endif.#if 
dc20: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
dc30: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dc40: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09  ENSSL_NO_TLS1)..
dc50: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dc60: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dc70: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53  _TLS1)   ? 0 : S
dc80: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b  SL_OP_NO_TLSv1);
dc90: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dca0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
dcb0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dcc0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09  SSL_NO_TLS1_1)..
dcd0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dce0: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dcf0: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53  _TLS1_1) ? 0 : S
dd00: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31  SL_OP_NO_TLSv1_1
dd10: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dd20: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
dd30: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dd40: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
dd50: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dd60: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dd70: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a  TO_TLS1_2) ? 0 :
dd80: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
dd90: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _2);.#endif.#if 
dda0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
ddb0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
ddc0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
ddd0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  3)..off |= (ENAB
dde0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
ddf0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30  ROTO_TLS1_3) ? 0
de00: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
de10: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62  v1_3);.#endif..b
de20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
de30: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
de40: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53  ();..    ctx = S
de50: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
de60: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78  d);.    if (!ctx
de70: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ) {..return(NULL
de80: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
de90: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c   (getenv(SSLKEYL
dea0: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f  OGFILE)) {..SSL_
deb0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63  CTX_set_keylog_c
dec0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79  allback(ctx, Key
ded0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  LogCallback);.  
dee0: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
def0: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
df00: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
df10: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
df20: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53  if (proto == TLS
df30: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b  _PROTO_TLS1_3) {
df40: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
df50: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
df60: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
df70: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
df80: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
df90: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
dfa0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d  _VERSION);.    }
dfb0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
dfc0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c  Force cipher sel
dfd0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20  ection order by 
dfe0: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66  server */.    if
dff0: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
e000: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
e010: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
e020: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
e030: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d  EFERENCE);.    }
e040: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
e050: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
e060: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f  x10100000L.    O
e070: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61  penSSL_add_all_a
e080: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20  lgorithms(); /* 
e090: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64  Load ciphers and
e0a0: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64   digests */.#end
e0b0: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  if..    SSL_CTX_
e0c0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
e0d0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29  , (void*)interp)
e0e0: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68  ;./* remember th
e0f0: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  e interpreter */
e100: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e110: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
e120: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
e130: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
e140: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
e150: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e160: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  (ctx, SSL_OP_NO_
e170: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a  COMPRESSION);./*
e180: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73   disable compres
e190: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70  sion even if sup
e1a0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53  ported */.    SS
e1b0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
e1c0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a  s(ctx, off);../*
e1d0: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f   disable protoco
e1e0: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69  l versions */.#i
e1f0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
e200: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
e210: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43  01000L.    SSL_C
e220: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c  TX_set_mode(ctx,
e230: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52   SSL_MODE_AUTO_R
e240: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65  ETRY);./* handle
e250: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20   new handshakes 
e260: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f  in background. O
e270: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20  n by default in 
e280: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a  OpenSSL 1.1.1. *
e290: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c  /.#endif.    SSL
e2a0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61  _CTX_sess_set_ca
e2b0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32  che_size(ctx, 12
e2c0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  8);..    /* Set 
e2d0: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70  user defined cip
e2e0: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69  hers, cipher sui
e2f0: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74  tes, and securit
e300: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
e310: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e  f ((ciphers != N
e320: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
e330: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _set_cipher_list
e340: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20  (ctx, ciphers)) 
e350: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e360: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
e370: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
e380: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
e390: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
e3a0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
e3b0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
e3c0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
e3d0: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65  if ((ciphersuite
e3e0: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
e3f0: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
e400: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70  rsuites(ctx, cip
e410: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54  hersuites)) {..T
e420: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e430: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e440: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65  her suites faile
e450: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
e460: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
e470: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e480: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e490: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
e4a0: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
e4b0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
e4c0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
e4d0: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
e4e0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
e4f0: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
e500: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
e510: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
e520: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
e530: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
e540: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
e550: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e560: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
e570: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
e580: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
e590: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
e5a0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
e5b0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
e5c0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
e5d0: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
e5e0: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
e5f0: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
e600: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
e610: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f  .#ifdef OPENSSL_
e620: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48  NO_DH.    if (DH
e630: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
e640: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e650: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20  ult(interp, "DH 
e660: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72  parameter suppor
e670: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22  t not available"
e680: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e690: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e6a0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e6b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  LL;.    }.#else.
e6c0: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09      {..DH* dh;..
e6d0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
e6e0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f  NULL) {..    BIO
e6f0: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f   *bio;..    Tcl_
e700: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
e710: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ;..    bio = BIO
e720: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
e730: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
e740: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
e750: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
e760: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
e770: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e780: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
e790: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
e7a0: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
e7b0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
e7c0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e7d0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
e7e0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68  ..    }...    dh
e7f0: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f   = PEM_read_bio_
e800: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55  DHparams(bio, NU
e810: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
e820: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
e830: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  io);..    Tcl_DS
e840: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e850: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a  .    if (!dh) {.
e860: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e870: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
e880: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61  d not read DH pa
e890: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69  rameters from fi
e8a0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
e8b0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
e8c0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
e8d0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
e8e0: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e8f0: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
e900: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64  ;..    DH_free(d
e910: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h);...} else {..
e920: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20      /* Use well 
e930: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74  known DH paramet
e940: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75  ers that have bu
e950: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69  ilt-in support i
e960: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20  n OpenSSL */..  
e970: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73    if (!SSL_CTX_s
e980: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20  et_dh_auto(ctx, 
e990: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  1)) {...Tcl_Appe
e9a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e9b0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62   "Could not enab
e9c0: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20  le set DH auto: 
e9d0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
e9e0: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
e9f0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ea00: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ea10: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ea20: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
ea30: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
ea40: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20  certificate */. 
ea50: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f     load_private_
ea60: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  key = 0;.    if 
ea70: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c  (certfile != NUL
ea80: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
ea90: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63  te_key = 1;...Tc
eaa0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
eab0: 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  s);...if (SSL_CT
eac0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
ead0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
eae0: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
eaf0: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
eb00: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
eb10: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
eb20: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
eb30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
eb40: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
eb50: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
eb60: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
eb70: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
eb80: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
eb90: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
eba0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ebb0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
ebc0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
ebd0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
ebe0: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
ebf0: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
ec00: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
ec10: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
ec20: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
ec30: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
ec40: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
ec50: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
ec60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ec70: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
ec80: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
ec90: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45   ",...GET_ERR_RE
eca0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ecb0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
ecc0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
ecd0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
ece0: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
ecf0: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63  {..certfile = (c
ed00: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65  har*)X509_get_de
ed10: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28  fault_cert_file(
ed20: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
ed30: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
ed40: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66  _file(ctx, certf
ed50: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ile, SSL_FILETYP
ed60: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23  E_PEM) <= 0) {.#
ed70: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53  if 0..    Tcl_DS
ed80: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
ed90: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
eda0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
edb0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66  nable to use def
edc0: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65  ault certificate
edd0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
ede0: 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45  e, ": ",...GET_E
edf0: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
ee00: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ee10: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
ee20: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
ee30: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d   NULL;.#endif..}
ee40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
ee50: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b  et our private k
ee60: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f  ey */.    if (lo
ee70: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20  ad_private_key) 
ee80: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d  {..if (keyfile =
ee90: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d  = NULL && key ==
eea0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65   NULL) {..    ke
eeb0: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
eec0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69  ;..}...if (keyfi
eed0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
eee0: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72     /* get the pr
eef0: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
ef00: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
ef10: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
ef20: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d     if (keyfile =
ef30: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66  = NULL) {...keyf
ef40: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
ef50: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
ef60: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
ef70: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
ef80: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
ef90: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
efa0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
efb0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
efc0: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
efd0: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
efe0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
eff0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
f000: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
f010: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
f020: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
f030: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
f040: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
f050: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
f060: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
f070: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20  yfile, " ",...  
f080: 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e    GET_ERR_REASON
f090: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f0a0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f0b0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f0c0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f0d0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f0e0: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c  ree(&ds);...} el
f0f0: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55  se if (key != NU
f100: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53  LL) {..    if (S
f110: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
f120: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50  teKey_ASN1(EVP_P
f130: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65  KEY_RSA, ctx, ke
f140: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29  y,key_len) <= 0)
f150: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
f160: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20  Free(&ds);.../* 
f170: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
f180: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
f190: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
f1a0: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f  result */...Tcl_
f1b0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f1c0: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54  , NULL, TCL_STAT
f1d0: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  IC);...Tcl_Appen
f1e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f1f0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70  "unable to set p
f200: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45  ublic key: ", GE
f210: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
f220: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f230: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f240: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f250: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f  LL;..    }..}../
f260: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68  * Now we know th
f270: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72  at a key and cer
f280: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  t have been set 
f290: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20  against.. * the 
f2a0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  SSL context */..
f2b0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65  if (!SSL_CTX_che
f2c0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63  ck_private_key(c
f2d0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  tx)) {..    Tcl_
f2e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f2f0: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65  erp, "private ke
f300: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
f310: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
f320: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09   public key",...
f330: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e  .     (char *) N
f340: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
f350: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
f360: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
f370: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
f380: 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f   Set verificatio
f390: 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c  n CAs */.    Tcl
f3a0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
f3b0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
f3c0: 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20  ngInit(&ds1);.  
f3d0: 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    /* There is on
f3e0: 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
f3f0: 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74  ory, one default
f400: 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64   file, and one d
f410: 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54  efault store...T
f420: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65  he default CA ce
f430: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63  rtificates direc
f440: 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c  tory (and defaul
f450: 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74  t store) is in t
f460: 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74  he OpenSSL..cert
f470: 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20  s directory. It 
f480: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
f490: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
f4a0: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54  T_DIR env var. T
f4b0: 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63  he..default CA c
f4c0: 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65  ertificates file
f4d0: 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e   is called cert.
f4e0: 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75  pem in the defau
f4f0: 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65  lt OpenSSL..dire
f500: 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65  ctory. It can be
f510: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
f520: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45  he SSL_CERT_FILE
f530: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a   env var. */../*
f540: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74   int SSL_CTX_set
f550: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f  _default_verify_
f560: 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78  dir(SSL_CTX *ctx
f570: 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54  ) and int SSL_CT
f580: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65  X_set_default_ve
f590: 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54  rify_file(SSL_CT
f5a0: 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69  X *ctx) */.    i
f5b0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
f5c0: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
f5d0: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
f5e0: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64  e, &ds), F2N(CAd
f5f0: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21  ir, &ds1)) ||..!
f600: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f610: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73  ult_verify_paths
f620: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09  (ctx)) {.#if 0..
f630: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f640: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  &ds);..Tcl_DStri
f650: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f  ngFree(&ds1);../
f660: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c  * Don't currentl
f670: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66  y care if this f
f680: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  ails */..Tcl_App
f690: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f6a0: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76  , "SSL default v
f6b0: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20  erify paths: ", 
f6c0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
f6d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f6e0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
f6f0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
f700: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  LL;.#endif.    }
f710: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f  ..    /* https:/
f720: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  /sourceforge.net
f730: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20  /p/tls/bugs/57/ 
f740: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f  */.    /* XXX:TO
f750: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72  DO: Let the user
f760: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68   supply values h
f770: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ere instead of s
f780: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78  omething that ex
f790: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ists on the file
f7a0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66  system */.    if
f7b0: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
f7c0: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35  ) {..STACK_OF(X5
f7d0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
f7e0: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
f7f0: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
f800: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
f810: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20  ..if (certNames 
f820: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f830: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
f840: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
f850: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20  certNames);..}. 
f860: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
f870: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f880: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f890: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
f8a0: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
f8b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
f900: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
f910: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
f920: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
f930: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
f940: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
f950: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
f960: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
f970: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
f980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9c0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
f9d0: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
f9e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
f9f0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
fa00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
fa10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
fa20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
fa30: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
fa40: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
fa50: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
fa60: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
fa70: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
fa80: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
fa90: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
faa0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
fab0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
fac0: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
fad0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
fae0: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20  n;.    int nid, 
faf0: 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  res;.    (void) 
fb00: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
fb10: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
fb20: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
fb30: 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20  c < 2 || objc > 
fb40: 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20  3 || (objc == 3 
fb50: 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47  && !strcmp(Tcl_G
fb60: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
fb70: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b  ), "-local"))) {
fb80: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
fb90: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
fba0: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68  jv, "?-local? ch
fbb0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
fbc0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fbd0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
fbe0: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20  annel Id */.    
fbf0: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
fc00: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
fc10: 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d  bj(objv[(objc ==
fc20: 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54   2 ? 1 : 2)], (T
fc30: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29  cl_Size *) NULL)
fc40: 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ;.    chan = Tcl
fc50: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
fc60: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  rp, channelName,
fc70: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
fc80: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
fc90: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
fca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fcb0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fcc0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
fcd0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
fce0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
fcf0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
fd00: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
fd10: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
fd20: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
fd30: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
fd40: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
fd50: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fd60: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
fd70: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
fd80: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
fd90: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
fda0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
fdb0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
fdc0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
fdd0: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
fde0: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
fdf0: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
fe00: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
fe10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fe20: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
fe30: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
fe40: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
fe50: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  a(chan);..    /*
fe60: 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65   Get certificate
fe70: 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c   for peer or sel
fe80: 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  f */.    if (obj
fe90: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20  c == 2) {..peer 
fea0: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63  = SSL_get_peer_c
feb0: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
fec0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
fed0: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20   else {..peer = 
fee0: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63  SSL_get_certific
fef0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
ff00: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  l);.    }.    /*
ff10: 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66   Get X509 certif
ff20: 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  icate info */.  
ff30: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
ff40: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
ff50: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
ff60: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
ff70: 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
ff80: 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
ff90: 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
ffa0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
ffb0: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
ffc0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
ffd0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
ffe0: 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
fff0: 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10000 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10010 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
10020 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
10030 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
10040 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10050 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10060 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
10070 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
10080 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
10090 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
100a0 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
100b0 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
100c0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
100d0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
100e0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
100f0 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
10100 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10110 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
10120 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
10130 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
10140 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10150 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10160 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
10170 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
10180 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
10190 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
101a0 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
101b0 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
101c0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
101d0 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
101e0 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
101f0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10200 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
10210 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
10220 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
10230 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10240 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
10250 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
10260 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
10270 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
10280 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10290 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
102a0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
102b0 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
102c0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
102d0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
102e0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
102f0 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
10300 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10310 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10320 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
10330 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
10340 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10350 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10360 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10370 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10380 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
10390 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
103a0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
103b0 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
103c0 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
103d0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
103e0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
103f0 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10400 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
10410 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
10420 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10430 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
10440 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
10450 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10460 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10470 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10480 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
10490 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
104a0 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
104b0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
104c0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
104d0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
104e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
104f0 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
10500 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10510 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10520 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
10530 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
10540 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
10550 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
10560 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10570 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
10580 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
10590 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
105a0 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
105b0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
105c0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
105d0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
105e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
105f0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
10600 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
10610 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
10620 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10630 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10640 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10650 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
10660 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
10670 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
10680 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
10690 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
106a0 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
106b0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
106c0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
106d0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
106e0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
106f0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10700 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10710 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10720 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10730 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10740 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
10750 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10760 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10770 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
10780 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
10790 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
107a0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ..    if (objc =
107b0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
107c0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
107d0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
107e0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
107f0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
10800 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
10810 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
10820 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
10830 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
10840 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
10850 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
10860 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10870 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
10880 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
10890 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
108a0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
108b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
108c0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
108d0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
108e0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
10930 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10940 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
10950 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
10960 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
10970 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
10980 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
10990 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
109e0 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
109f0 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
10a00 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
10a10 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
10a20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
10a30 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
10a40 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
10a50 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
10a60 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
10a70 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
10a80 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
10a90 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
10aa0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
10ab0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
10ac0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
10ad0 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
10ae0 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
10af0 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
10b00 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
10b10 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
10b20 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
10b30 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
10b40 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28  VP_MD *md;.    (
10b50 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
10b60 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
10b70 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
10b80 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10b90 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
10ba0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
10bb0 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
10bc0 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
10bd0 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
10be0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10bf0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
10c00 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55  , (Tcl_Size *)NU
10c10 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
10c20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
10c30 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
10c40 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  {..return(TCL_ER
10c50 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
10c60 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
10c70 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
10c80 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
10c90 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
10ca0 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
10cb0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
10cc0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
10cd0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
10ce0 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
10cf0 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
10d00 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
10d10 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
10d20 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
10d30 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
10d40 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
10d50 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
10d60 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
10d70 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
10d80 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
10d90 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
10da0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
10db0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10dc0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f  R);.    }..    o
10dd0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
10de0 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
10df0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  ..    /* Connect
10e00 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
10e10 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
10e20 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
10e30 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
10e40 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20  han);.    ssl = 
10e50 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20  statePtr->ssl;. 
10e60 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
10e70 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63  LL) {../* connec
10e80 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c  tion state */..L
10e90 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10ea0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74  p, objPtr, "stat
10eb0 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74  e", SSL_state_st
10ec0 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
10ed0 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e  -1);.../* Get SN
10ee0 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76  I requested serv
10ef0 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
10f00 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10f10 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e  objPtr, "servern
10f20 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  ame", SSL_get_se
10f30 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
10f40 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
10f50 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a  st_name), -1);..
10f60 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c  ./* Get protocol
10f70 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
10f80 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10f90 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10fa0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c  _get_version(ssl
10fb0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e  ), -1);.../* Ren
10fc0 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77  egotiation allow
10fd0 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ed */..LAPPEND_B
10fe0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
10ff0 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69  tr, "renegotiati
11000 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c  on_allowed", SSL
11010 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65  _get_secure_rene
11020 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72  gotiation_suppor
11030 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65  t(ssl));.../* Ge
11040 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
11050 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
11060 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11070 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c   "security_level
11080 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72  ", SSL_get_secur
11090 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b  ity_level(ssl));
110a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e  .../* Session in
110b0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  fo */..LAPPEND_B
110c0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
110d0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75  tr, "session_reu
110e0 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f  sed", SSL_sessio
110f0 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a  n_reused(ssl));.
11100 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69  ../* Is server i
11110 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  nfo */..LAPPEND_
11120 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
11130 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22  Ptr, "is_server"
11140 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28  , SSL_is_server(
11150 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44  ssl));.../* Is D
11160 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  TLS */..LAPPEND_
11170 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
11180 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20  Ptr, "is_dtls", 
11190 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29  SSL_is_dtls(ssl)
111a0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
111b0 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a   Cipher info */.
111c0 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c      cipher = SSL
111d0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70  _get_current_cip
111e0 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  her(ssl);.    if
111f0 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c   (cipher != NULL
11200 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
11210 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e  FSIZ] = {0};..in
11220 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73  t bits, alg_bits
11230 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61  ;.../* Cipher na
11240 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  me */..LAPPEND_S
11250 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11260 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c  r, "cipher", SSL
11270 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
11280 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
11290 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20  ./* RFC name of 
112a0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
112b0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
112c0 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64  bjPtr, "standard
112d0 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48  _name", SSL_CIPH
112e0 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
112f0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
11300 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65  ./* OpenSSL name
11310 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c   of cipher */..L
11320 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11330 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e  p, objPtr, "open
11340 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53  ssl_name", OPENS
11350 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53  SL_cipher_name(S
11360 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
11370 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29  rd_name(cipher))
11380 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62  , -1);.../* numb
11390 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74  er of secret bit
113a0 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65  s used for ciphe
113b0 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c  r */..bits = SSL
113c0 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73  _CIPHER_get_bits
113d0 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69  (cipher, &alg_bi
113e0 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  ts);..LAPPEND_IN
113f0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11400 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c  , "secret_bits",
11410 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44   bits);..LAPPEND
11420 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11430 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f  Ptr, "algorithm_
11440 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29  bits", alg_bits)
11450 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69  ;../* alg_bits i
11460 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63  s actual key sec
11470 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65  ret bits. If use
11480 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74   bits and secret
11490 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74   (algorithm) bit
114a0 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68  s differ,..   th
114b0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69  e rest of the bi
114c0 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e  ts are fixed, i.
114d0 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65  e. for limited e
114e0 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62  xport ciphers (b
114f0 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f  its < 56) */.../
11500 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63  * Indicates whic
11510 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63  h SSL/TLS protoc
11520 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74  ol version first
11530 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70   defined the cip
11540 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
11550 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11560 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e  tr, "min_version
11570 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ", SSL_CIPHER_ge
11580 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72  t_version(cipher
11590 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70  ), -1);.../* Cip
115a0 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50  her NID */..LAPP
115b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
115c0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e  objPtr, "cipherN
115d0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
115e0 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
115f0 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69  ER_get_cipher_ni
11600 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
11610 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11620 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
11630 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72  igestNID", (char
11640 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
11650 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67  L_CIPHER_get_dig
11660 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29  est_nid(cipher))
11670 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
11680 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11690 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65  tr, "keyExchange
116a0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
116b0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
116c0 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63  HER_get_kx_nid(c
116d0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
116e0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
116f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68  p, objPtr, "auth
11700 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20  enticationNID", 
11710 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
11720 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
11730 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65  t_auth_nid(ciphe
11740 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d  r)), -1);.../* m
11750 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63  essage authentic
11760 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70  ation code - Cip
11770 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67  her is AEAD (e.g
11780 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32  . GCM or ChaCha2
11790 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e  0/Poly1305) or n
117a0 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e  ot */../* Authen
117b0 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69  ticated Encrypti
117c0 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74  on with associat
117d0 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63  ed data (AEAD) c
117e0 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  heck */..LAPPEND
117f0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11800 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73  jPtr, "cipher_is
11810 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48  _aead", SSL_CIPH
11820 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65  ER_is_aead(ciphe
11830 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74  r));.../* Digest
11840 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65   used during the
11850 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61   SSL/TLS handsha
11860 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68  ke when using th
11870 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64  e cipher. */..md
11880 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
11890 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65  t_handshake_dige
118a0 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50  st(cipher);..LAP
118b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
118c0 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68   objPtr, "handsh
118d0 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68  ake_digest", (ch
118e0 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65  ar *)EVP_MD_name
118f0 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  (md), -1);.../* 
11900 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63  Get OpenSSL-spec
11910 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e  ific ID, not IAN
11920 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  A ID */..LAPPEND
11930 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11940 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22  Ptr, "cipher_id"
11950 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48  , (int) SSL_CIPH
11960 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72  ER_get_id(cipher
11970 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74  ));.../* Two-byt
11980 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65  e ID used in the
11990 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66   TLS protocol of
119a0 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65   the given ciphe
119b0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  r */..LAPPEND_IN
119c0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
119d0 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c  , "protocol_id",
119e0 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45   (int) SSL_CIPHE
119f0 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69  R_get_protocol_i
11a00 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
11a10 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70   Textual descrip
11a20 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68  tion of the ciph
11a30 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43  er */..if (SSL_C
11a40 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
11a50 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73  n(cipher, buf, s
11a60 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
11a70 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50  ULL) {..    LAPP
11a80 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11a90 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70  objPtr, "descrip
11aa0 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b  tion", buf, -1);
11ab0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
11ac0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11ad0 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20  /.    session = 
11ae0 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
11af0 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65  ssl);.    if (se
11b00 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  ssion != NULL) {
11b10 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
11b20 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09   char *ticket;..
11b30 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e  size_t len2;..un
11b40 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
11b50 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
11b60 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
11b70 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72  d, *proto;..char
11b80 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f   buffer[SSL_MAX_
11b90 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
11ba0 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  H];.../* Report 
11bb0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
11bc0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
11bd0 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65  t of the ALPN ne
11be0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53  gotiation */..SS
11bf0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61  L_SESSION_get0_a
11c00 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73  lpn_selected(ses
11c10 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  sion, &proto, &l
11c20 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  en2);..LAPPEND_S
11c30 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11c40 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72  r, "alpn", (char
11c50 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
11c60 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
11c70 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
11c80 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
11c90 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
11ca0 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f  e NPN negotiatio
11cb0 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  n */.#ifdef USE_
11cc0 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65  NPN..SSL_get0_ne
11cd0 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61  xt_proto_negotia
11ce0 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  ted(ssl, &proto,
11cf0 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
11d00 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11d10 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68  jPtr, "npn", (ch
11d20 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
11d30 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23  l_Size) ulen);.#
11d40 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d  endif.../* Resum
11d50 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  able session */.
11d60 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
11d70 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
11d80 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53  esumable", SSL_S
11d90 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61  ESSION_is_resuma
11da0 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  ble(session));..
11db0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72  ./* Session star
11dc0 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20  t time (seconds 
11dd0 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a  since epoch) */.
11de0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
11df0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11e00 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f  tart_time", SSL_
11e10 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
11e20 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
11e30 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d   Timeout value -
11e40 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d   SSL_CTX_get_tim
11e50 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  eout (in seconds
11e60 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
11e70 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
11e80 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53  r, "timeout", SS
11e90 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
11ea0 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b  meout(session));
11eb0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64  .../* Session id
11ec0 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62   - TLSv1.2 and b
11ed0 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65  elow only */..se
11ee0 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
11ef0 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
11f00 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09  ssion, &ulen);..
11f10 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
11f20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11f30 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
11f40 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
11f50 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20  ze) ulen);.../* 
11f60 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20  Session context 
11f70 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
11f80 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
11f90 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73  0_id_context(ses
11fa0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
11fb0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
11fc0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11fd0 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c  ession_context",
11fe0 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63   session_id, (Tc
11ff0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
12000 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
12010 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79  et - client only
12020 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
12030 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
12040 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
12050 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
12060 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
12070 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
12080 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c  ticket", ticket,
12090 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
120a0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
120b0 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20  ticket lifetime 
120c0 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  hint (in seconds
120d0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
120e0 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
120f0 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53  r, "lifetime", S
12100 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
12110 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
12120 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  int(session));..
12130 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64  ./* Ticket app d
12140 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  ata */..SSL_SESS
12150 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f  ION_get0_ticket_
12160 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c  appdata(session,
12170 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
12180 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
12190 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
121a0 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61  , "ticket_app_da
121b0 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63  ta", ticket, (Tc
121c0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
121d0 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b  ./* Get master k
121e0 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53  ey */..len2 = SS
121f0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61  L_SESSION_get_ma
12200 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e  ster_key(session
12210 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41  , buffer, SSL_MA
12220 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
12230 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  GTH);..LAPPEND_B
12240 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
12250 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65  jPtr, "master_ke
12260 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c  y", buffer, (Tcl
12270 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
12280 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
12290 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69  d */..unsigned i
122a0 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  nt id = SSL_SESS
122b0 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73  ION_get_compress
122c0 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c  _id(session);..L
122d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
122e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
122f0 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20  ression_id", id 
12300 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20  == 1 ? "zlib" : 
12310 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
12320 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
12330 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
12340 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
12350 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
12360 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
12370 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
12380 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
12390 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
123a0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
123b0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
123c0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
123d0 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
123e0 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53  sl);...LAPPEND_S
123f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12400 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
12410 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d  , comp ? SSL_COM
12420 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29  P_get_name(comp)
12430 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
12440 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12450 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
12460 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f  pansion", expn ?
12470 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
12480 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65  me(expn) : "none
12490 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c  ", -1);.#else..L
124a0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
124b0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
124c0 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  ression", "none"
124d0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
124e0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
124f0 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c  tr, "expansion",
12500 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
12510 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
12520 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
12530 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f  /.    {..long mo
12540 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
12550 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
12560 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
12570 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a  x);..char *msg;.
12580 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  ..if (mode & SSL
12590 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
125a0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f   {..    msg = "o
125b0 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ff";..} else if 
125c0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
125d0 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b  _CACHE_CLIENT) {
125e0 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69  ..    msg = "cli
125f0 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ent";..} else if
12600 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
12610 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
12620 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65  {..    msg = "se
12630 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69  rver";..} else i
12640 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12650 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b  SS_CACHE_BOTH) {
12660 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74  ..    msg = "bot
12670 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  h";..} else {.. 
12680 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77     msg = "unknow
12690 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  n";..}..LAPPEND_
126a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
126b0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63  tr, "session_cac
126c0 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d  he_mode", msg, -
126d0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
126e0 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20  * CA List */.   
126f0 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72   /* IF not a ser
12700 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c  ver, same as SSL
12710 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69  _get0_peer_CA_li
12720 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61  st. If server sa
12730 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65  me as SSL_CTX_ge
12740 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
12750 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20   */.    listPtr 
12760 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
12770 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53  (0, NULL);.    S
12780 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
12790 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20  E) *ca_list;.   
127a0 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20   if ((ca_list = 
127b0 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  SSL_get_client_C
127c0 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20  A_list(ssl)) != 
127d0 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
127e0 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66  ffer[BUFSIZ];..f
127f0 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
12800 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
12810 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b  num(ca_list); i+
12820 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e  +) {..    X509_N
12830 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58  AME *name = sk_X
12840 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63  509_NAME_value(c
12850 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20  a_list, i);..   
12860 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58   if (name) {...X
12870 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65  509_NAME_oneline
12880 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42  (name, buffer, B
12890 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69  UFSIZ);...Tcl_Li
128a0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
128b0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
128c0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
128d0 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
128e0 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
128f0 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f   }.    LAPPEND_O
12900 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
12910 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73  r, "caList", lis
12920 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45  tPtr);.    LAPPE
12930 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12940 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f  bjPtr, "caListCo
12950 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41  unt", sk_X509_NA
12960 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29  ME_num(ca_list))
12970 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
12980 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
12990 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
129a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
129b0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
129c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56  --------. *. * V
12a00 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20  ersionObjCmd -- 
12a10 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73  return version s
12a20 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53  tring from OpenS
12a30 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
12a40 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
12a50 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
12a60 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12a70 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ac0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
12ad0 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28  t.VersionObjCmd(
12ae0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
12af0 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
12b00 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
12b10 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
12b20 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
12b30 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
12b40 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  r;.    (void) cl
12b50 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76  ientData;.    (v
12b60 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28  oid) objc;.    (
12b70 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20  void) objv;..   
12b80 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12b90 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
12ba0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
12bb0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
12bc0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
12bd0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
12be0 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
12bf0 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
12c00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
12c10 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c50 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
12c60 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
12c70 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
12c80 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
12c90 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
12ca0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
12cb0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
12cc0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d00 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
12d10 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
12d20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
12d30 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
12d40 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
12d50 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
12d60 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
12d70 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
12d80 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
12d90 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
12da0 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
12db0 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
12dc0 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
12dd0 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
12de0 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20   Tcl_Size cmd;. 
12df0 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20     int isStr;.  
12e00 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36    char buffer[16
12e10 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29  384];.    (void)
12e20 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
12e30 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
12e40 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
12e50 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
12e60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
12e70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75  rp, 1, objv, "su
12e80 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22  bcommand ?args?"
12e90 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
12ea0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12eb0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
12ec0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12ed0 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64  objv[1], command
12ee0 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  s, "command", 0,
12ef0 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b   &cmd) != TCL_OK
12f00 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
12f10 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
12f20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
12f30 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20  r();..    isStr 
12f40 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52  = (cmd == C_STRR
12f50 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20  EQ);.    switch 
12f60 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20  ((enum command) 
12f70 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52  cmd) {..case C_R
12f80 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52  EQ:..case C_STRR
12f90 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50  EQ: {..    EVP_P
12fa0 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a  KEY *pkey=NULL;.
12fb0 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d  .    X509 *cert=
12fc0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f  NULL;..    X509_
12fd0 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b  NAME *name=NULL;
12fe0 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ..    Tcl_Obj **
12ff0 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f  listv;..    Tcl_
13000 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20  Size listc;..   
13010 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49   int i;...    BI
13020 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
13030 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
13040 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
13050 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
13060 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
13070 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
13080 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
13090 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
130a0 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
130b0 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66  0,days=365;..#if
130c0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
130d0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
130e0 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55  0000L..    BIGNU
130f0 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09  M *bne = NULL;..
13100 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e      RSA *rsa = N
13110 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ULL;.#else..    
13120 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74  EVP_PKEY_CTX *ct
13130 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  x = NULL;.#endif
13140 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ...    if ((objc
13150 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
13160 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
13170 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
13180 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
13190 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
131a0 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
131b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
131c0 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
131d0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
131e0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
131f0 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
13200 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
13210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
13220 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
13230 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
13240 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
13250 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
13260 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20  ng(objv[4]);..  
13270 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09    if (isStr) {..
13280 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13290 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b  rp,keyout,"",0);
132a0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
132b0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30  terp,pemout,"",0
132c0 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
132d0 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
132e0 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
132f0 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
13300 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69  rp, objv[5], &li
13310 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
13320 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
13330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13340 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
13350 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
13360 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
13370 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
13380 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
13390 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
133a0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
133b0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
133c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
133d0 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
133e0 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
133f0 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
13400 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
13410 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
13420 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
13430 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
13440 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13450 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13460 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
13470 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
13480 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
13490 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
134a0 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
134b0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
134c0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
134d0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
134e0 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
134f0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
13500 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
13510 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13520 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
13530 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
13540 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13550 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13560 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13570 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
13580 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
13590 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
135a0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
135b0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
135c0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
135d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
135e0 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
135f0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13600 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
13610 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
13620 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13630 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13640 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
13650 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
13660 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
13670 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13680 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13690 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
136a0 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
136b0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
136c0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
136d0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
136e0 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
136f0 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
13700 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13710 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13720 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
13730 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13740 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
13750 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
13760 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13770 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
13780 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
13790 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
137a0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
137b0 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
137c0 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
137d0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
137e0 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
137f0 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
13800 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
13810 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
13820 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
13830 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
13840 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
13850 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
13860 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
13870 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
13880 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
13890 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
138a0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
138b0 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
138c0 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
138d0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
138e0 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
138f0 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
13900 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
13910 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
13920 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
13930 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
13940 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
13950 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
13960 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
13970 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
13980 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
13990 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
139a0 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
139b0 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
139c0 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
139d0 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
139e0 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
139f0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
13a00 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
13a10 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
13a20 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
13a30 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
13a40 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
13a50 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
13a60 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13a70 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
13a80 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
13a90 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
13aa0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
13ab0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13ac0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
13ad0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
13ae0 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
13af0 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
13b00 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
13b10 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
13b20 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
13b30 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
13b40 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
13b50 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
13b60 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
13b70 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
13b80 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
13b90 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
13ba0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
13bb0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
13bc0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
13bd0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
13be0 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
13bf0 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
13c00 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
13c10 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
13c20 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
13c30 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
13c40 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
13c50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
13c60 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
13c70 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
13c80 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
13c90 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
13ca0 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
13cb0 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
13cc0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
13cd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
13ce0 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
13cf0 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
13d00 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
13d10 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
13d20 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
13d30 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
13d40 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
13d50 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
13d60 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
13d70 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f   return(TCL_ERRO
13d80 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  R);...}....X509_
13d90 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74  set_version(cert
13da0 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45  ,2);...ASN1_INTE
13db0 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74  GER_set(X509_get
13dc0 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65  _serialNumber(ce
13dd0 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58  rt),serial);...X
13de0 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
13df0 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f  509_getm_notBefo
13e00 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
13e10 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
13e20 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65  509_getm_notAfte
13e30 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30  r(cert),(long)60
13e40 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09  *60*24*days);...
13e50 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28  X509_set_pubkey(
13e60 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e  cert,pkey);....n
13e70 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62  ame=X509_get_sub
13e80 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b  ject_name(cert);
13e90 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ....X509_NAME_ad
13ea0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13eb0 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e  ame,"C", MBSTRIN
13ec0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13ed0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13ee0 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _C, -1, -1, 0);.
13ef0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13f00 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13f10 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47  e,"ST", MBSTRING
13f20 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13f30 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13f40 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  ST, -1, -1, 0);.
13f50 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13f60 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13f70 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"L", MBSTRING_
13f80 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
13f90 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c  gned char *) k_L
13fa0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13fb0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13fc0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13fd0 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "O", MBSTRING_AS
13fe0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
13ff0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20  ed char *) k_O, 
14000 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14010 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14020 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
14030 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  U", MBSTRING_ASC
14040 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14050 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20  d char *) k_OU, 
14060 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14070 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14080 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
14090 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  N", MBSTRING_ASC
140a0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
140b0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20  d char *) k_CN, 
140c0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
140d0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
140e0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45  y_by_txt(name,"E
140f0 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  mail", MBSTRING_
14100 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14110 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45  gned char *) k_E
14120 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  mail, -1, -1, 0)
14130 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75  ;....X509_set_su
14140 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c  bject_name(cert,
14150 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58  name);....if (!X
14160 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b  509_sign(cert,pk
14170 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29  ey,EVP_sha256())
14180 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66  ) {...    X509_f
14190 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20  ree(cert);...   
141a0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
141b0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
141c0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
141d0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
141e0 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
141f0 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
14200 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14210 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e  terp,"Error sign
14220 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22  ing certificate"
14230 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
14240 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14250 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72  ..}....if (isStr
14260 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
14270 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
14280 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
14290 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
142a0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d  ,cert);...    i=
142b0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
142c0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
142d0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
142e0 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
142f0 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
14300 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
14310 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
14320 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
14330 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
14340 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14350 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
14360 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
14370 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
14380 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
14390 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
143a0 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20  t,pemout);...   
143b0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58   PEM_write_bio_X
143c0 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09  509(out,cert);..
143d0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c  .    BIO_free_al
143e0 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58  l(out);...}....X
143f0 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
14400 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
14410 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
14420 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
14430 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
14440 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
14450 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d  #endif..    }..}
14460 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ..break;.    def
14470 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20  ault:..break;.  
14480 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
14490 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a  CL_OK;.}.../****
144a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144b0 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20  /./* Init       
144c0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
144d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
144e0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
144f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14520 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
14530 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20  Tls_Free --. *. 
14540 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
14550 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
14560 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
14570 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
14580 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
14590 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
145a0 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a  falls below 1. *
145b0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
145c0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
145d0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
145e0 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
145f0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
14600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14630 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
14640 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20  d.Tls_Free(char 
14650 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20  *blockPtr) {.   
14660 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
14670 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63   = (State *)bloc
14680 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  kPtr;..    dprin
14690 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
146a0 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
146b0 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
146c0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
146d0 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
14720 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
14730 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
14740 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
14750 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
14760 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
14770 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
14780 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
14790 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
147a0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
147b0 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
147c0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
147d0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
147e0 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
147f0 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
14800 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
14810 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
14820 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
14830 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
14840 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
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 2d 2d 2d  ----------------
14880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
14890 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28  .void Tls_Clean(
148a0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
148b0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
148c0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
148d0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61  *.     * we're a
148e0 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
148f0 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
14900 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a  hreaded.     */.
14910 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14920 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
14930 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
14940 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
14950 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
14960 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
14970 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
14980 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
14990 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
149a0 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
149b0 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
149c0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
149d0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
149e0 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
149f0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
14a00 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
14a10 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
14a20 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
14a30 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
14a40 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
14a50 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
14a60 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
14a70 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
14a80 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
14a90 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
14aa0 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
14ab0 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
14ac0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
14ad0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
14ae0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
14af0 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
14b00 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14b10 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14b20 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
14b30 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
14b40 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
14b50 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
14b60 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14b70 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
14b80 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
14b90 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
14ba0 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
14bb0 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
14bc0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
14bd0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
14be0 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
14bf0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
14c00 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
14c10 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
14c20 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
14c30 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14c40 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
14c50 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
14c60 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
14c70 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
14c80 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
14c90 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
14ca0 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54  ing");.}...#if T
14cb0 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
14cc0 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e   > 8.#define MIN
14cd0 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23  _VERSION "9.0".#
14ce0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e  else.#define MIN
14cf0 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23  _VERSION "8.5".#
14d00 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  endif../*. *----
14d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14d50 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
14d60 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
14d70 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
14d80 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
14d90 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
14da0 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
14db0 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
14dc0 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
14dd0 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
14de0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
14df0 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
14e00 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
14e10 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14e20 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
14e30 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
14e40 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
14e50 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
14e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
14ea0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
14eb0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
14ec0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
14ed0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
14ee0 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
14ef0 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
14f00 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
14f10 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
14f20 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
14f30 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
14f40 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49  BS.    if (Tcl_I
14f50 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
14f60 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29   MIN_VERSION, 0)
14f70 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
14f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14f90 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14fa0 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69  if (Tcl_PkgRequi
14fb0 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22  re(interp, "Tcl"
14fc0 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30  , MIN_VERSION, 0
14fd0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
14fe0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14ff0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
15000 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20  lsLibInit(0) != 
15010 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
15020 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15030 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
15040 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
15050 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29  brary", (char *)
15060 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
15070 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
15080 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
15090 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
150a0 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  p, "tls::ciphers
150b0 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
150c0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
150d0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
150e0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
150f0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15100 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15110 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74  p, "tls::connect
15120 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e  ion", Connection
15130 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  InfoObjCmd, (Cli
15140 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15150 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15160 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15170 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15180 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15190 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48  s::handshake", H
151a0 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20  andshakeObjCmd, 
151b0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
151c0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
151d0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
151e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
151f0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15200 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20   "tls::import", 
15210 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  ImportObjCmd, (C
15220 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15230 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15240 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15250 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15260 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15270 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20  tls::unimport", 
15280 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  UnimportObjCmd, 
15290 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
152a0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
152b0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
152c0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
152d0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
152e0 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20   "tls::status", 
152f0 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43  StatusObjCmd, (C
15300 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15310 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15320 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15330 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15340 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15350 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
15360 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
15370 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15380 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15390 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
153a0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
153b0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
153c0 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63  tls::misc", Misc
153d0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
153e0 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
153f0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15400 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15410 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15420 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70  (interp, "tls::p
15430 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f  rotocols", Proto
15440 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  colsObjCmd, (Cli
15450 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15460 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15470 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  c *) NULL);..   
15480 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09   if (interp) {..
15490 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
154a0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
154b0 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  t);.    }..    r
154c0 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f  eturn Tcl_PkgPro
154d0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43  vide(interp, PAC
154e0 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41  KAGE_NAME, PACKA
154f0 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a  GE_VERSION);.}..
15500 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15510 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15520 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15540 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
15550 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
15560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15570 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74  ---------*. *.St
15590 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
155a0 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
155b0 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
155c0 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
155d0 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
155e0 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
155f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15620 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
15630 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
15640 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
15650 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
15660 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
15670 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
156c0 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
156d0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
156e0 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
156f0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
15700 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e     return(Tls_In
15710 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a  it(interp));.}..
15720 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15760 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
15770 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157a0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
157b0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
157c0 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
157d0 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15810 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
15820 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
15830 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
15840 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
15850 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
15860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
158a0 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
158b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
158c0 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
158d0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
158e0 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
158f0 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
15900 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
15910 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
15920 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
15930 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
15940 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
15950 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
15960 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
15970 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
15980 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
15990 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
159a0 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
159b0 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
159c0 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
159d0 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
159e0 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
159f0 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65  alize");..#if de
15a00 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
15a10 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
15a20 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
15a30 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
15a40 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c  nit_mx);...if (l
15a50 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65  ocks) {..    fre
15a60 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c  e(locks);..    l
15a70 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ocks = NULL;..  
15a80 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30    locksCount = 0
15a90 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69  ;..}.#endif..ini
15aa0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23  tialized = 0;..#
15ab0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15ac0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15ad0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15ae0 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
15af0 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
15b00 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
15b10 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a  TCL_OK);.    }..
15b20 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69      if (initiali
15b30 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  zed) {..dprintf(
15b40 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69  "Called, but usi
15b50 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22  ng cached value"
15b60 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  );..return(statu
15b70 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  s);.    }..    d
15b80 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
15b90 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15ba0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15bb0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15bc0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
15bd0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
15be0 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
15bf0 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
15c00 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
15c10 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15c20 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15c30 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
15c40 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
15c50 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
15c60 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
15c70 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
15c80 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
15c90 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
15ca0 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
15cb0 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
15cc0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
15cd0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
15ce0 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
15cf0 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
15d00 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
15d10 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
15d20 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
15d30 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
15d40 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
15d50 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
15d60 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
15d70 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
15d80 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
15d90 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
15da0 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
15db0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
15dc0 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
15dd0 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
15de0 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
15df0 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
15e00 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
15e10 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
15e20 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
15e30 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
15e40 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
15e50 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
15e60 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
15e70 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
15e80 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
15e90 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
15ea0 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
15eb0 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
15ec0 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
15ed0 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
15ee0 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
15ef0 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
15f00 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
15f10 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
15f20 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
15f30 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
15f40 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
15f50 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
15f60 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
15f70 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
15f80 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
15f90 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
15fa0 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
15fb0 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
15fc0 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
15fd0 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
15fe0 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
15ff0 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
16000 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
16010 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
16020 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
16030 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
16040 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
16050 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
16060 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
16070 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
16080 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
16090 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
160a0 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
160b0 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
160c0 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
160d0 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
160e0 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
160f0 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
16100 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
16110 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
16120 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
16130 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
16140 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
16150 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
16160 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
16170 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
16180 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
16190 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28  dif..    return(
161a0 73 74 61 74 75 73 29 3b 0a 7d 0a                 status);.}.