Hex Artifact Content

Artifact ea83c6521ffdf0d69ab64bc01b17bf32a413b8778a7d267f3fa76c7efe886b6d:


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: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 66  if (statePtr->vf
29f0: 6c 61 67 73 20 26 20 53 53 4c 5f 56 45 52 49 46  lags & SSL_VERIF
2a00: 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45  Y_FAIL_IF_NO_PEE
2a10: 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 72  R_CERT) {..    r
2a20: 65 74 75 72 6e 20 6f 6b 3b 0a 09 7d 20 65 6c 73  eturn ok;..} els
2a30: 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  e {..    return 
2a40: 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65  1;..}.    } else
2a50: 20 69 66 20 28 63 65 72 74 20 3d 3d 20 4e 55 4c   if (cert == NUL
2a60: 4c 20 7c 7c 20 73 73 6c 20 3d 3d 20 4e 55 4c 4c  L || ssl == NULL
2a70: 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20  ) {..return 0;. 
2a80: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
2a90: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
2aa0: 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  val */.    cmdPt
2ab0: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2ac0: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
2ad0: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
2ae0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2af0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2b00: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2b10: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31  Obj("verify", -1
2b20: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2b30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b40: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2b50: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2b60: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2b70: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2b80: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2b90: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2ba0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2bb0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2bc0: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b  wIntObj(depth));
2bd0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2be0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2bf0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
2c00: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
2c10: 65 72 70 2c 20 63 65 72 74 29 29 3b 0a 20 20 20  erp, cert));.   
2c20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c30: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c40: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2c50: 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b 0a 20 20  wIntObj(ok));.  
2c60: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2c70: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2c80: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f  p, cmdPtr,..Tcl_
2c90: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68  NewStringObj((ch
2ca0: 61 72 2a 29 58 35 30 39 5f 76 65 72 69 66 79 5f  ar*)X509_verify_
2cb0: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
2cc0: 67 28 65 72 72 29 2c 20 2d 31 29 29 3b 0a 0a 20  g(err), -1));.. 
2cd0: 20 20 20 2f 2a 20 50 72 65 76 65 6e 74 20 49 2f     /* Prevent I/
2ce0: 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62 61 63 6b  O while callback
2cf0: 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20   is in progress 
2d00: 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50  */.    /* stateP
2d10: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
2d20: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 3b 20 2a  _TCL_CALLBACK; *
2d30: 2f 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  /..    /* Eval c
2d40: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
2d50: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
2d60: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
2d70: 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c 43 61  .    ok = EvalCa
2d80: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
2d90: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
2da0: 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
2db0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
2dc0: 0a 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72  .    /* statePtr
2dd0: 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53  ->flags &= ~(TLS
2de0: 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20  _TCL_CALLBACK); 
2df0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b  */.    return(ok
2e00: 29 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74  );./* By default
2e10: 2c 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61  , leave verifica
2e20: 74 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20  tion unchanged. 
2e30: 2a 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  */.}.../*. *----
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2e80: 20 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20   *. * Tls_Error 
2e90: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63  --. *. *.Calls c
2ea0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73  allback with lis
2eb0: 74 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a  t of errors.. *.
2ec0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
2ed0: 0a 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c  . *.The err fiel
2ee0: 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  d of the current
2ef0: 6c 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61  ly operative Sta
2f00: 74 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74  te is set. *.  t
2f10: 6f 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72  o a string descr
2f20: 69 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65  ibing the SSL ne
2f30: 67 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72  gotiation failur
2f40: 65 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d  e reason. *. *--
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f90: 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45  -. */.void.Tls_E
2fa0: 72 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74  rror(State *stat
2fb0: 65 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29  ePtr, char *msg)
2fc0: 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72   {.    Tcl_Inter
2fd0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
2fe0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
2ff0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
3000: 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
3010: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65   unsigned long e
3020: 72 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rr;.    statePtr
3030: 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20  ->err = msg;..  
3040: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3050: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
3060: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
3070: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
3080: 4c 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20  LL)..return;..  
3090: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
30a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
30b0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
30c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
30d0: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
30e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
30f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3100: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3110: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3120: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
3130: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3140: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3150: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3160: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3170: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3180: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3190: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
31a0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
31b0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
31c0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
31d0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
31e0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
31f0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
3200: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
3210: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
3220: 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52  mObj(Tcl_GetObjR
3230: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28  esult(interp), (
3240: 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c  Tcl_Size *) NULL
3250: 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  )) != NULL) {..T
3260: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
3270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3280: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
3290: 74 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31  tringObj(msg, -1
32a0: 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20  ));..    } else 
32b0: 7b 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c  {..listPtr = Tcl
32c0: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
32d0: 55 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65  ULL);..while ((e
32e0: 72 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72  rr = ERR_get_err
32f0: 6f 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20  or()) != 0) {.. 
3300: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3310: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3320: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c  rp, listPtr, Tcl
3330: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52  _NewStringObj(ER
3340: 52 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73  R_reason_error_s
3350: 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29  tring(err), -1))
3360: 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  ;..}..Tcl_ListOb
3370: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3380: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c  nterp, cmdPtr, l
3390: 69 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a  istPtr);.    }..
33a0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
33b0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
33c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
33d0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
33e0: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
33f0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
3400: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
3410: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
3420: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
3430: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3470: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
3480: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
3490: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
34a0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
34b0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
34c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
34d0: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
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 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3520: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
3530: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3540: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
3550: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
3560: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
3570: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
3580: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20      FILE *fd;.. 
3590: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
35a0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
35b0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
35c0: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
35d0: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
35e0: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
35f0: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
3600: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
3650: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
3660: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
3670: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
3680: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3690: 79 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e  y loading/storin
36a0: 67 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69  g a PEM. *.certi
36b0: 66 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72  ficate with encr
36c0: 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61  yption. Evals ca
36d0: 6c 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e  llback script an
36e0: 64 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65  d returns. *.the
36f0: 20 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70   result as the p
3700: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69  assword string i
3710: 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73  n buf.. *. * Res
3720: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
3730: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3740: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
3750: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
3760: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
3770: 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65   *.Password size
3780: 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20   in bytes or -1 
3790: 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a  for an error.. *
37a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
37f0: 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61  c int.PasswordCa
3800: 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66  llback(char *buf
3810: 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20  , int size, int 
3820: 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64  rwflag, void *ud
3830: 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ata) {.    State
3840: 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74   *statePtr.= (St
3850: 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20  ate *) udata;.  
3860: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3870: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
3880: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
3890: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
38a0: 20 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20    int code;..   
38b0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
38c0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e  ");..    /* If n
38d0: 6f 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20  o callback, use 
38e0: 64 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b  default callback
38f0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
3900: 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d  ePtr->password =
3910: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54  = NULL) {..if (T
3920: 63 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70  cl_EvalEx(interp
3930: 2c 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64  , "tls::password
3940: 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
3950: 47 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f  GLOBAL) == TCL_O
3960: 4b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a  K) {..    char *
3970: 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54  ret = (char *) T
3980: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
3990: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20  lt(interp);..   
39a0: 20 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65   strncpy(buf, re
39b0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65  t, (size_t) size
39c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28  );..    return (
39d0: 69 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b  int)strlen(ret);
39e0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
39f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20  return -1;..}.  
3a00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
3a10: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
3a20: 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72  al */.    cmdPtr
3a30: 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
3a40: 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61  Obj(statePtr->pa
3a50: 73 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c  ssword);.    Tcl
3a60: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3a70: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3a80: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
3a90: 69 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64  ingObj("password
3aa0: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
3ab0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3ac0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3ad0: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3ae0: 4f 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20  Obj(rwflag));.  
3af0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3b00: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3b10: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
3b20: 65 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b  ewIntObj(size));
3b30: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
3b40: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
3b50: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
3b60: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
3b70: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
3b80: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
3b90: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
3ba0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  */.    Tcl_IncrR
3bb0: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3bc0: 0a 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f  .    code = Tcl_
3bd0: 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
3be0: 2c 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56  , cmdPtr, TCL_EV
3bf0: 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20  AL_GLOBAL);.    
3c00: 69 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f  if (code != TCL_
3c10: 4f 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d  OK) {.#if (TCL_M
3c20: 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20  AJOR_VERSION == 
3c30: 38 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52  8) && (TCL_MINOR
3c40: 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54  _VERSION < 6)..T
3c50: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
3c60: 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73  or(interp);.#els
3c70: 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e  e..Tcl_Backgroun
3c80: 64 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72  dException(inter
3c90: 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66  p, code);.#endif
3ca0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
3cb0: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
3cc0: 74 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65  tr);..    Tcl_Re
3cd0: 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74  lease((ClientDat
3ce0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3cf0: 20 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73     /* If success
3d00: 66 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70  ful, pass back p
3d10: 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61  assword string a
3d20: 6e 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74  nd truncate if t
3d30: 6f 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69  oo long */.    i
3d40: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f  f (code == TCL_O
3d50: 4b 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c  K) {..Tcl_Size l
3d60: 65 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d  en;..char *ret =
3d70: 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65   (char *) Tcl_Ge
3d80: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54  tStringFromObj(T
3d90: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
3da0: 69 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a  interp), &len);.
3db0: 09 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f  .if (len > (Tcl_
3dc0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a  Size) size-1) {.
3dd0: 09 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f  .    len = (Tcl_
3de0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d  Size) size-1;..}
3df0: 0a 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72  ..strncpy(buf, r
3e00: 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  et, (size_t) len
3e10: 29 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27  );..buf[len] = '
3e20: 5c 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73  \0';..Tcl_Releas
3e30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e40: 6e 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28  nterp);..return(
3e50: 28 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20  (int) len);.    
3e60: 7d 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  }.    Tcl_Releas
3e70: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3e80: 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75  nterp);.    retu
3e90: 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  rn -1;.}.../*. *
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3ee0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f  ---. *. * Sessio
3ef0: 6e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43  n Callback for C
3f00: 6c 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09  lients --. *. *.
3f10: 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65  Called when a ne
3f20: 77 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64  w session is add
3f30: 65 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e  ed to the cache.
3f40: 20 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74   In TLS 1.3. *.t
3f50: 68 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69  his may be recei
3f60: 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  ved multiple tim
3f70: 65 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e  es after the han
3f80: 64 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65  dshake. For. *.e
3f90: 61 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c  arlier versions,
3fa0: 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65   this will be re
3fb0: 63 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68  ceived during th
3fc0: 65 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  e handshake.. *.
3fd0: 54 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66  This is the pref
3fe0: 65 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74  erred way to obt
3ff0: 61 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20  ain a resumable 
4000: 73 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  session.. *. * R
4010: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
4020: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
4030: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
4040: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
4050: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20  d). *. * Return 
4060: 63 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72  codes:. *.0 = er
4070: 72 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f  ror where sessio
4080: 6e 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69  n will be immedi
4090: 61 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72  ately removed fr
40a0: 6f 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  om the internal 
40b0: 63 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75  cache.. *.1 = su
40c0: 63 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20  ccess where app 
40d0: 72 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20  retains session 
40e0: 69 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65  in session cache
40f0: 2c 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20  , and must call 
4100: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65  SSL_SESSION_free
4110: 28 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a  () when done.. *
4120: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
4130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4160: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
4170: 63 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c  c int.SessionCal
4180: 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20  lback(const SSL 
4190: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
41a0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
41b0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
41c0: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
41d0: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
41e0: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
41f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4200: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4210: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4220: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4230: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4240: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4250: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
4260: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
4270: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
4280: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
4290: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
42a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
42b0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
42c0: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
42d0: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
42e0: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
42f0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4300: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4310: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4320: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4330: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4340: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4350: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a  mand to eval */.
4360: 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c      cmdPtr = Tcl
4370: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74  _DuplicateObj(st
4380: 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
4390: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
43a0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
43b0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
43c0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
43d0: 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29  ("session", -1))
43e0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
43f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
4400: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
4410: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
4420: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
4430: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
4440: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a  ->self), -1));..
4450: 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
4460: 64 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e  d */.    session
4470: 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
4480: 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
4490: 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63  , &ulen);.    Tc
44a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
44b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
44c0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
44d0: 74 65 41 72 72 61 79 4f 62 6a 28 73 65 73 73 69  teArrayObj(sessi
44e0: 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
44f0: 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f  ) ulen));..    /
4500: 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
4510: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53 45 53 53   */.    SSL_SESS
4520: 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28  ION_get0_ticket(
4530: 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
4540: 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63  , &len2);.    Tc
4550: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4560: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4570: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79  mdPtr, Tcl_NewBy
4580: 74 65 41 72 72 61 79 4f 62 6a 28 74 69 63 6b 65  teArrayObj(ticke
4590: 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
45a0: 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69  n2));..    /* Li
45b0: 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20  fetime - number 
45c0: 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20  of seconds */.  
45d0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
45e0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
45f0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f  p, cmdPtr,..Tcl_
4600: 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67  NewLongObj((long
4610: 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ) SSL_SESSION_ge
4620: 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d  t_ticket_lifetim
4630: 65 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29  e_hint(session))
4640: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20  );..    /* Eval 
4650: 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64  callback command
4660: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72   */.    Tcl_Incr
4670: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
4680: 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c 62 61  ;.    EvalCallba
4690: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
46a0: 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20  Ptr, cmdPtr);.  
46b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
46c0: 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20  nt(cmdPtr);.    
46d0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a  return 0;.}.../*
46e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4720: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50  ------. *. * ALP
4730: 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  N Callback for S
4740: 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e 20 43  ervers and NPN C
4750: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65  allback for Clie
4760: 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72  nts --. *. *.Per
4770: 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20 28 68  form protocol (h
4780: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c  ttp/1.1, h2, h3,
4790: 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69 6f 6e   etc.) selection
47a0: 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e 63 6f   for the. *.inco
47b0: 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ming connection.
47c0: 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 48 65   Called after He
47d0: 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72 20 63  llo and server c
47e0: 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57 68 65  allbacks.. *.Whe
47f0: 72 65 20 27 6f 75 74 27 20 69 73 20 73 65 6c 65  re 'out' is sele
4800: 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 6e  cted protocol an
4810: 64 20 27 69 6e 27 20 69 73 20 74 68 65 20 70 65  d 'in' is the pe
4820: 65 72 20 61 64 76 65 72 74 69 73 65 64 20 6c 69  er advertised li
4830: 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  st.. *. * Result
4840: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a  s:. *.None. *. *
4850: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
4860: 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b  *.Calls callback
4870: 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a   (if defined). *
4880: 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73  . * Return codes
4890: 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  :. *.SSL_TLSEXT_
48a0: 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f  ERR_OK: ALPN pro
48b0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20  tocol selected. 
48c0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
48d0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c  ontinues.. *.SSL
48e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52  _TLSEXT_ERR_ALER
48f0: 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65 20 77  T_FATAL: There w
4900: 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20 62 65  as no overlap be
4910: 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65 6e 74  tween the client
4920: 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70 6c 69  's. *.    suppli
4930: 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ed list and the 
4940: 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75 72 61  server configura
4950: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63  tion. The connec
4960: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61 62 6f  tion will be abo
4970: 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  rted.. *.SSL_TLS
4980: 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20 41  EXT_ERR_NOACK: A
4990: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  LPN protocol not
49a0: 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67 2e 2c   selected, e.g.,
49b0: 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c 50 4e   because no ALPN
49c0: 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63 6f 6c  . *.    protocol
49d0: 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64  s are configured
49e0: 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e 65 63   for this connec
49f0: 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e 65 63  tion. The connec
4a00: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
4a10: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
4a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4a50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
4a60: 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c  tic int.ALPNCall
4a70: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
4a80: 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67  ssl, const unsig
4a90: 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20  ned char **out, 
4aa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
4ab0: 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e  utlen,..const un
4ac0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 69 6e 2c  signed char *in,
4ad0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 6e   unsigned int in
4ae0: 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  len, void *arg) 
4af0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
4b00: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
4b10: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
4b20: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
4b30: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
4b40: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
4b50: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
4b60: 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20 64 70 72  e, res;..    dpr
4b70: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
4b80: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
4b90: 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 4e  NULL || arg == N
4ba0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4bb0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
4bc0: 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ACK;.    }..    
4bd0: 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f 74 6f 63  /* Select protoc
4be0: 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 53 53  ol */.    if (SS
4bf0: 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74 5f 70 72  L_select_next_pr
4c00: 6f 74 6f 28 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c  oto(out, outlen,
4c10: 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f   statePtr->proto
4c20: 73 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  s, statePtr->pro
4c30: 74 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e  tos_len,..in, in
4c40: 6c 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f  len) == OPENSSL_
4c50: 4e 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20  NPN_NEGOTIATED) 
4c60: 7b 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e  {../* Match foun
4c70: 64 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f  d */..res = SSL_
4c80: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20  TLSEXT_ERR_OK;. 
4c90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
4ca0: 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f  OPENSSL_NPN_NO_O
4cb0: 56 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72  VERLAP = No over
4cc0: 6c 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73  lap, so use firs
4cd0: 74 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65  t item from clie
4ce0: 6e 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74  nt protocol list
4cf0: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4d00: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4d10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
4d20: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
4d30: 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c  = (Tcl_Obj*)NULL
4d40: 29 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b  ) {..return res;
4d50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4d60: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4d70: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4d80: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4d90: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4da0: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
4db0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
4dc0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
4dd0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
4de0: 6e 67 4f 62 6a 28 22 61 6c 70 6e 22 2c 20 2d 31  ngObj("alpn", -1
4df0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
4e00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
4e10: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
4e20: 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
4e30: 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68  ingObj(Tcl_GetCh
4e40: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
4e50: 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b  tr->self), -1));
4e60: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4e70: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4e80: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
4e90: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 2a  l_NewStringObj(*
4ea0: 6f 75 74 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  out, -1));.    T
4eb0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4ec0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4ed0: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 42  cmdPtr, Tcl_NewB
4ee0: 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65 73 20 3d 3d  ooleanObj(res ==
4ef0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4f00: 4f 4b 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  OK));..    /* Ev
4f10: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
4f20: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
4f30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4f40: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
4f50: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
4f60: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
4f70: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
4f80: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
4f90: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4fa0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
4fb0: 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65  code == 1) {..re
4fc0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4fd0: 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73  RR_OK;.    } els
4fe0: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  e {..res = SSL_T
4ff0: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5000: 46 41 54 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 20  FATAL;.    }.   
5010: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
5020: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
5030: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
5040: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41 64  -------. *. * Ad
5090: 76 65 72 74 69 73 65 20 50 72 6f 74 6f 63 6f 6c  vertise Protocol
50a0: 73 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 4e  s Callback for N
50b0: 65 78 74 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67  ext Protocol Neg
50c0: 6f 74 69 61 74 69 6f 6e 20 28 4e 50 4e 29 20 69  otiation (NPN) i
50d0: 6e 20 53 65 72 76 65 72 48 65 6c 6c 6f 20 2d 2d  n ServerHello --
50e0: 0a 20 2a 0a 20 2a 09 63 61 6c 6c 65 64 20 77 68  . *. *.called wh
50f0: 65 6e 20 61 20 54 4c 53 20 73 65 72 76 65 72 20  en a TLS server 
5100: 6e 65 65 64 73 20 61 20 6c 69 73 74 20 6f 66 20  needs a list of 
5110: 73 75 70 70 6f 72 74 65 64 20 70 72 6f 74 6f 63  supported protoc
5120: 6f 6c 73 20 66 6f 72 20 4e 65 78 74 0a 20 2a 09  ols for Next. *.
5130: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
5140: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  tion.. *. * Resu
5150: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
5160: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
5170: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
5180: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  des:. *.SSL_TLSE
5190: 58 54 5f 45 52 52 5f 4f 4b 3a 20 4e 50 4e 20 70  XT_ERR_OK: NPN p
51a0: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
51b0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
51c0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
51d0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
51e0: 41 43 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63 6f  ACK: NPN protoco
51f0: 6c 20 6e 6f 74 20 73 65 6c 65 63 74 65 64 2e 20  l not selected. 
5200: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5210: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5260: 2d 2d 0a 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  --. */.#ifdef US
5270: 45 5f 4e 50 4e 0a 73 74 61 74 69 63 20 69 6e 74  E_NPN.static int
5280: 0a 4e 50 4e 43 61 6c 6c 62 61 63 6b 28 63 6f 6e  .NPNCallback(con
5290: 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e  st SSL *ssl, con
52a0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
52b0: 20 2a 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64   **out, unsigned
52c0: 20 69 6e 74 20 2a 6f 75 74 6c 65 6e 2c 20 76 6f   int *outlen, vo
52d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
52e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
52f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 0a 20   (State*)arg;.. 
5300: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
5310: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
5320: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
5330: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
5340: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
5350: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
5360: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 72 6f  ..    /* Set pro
5370: 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f 0a 20  tocols list */. 
5380: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
5390: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
53a0: 20 7b 0a 09 2a 6f 75 74 20 3d 20 73 74 61 74 65   {..*out = state
53b0: 50 74 72 2d 3e 70 72 6f 74 6f 73 3b 0a 09 2a 6f  Ptr->protos;..*o
53c0: 75 74 6c 65 6e 20 3d 20 73 74 61 74 65 50 74 72  utlen = statePtr
53d0: 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 3b 0a 20 20  ->protos_len;.  
53e0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f 75 74    } else {..*out
53f0: 20 3d 20 4e 55 4c 4c 3b 0a 09 2a 6f 75 74 6c 65   = NULL;..*outle
5400: 6e 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e 20 53  n = 0;..return S
5410: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f  SL_TLSEXT_ERR_NO
5420: 41 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ACK;.    }.    r
5430: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5440: 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  _ERR_OK;.}.#endi
5450: 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  f.../*. *-------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
54a0: 20 2a 20 53 4e 49 20 43 61 6c 6c 62 61 63 6b 20   * SNI Callback 
54b0: 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a 20  for Servers --. 
54c0: 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 73 65 72  *. *.Perform ser
54d0: 76 65 72 2d 73 69 64 65 20 53 4e 49 20 68 6f 73  ver-side SNI hos
54e0: 74 6e 61 6d 65 20 73 65 6c 65 63 74 69 6f 6e 20  tname selection 
54f0: 61 66 74 65 72 20 72 65 63 65 69 76 69 6e 67 20  after receiving 
5500: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a  SNI extension. *
5510: 09 69 6e 20 43 6c 69 65 6e 74 20 48 65 6c 6c 6f  .in Client Hello
5520: 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20 68  . Called after h
5530: 65 6c 6c 6f 20 63 61 6c 6c 62 61 63 6b 20 62 75  ello callback bu
5540: 74 20 62 65 66 6f 72 65 20 41 4c 50 4e 20 63 61  t before ALPN ca
5550: 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65  llback.. *. * Re
5560: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
5570: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
5580: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
5590: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
55a0: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
55b0: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53  odes:. *.SSL_TLS
55c0: 45 58 54 5f 45 52 52 5f 4f 4b 3a 20 53 4e 49 20  EXT_ERR_OK: SNI 
55d0: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 63 63 65  hostname is acce
55e0: 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63  pted. The connec
55f0: 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  tion continues..
5600: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
5610: 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c 3a 20 53  R_ALERT_FATAL: S
5620: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
5630: 6f 74 20 61 63 63 65 70 74 65 64 2e 20 54 68 65  ot accepted. The
5640: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20 2a 09 20   connection. *. 
5650: 20 20 20 69 73 20 61 62 6f 72 74 65 64 2e 20 44     is aborted. D
5660: 65 66 61 75 6c 74 20 66 6f 72 20 61 6c 65 72 74  efault for alert
5670: 20 69 73 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43   is SSL_AD_UNREC
5680: 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 2e 0a 20 2a  OGNIZED_NAME.. *
5690: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
56a0: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3a 20 53  ALERT_WARNING: S
56b0: 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 6e  NI hostname is n
56c0: 6f 74 20 61 63 63 65 70 74 65 64 2c 20 77 61 72  ot accepted, war
56d0: 6e 69 6e 67 20 61 6c 65 72 74 0a 20 2a 09 20 20  ning alert. *.  
56e0: 20 20 73 65 6e 74 20 28 6e 6f 74 20 73 75 70 70    sent (not supp
56f0: 6f 72 74 65 64 20 69 6e 20 54 4c 53 76 31 2e 33  orted in TLSv1.3
5700: 29 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  ). The connectio
5710: 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09  n continues.. *.
5720: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5730: 4f 41 43 4b 3a 20 53 4e 49 20 68 6f 73 74 6e 61  OACK: SNI hostna
5740: 6d 65 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74  me is not accept
5750: 65 64 20 61 6e 64 20 6e 6f 74 20 61 63 6b 6e 6f  ed and not ackno
5760: 77 6c 65 64 67 65 64 2c 0a 20 2a 09 20 20 20 20  wledged,. *.    
5770: 65 2e 67 2e 20 69 66 20 53 4e 49 20 68 61 73 20  e.g. if SNI has 
5780: 6e 6f 74 20 62 65 65 6e 20 63 6f 6e 66 69 67 75  not been configu
5790: 72 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  red. The connect
57a0: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
57b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
57c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
5800: 69 63 20 69 6e 74 0a 53 4e 49 43 61 6c 6c 62 61  ic int.SNICallba
5810: 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73  ck(const SSL *ss
5820: 6c 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76  l, int *alert, v
5830: 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20  oid *arg) {.    
5840: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20  State *statePtr 
5850: 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20  = (State*)arg;. 
5860: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
5870: 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72  nterp.= statePtr
5880: 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63  ->interp;.    Tc
5890: 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20  l_Obj *cmdPtr;. 
58a0: 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73     int code, res
58b0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76  ;.    char *serv
58c0: 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a  ername = NULL;..
58d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
58e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
58f0: 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61  ssl == NULL || a
5900: 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  rg == NULL) {..r
5910: 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54  eturn SSL_TLSEXT
5920: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
5930: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 77  }..    /* Only w
5940: 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e 32  orks for TLS 1.2
5950: 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f 0a   and earlier */.
5960: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
5970: 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72 6e   SSL_get_servern
5980: 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f  ame(ssl, TLSEXT_
5990: 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61  NAMETYPE_host_na
59a0: 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73 65  me);.    if (!se
59b0: 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72 76  rvername || serv
59c0: 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c 30  ername[0] == '\0
59d0: 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ') {..return SSL
59e0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43  _TLSEXT_ERR_NOAC
59f0: 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  K;.    }..    if
5a00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
5a10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
5a20: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  LL) {..return SS
5a30: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b  L_TLSEXT_ERR_OK;
5a40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
5a50: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
5a60: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
5a70: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
5a80: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
5a90: 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f  >vcmd);.    Tcl_
5aa0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5ab0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5ac0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
5ad0: 6e 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29  ngObj("sni", -1)
5ae0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5af0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5b00: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a  interp, cmdPtr,.
5b10: 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69  .    Tcl_NewStri
5b20: 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61  ngObj(Tcl_GetCha
5b30: 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74  nnelName(statePt
5b40: 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a  r->self), -1));.
5b50: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5b60: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5b70: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
5b80: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65  _NewStringObj(se
5b90: 72 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b  rvername , -1));
5ba0: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5bb0: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5bc0: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5bd0: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5be0: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5bf0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5c00: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5c10: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
5c20: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5c30: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
5c40: 4e 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  NG;..*alert = SS
5c50: 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45  L_AD_UNRECOGNIZE
5c60: 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73  D_NAME; /* Not s
5c70: 75 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20  upported by TLS 
5c80: 31 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73  1.3 */.    } els
5c90: 65 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29  e if (code == 1)
5ca0: 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c   {..res = SSL_TL
5cb0: 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20  SEXT_ERR_OK;.   
5cc0: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
5cd0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5ce0: 41 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61  ALERT_FATAL;..*a
5cf0: 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e  lert = SSL_AD_UN
5d00: 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b  RECOGNIZED_NAME;
5d10: 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65   /* Not supporte
5d20: 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a  d by TLS 1.3 */.
5d30: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
5d40: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
5d50: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
5d60: 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  es;.}.../*. *---
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5db0: 0a 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c  . *. * ClientHel
5dc0: 6c 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c  lo Handshake Cal
5dd0: 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72  lback for Server
5de0: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20  s --. *. *.Used 
5df0: 62 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61  by server to exa
5e00: 6d 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20  mine the server 
5e10: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
5e20: 28 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a  (SNI) extension.
5e30: 20 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74   *.provided by t
5e40: 68 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64  he client in ord
5e50: 65 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20  er to select an 
5e60: 61 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74  appropriate cert
5e70: 69 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72  ificate to. *.pr
5e80: 65 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20  esent, and make 
5e90: 6f 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74  other configurat
5ea0: 69 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20  ion adjustments 
5eb0: 72 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74  relevant to that
5ec0: 20 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20   server. *.name 
5ed0: 61 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72  and its configur
5ee0: 61 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c  ation. This incl
5ef0: 75 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75  udes swapping ou
5f00: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
5f10: 0a 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e  . *.SSL_CTX poin
5f20: 74 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74  ter, modifying t
5f30: 68 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74  he server's list
5f40: 20 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c   of permitted TL
5f50: 53 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63  S versions,. *.c
5f60: 68 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76  hanging the serv
5f70: 65 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74  er's cipher list
5f80: 20 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20   in response to 
5f90: 74 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70  the client's cip
5fa0: 68 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20  her list, etc.. 
5fb0: 2a 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  *.Called before 
5fc0: 53 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c  SNI and ALPN cal
5fd0: 6c 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65  lbacks.. *. * Re
5fe0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
5ff0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
6000: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
6010: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
6020: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
6030: 6f 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49  odes:. *.SSL_CLI
6040: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a  ENT_HELLO_RETRY:
6050: 20 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e   suspend the han
6060: 64 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20  dshake, and the 
6070: 68 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69  handshake functi
6080: 6f 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69  on will return i
6090: 6d 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53  mmediately. *.SS
60a0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
60b0: 52 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74  RROR: failure, t
60c0: 65 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74  erminate connect
60d0: 69 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74  ion. Set alert t
60e0: 6f 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a  o error code.. *
60f0: 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c  .SSL_CLIENT_HELL
6100: 4f 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65  O_SUCCESS: succe
6110: 73 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ss. *. *--------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
6160: 73 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f  static int.Hello
6170: 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53  Callback(const S
6180: 53 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c  SL *ssl, int *al
6190: 65 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20  ert, void *arg) 
61a0: 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  {.    State *sta
61b0: 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29  tePtr = (State*)
61c0: 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74  arg;.    Tcl_Int
61d0: 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74  erp *interp.= st
61e0: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a  atePtr->interp;.
61f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64      Tcl_Obj *cmd
6200: 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64  Ptr;.    int cod
6210: 65 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73  e, res;.    cons
6220: 74 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61  t char *serverna
6230: 6d 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  me;.    const un
6240: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a  signed char *p;.
6250: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20      size_t len, 
6260: 72 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20  remaining;..    
6270: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
6280: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74  );..    if (stat
6290: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54  ePtr->vcmd == (T
62a0: 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a  cl_Obj*)NULL) {.
62b0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
62c0: 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53  NT_HELLO_SUCCESS
62d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
62e0: 28 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53  (ssl == (const S
62f0: 53 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67  SL *)NULL || arg
6300: 20 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c   == (void *)NULL
6310: 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ) {..return SSL_
6320: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6330: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6340: 2a 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20  * Get names */. 
6350: 20 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65     if (!SSL_clie
6360: 6e 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78  nt_hello_get0_ex
6370: 74 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59  t(ssl, TLSEXT_TY
6380: 50 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20  PE_server_name, 
6390: 26 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20  &p, &remaining) 
63a0: 7c 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20  || remaining <= 
63b0: 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53  2) {..*alert = S
63c0: 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54  SL_R_SSLV3_ALERT
63d0: 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54  _ILLEGAL_PARAMET
63e0: 45 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f  ER;..return SSL_
63f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52  CLIENT_HELLO_ERR
6400: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
6410: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65  * Extract the le
6420: 6e 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70  ngth of the supp
6430: 6c 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d  lied list of nam
6440: 65 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d  es. */.    len =
6450: 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a   (*(p++) << 8);.
6460: 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b      len += *(p++
6470: 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b  );.    if (len +
6480: 20 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29   2 != remaining)
6490: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
64a0: 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49  _R_SSLV3_ALERT_I
64b0: 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52  LLEGAL_PARAMETER
64c0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
64d0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
64e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61  ;.    }.    rema
64f0: 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20  ining = len;..  
6500: 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e    /* The list in
6510: 20 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68   practice only h
6520: 61 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d  as a single elem
6530: 65 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20  ent, so we only 
6540: 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72  consider the fir
6550: 73 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69  st one. */.    i
6560: 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20  f (remaining == 
6570: 30 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53  0 || *p++ != TLS
6580: 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
6590: 74 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72  t_name) {..*aler
65a0: 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f  t = SSL_R_TLSV1_
65b0: 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45  ALERT_INTERNAL_E
65c0: 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53  RROR;..return SS
65d0: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
65e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
65f0: 72 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20  remaining--;..  
6600: 20 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20    /* Now we can 
6610: 66 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74  finally pull out
6620: 20 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20   the byte array 
6630: 77 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20  with the actual 
6640: 68 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  hostname. */.   
6650: 20 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c   if (remaining <
6660: 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d  = 2) {..*alert =
6670: 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45   SSL_R_TLSV1_ALE
6680: 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f  RT_INTERNAL_ERRO
6690: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
66a0: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
66b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e  R;.    }.    len
66c0: 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29   = (*(p++) << 8)
66d0: 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70  ;.    len += *(p
66e0: 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e  ++);.    if (len
66f0: 20 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67   + 2 > remaining
6700: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6710: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6720: 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a  INTERNAL_ERROR;.
6730: 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45  .return SSL_CLIE
6740: 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a  NT_HELLO_ERROR;.
6750: 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e      }.    remain
6760: 69 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73  ing = len;.    s
6770: 65 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e  ervername = (con
6780: 73 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20  st char *)p;..  
6790: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
67a0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
67b0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
67c0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
67d0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
67e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
67f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6800: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
6810: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c  ewStringObj("hel
6820: 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lo", -1));.    T
6830: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6840: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6850: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
6860: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
6870: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
6880: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
6890: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
68a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
68b0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
68c0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
68d0: 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e 61 6d 65  ngObj(servername
68e0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
68f0: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ));..    /* Eval
6900: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
6910: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
6920: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6930: 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f 64 65  );.    if ((code
6940: 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28   = EvalCallback(
6950: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
6960: 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31 29 20  , cmdPtr)) > 1) 
6970: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49  {..res = SSL_CLI
6980: 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b  ENT_HELLO_RETRY;
6990: 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52  ..*alert = SSL_R
69a0: 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 55 53 45  _TLSV1_ALERT_USE
69b0: 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20  R_CANCELLED;.   
69c0: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65   } else if (code
69d0: 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20   == 1) {..res = 
69e0: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
69f0: 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d 20  _SUCCESS;.    } 
6a00: 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
6a10: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45  L_CLIENT_HELLO_E
6a20: 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  RROR;..*alert = 
6a30: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6a40: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
6a50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
6a60: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
6a70: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
6a80: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a   res;.}.../*****
6a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
6aa0: 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20  ./* Commands    
6ab0: 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a       */./*******
6ac0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
6ad0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6b10: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
6b20: 69 70 68 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20  iphersObjCmd -- 
6b30: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6b40: 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69  iphers. *. *.Thi
6b50: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
6b60: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
6b70: 73 20 74 68 65 20 22 74 6c 73 3a 3a 63 69 70 68  s the "tls::ciph
6b80: 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09  ers" command. *.
6b90: 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  to list availabl
6ba0: 65 20 63 69 70 68 65 72 73 2c 20 62 61 73 65 64  e ciphers, based
6bb0: 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73   upon protocol s
6bc0: 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52  elected.. *. * R
6bd0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
6be0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
6bf0: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64   list.. *. * Sid
6c00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f  e effects:. *.co
6c10: 6e 73 74 72 75 63 74 73 20 61 6e 64 20 64 65 73  nstructs and des
6c20: 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e 74 65 78  troys SSL contex
6c30: 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d  t (CTX). *. *---
6c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  . */.static cons
6c90: 74 20 63 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c  t char *protocol
6ca0: 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c  s[] = {.."ssl2",
6cb0: 20 22 73 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c   "ssl3", "tls1",
6cc0: 20 22 74 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31   "tls1.1", "tls1
6cd0: 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e  .2", "tls1.3", N
6ce0: 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74  ULL.};.enum prot
6cf0: 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53  ocol {.    TLS_S
6d00: 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54  SL2, TLS_SSL3, T
6d10: 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53  LS_TLS1, TLS_TLS
6d20: 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c  1_1, TLS_TLS1_2,
6d30: 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53   TLS_TLS1_3, TLS
6d40: 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63  _NONE.};..static
6d50: 20 69 6e 74 0a 43 69 70 68 65 72 73 4f 62 6a 43   int.CiphersObjC
6d60: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
6d70: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
6d80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
6d90: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
6da0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
6db0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
6dc0: 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  jPtr = NULL;.   
6dd0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
6de0: 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73  NULL;.    SSL *s
6df0: 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  sl = NULL;.    S
6e00: 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48  TACK_OF(SSL_CIPH
6e10: 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61  ER) *sk;.    cha
6e20: 72 20 2a 63 70 2c 20 62 75 66 5b 42 55 46 53 49  r *cp, buf[BUFSI
6e30: 5a 5d 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65  Z];.    int inde
6e40: 78 2c 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20  x, verbose = 0, 
6e50: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20  use_supported = 
6e60: 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  0;.    const SSL
6e70: 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b  _METHOD *method;
6e80: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
6e90: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
6ea0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
6eb0: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c  .    if ((objc <
6ec0: 20 32 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34   2) || (objc > 4
6ed0: 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  )) {..Tcl_WrongN
6ee0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
6ef0: 2c 20 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f  , objv, "protoco
6f00: 6c 20 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70  l ?verbose? ?sup
6f10: 70 6f 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75  ported?");..retu
6f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f30: 20 20 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f    }.    if (Tcl_
6f40: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
6f50: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
6f60: 20 70 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f   protocols, "pro
6f70: 74 6f 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65  tocol", 0, &inde
6f80: 78 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  x) != TCL_OK) {.
6f90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6fa0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
6fb0: 28 28 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54  ((objc > 2) && T
6fc0: 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
6fd0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
6fe0: 76 5b 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20  v[2], &verbose) 
6ff0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65  != TCL_OK) {..re
7000: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7010: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f      }.    if ((o
7020: 62 6a 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f  bjc > 3) && Tcl_
7030: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
7040: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
7050: 5d 2c 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65  ], &use_supporte
7060: 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  d) != TCL_OK) {.
7070: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7080: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
7090: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
70a0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65  ..    switch ((e
70b0: 6e 75 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64  num protocol)ind
70c0: 65 78 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f  ex) {..case TLS_
70d0: 53 53 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53  SSL2:.#if OPENSS
70e0: 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
70f0: 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20   >= 0x10100000L 
7100: 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  || defined(NO_SS
7110: 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L2) || defined(O
7120: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a  PENSSL_NO_SSL2).
7130: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7140: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7150: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7160: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7170: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7180: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7190: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
71a0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53  .    method = SS
71b0: 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv2_method(); br
71c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
71d0: 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66 20  e TLS_SSL3:.#if 
71e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
71f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7200: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20  SSL_NO_SSL3) || 
7210: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7220: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
7230: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7240: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7250: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7260: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7270: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7280: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7290: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
72a0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53  .    method = SS
72b0: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv3_method(); br
72c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
72d0: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
72e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
72f0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7300: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7310: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7320: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
7330: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7340: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
7350: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
7360: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
7370: 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c  supported", NULL
7380: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7390: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
73a0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
73b0: 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Sv1_method(); br
73c0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
73d0: 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a 0a 23 69  e TLS_TLS1_1:.#i
73e0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
73f0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
7400: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
7410: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
7420: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f  ENSSL_NO_TLS1_1_
7430: 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c  METHOD)..    Tcl
7440: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
7450: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
7460: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
7470: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
7480: 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  d", NULL);..    
7490: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
74a0: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
74b0: 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65  hod = TLSv1_1_me
74c0: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
74d0: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
74e0: 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69  TLS1_2:.#if defi
74f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
7500: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7510: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  L_NO_TLS1_2) || 
7520: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7530: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
7540: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
7550: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7560: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
7570: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
7580: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 4e 55  t supported", NU
7590: 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  LL);..    return
75a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
75b0: 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  e..    method = 
75c0: 54 4c 53 76 31 5f 32 5f 6d 65 74 68 6f 64 28 29  TLSv1_2_method()
75d0: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
75e0: 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 33  .case TLS_TLS1_3
75f0: 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  :.#if defined(NO
7600: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
7610: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
7620: 4c 53 31 5f 33 29 0a 09 20 20 20 20 54 63 6c 5f  LS1_3)..    Tcl_
7630: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7640: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7650: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7660: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7670: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7680: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7690: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
76a0: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28  od = TLS_method(
76b0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
76c0: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
76d0: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
76e0: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20  3_VERSION);..   
76f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78   SSL_CTX_set_max
7700: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
7710: 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49  tx, TLS1_3_VERSI
7720: 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b  ON);..    break;
7730: 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74  .#endif..default
7740: 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20  :..    method = 
7750: 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20  TLS_method();.. 
7760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7770: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
7780: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a  TX_new(method);.
7790: 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e      if (ctx == N
77a0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  ULL) {..Tcl_Appe
77b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
77c0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
77d0: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  ), NULL);..retur
77e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
77f0: 20 7d 0a 0a 20 20 20 20 73 73 6c 20 3d 20 53 53   }..    ssl = SS
7800: 4c 5f 6e 65 77 28 63 74 78 29 3b 0a 20 20 20 20  L_new(ctx);.    
7810: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
7820: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
7830: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54  sult(interp, GET
7840: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 4e  _ERR_REASON(), N
7850: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
7860: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
7870: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7880: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
7890: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
78a0: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
78b0: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
78c0: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
78d0: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
78e0: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
78f0: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
7900: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
7910: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7920: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
7930: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
7940: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
7950: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
7960: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
7970: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
7980: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
7990: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 66  0, NULL);..    f
79a0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
79b0: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
79c0: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b  _num(sk); i++) {
79d0: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50  ...const SSL_CIP
79e0: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f  HER *c = sk_SSL_
79f0: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c  CIPHER_value(sk,
7a00: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20   i);...if (c == 
7a10: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NULL) continue;.
7a20: 0a 09 09 2f 2a 20 63 69 70 68 65 72 20 6e 61 6d  .../* cipher nam
7a30: 65 20 6f 72 20 28 4e 4f 4e 45 29 20 2a 2f 0a 09  e or (NONE) */..
7a40: 09 63 70 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  .cp = SSL_CIPHER
7a50: 5f 67 65 74 5f 6e 61 6d 65 28 63 29 3b 0a 09 09  _get_name(c);...
7a60: 69 66 20 28 63 70 20 3d 3d 20 4e 55 4c 4c 29 20  if (cp == NULL) 
7a70: 62 72 65 61 6b 3b 0a 09 09 54 63 6c 5f 4c 69 73  break;...Tcl_Lis
7a80: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
7a90: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
7aa0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
7ab0: 62 6a 28 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20  bj(cp, -1));..  
7ac0: 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
7ad0: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
7ae0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22  _NewStringObj(""
7af0: 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  ,0);..    for (i
7b00: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7b10: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7b20: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
7b30: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
7b40: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
7b50: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
7b60: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
7b70: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
7b80: 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69 70   textual descrip
7b90: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68  tion of the ciph
7ba0: 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f  er */...if (SSL_
7bb0: 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69  CIPHER_descripti
7bc0: 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f  on(c, buf, sizeo
7bd0: 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29  f(buf)) != NULL)
7be0: 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70   {...    Tcl_App
7bf0: 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c  endToObj(objPtr,
7c00: 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29   buf, (Tcl_Size)
7c10: 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09   strlen(buf));..
7c20: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
7c30: 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28  Tcl_AppendToObj(
7c40: 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e  objPtr, "UNKNOWN
7c50: 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20  \n", 8);...}..  
7c60: 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f    }..}..if (use_
7c70: 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20  supported) {..  
7c80: 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f    sk_SSL_CIPHER_
7c90: 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20  free(sk);..}.   
7ca0: 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28   }.    SSL_free(
7cb0: 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ssl);.    SSL_CT
7cc0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20  X_free(ctx);..  
7cd0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
7ce0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
7cf0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
7d00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
7d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7d50: 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63  ---. *. * Protoc
7d60: 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  olsObjCmd -- lis
7d70: 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74  t available prot
7d80: 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73  ocols. *. *.This
7d90: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e   procedure is in
7da0: 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73  voked to process
7db0: 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f   the "tls::proto
7dc0: 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a  cols" command. *
7dd0: 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62  .to list availab
7de0: 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a  le protocols.. *
7df0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
7e00: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
7e10: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
7e20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
7e30: 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d   *.none. *. *---
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e80: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
7e90: 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28  ProtocolsObjCmd(
7ea0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
7eb0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
7ec0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
7ed0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7ee0: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7f00: 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  r;.    (void) cl
7f10: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
7f20: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
7f30: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
7f40: 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 1) {..Tcl_Wro
7f50: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
7f60: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 1, objv, "");.
7f70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7f80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
7f90: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
7fa0: 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
7fb0: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
7fc0: 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45   NULL);..#if OPE
7fd0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
7fe0: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
7ff0: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f  L && !defined(NO
8000: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
8010: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
8020: 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  L2).    Tcl_List
8030: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
8040: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
8050: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
8060: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
8070: 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  SSL2], -1));.#en
8080: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8090: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
80a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
80b0: 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e  _SSL3) && !defin
80c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
80d0: 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54  L3_METHOD).    T
80e0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
80f0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8100: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
8110: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
8120: 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31  ls[TLS_SSL3], -1
8130: 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ));.#endif.#if !
8140: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
8150: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
8160: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26  NSSL_NO_TLS1) &&
8170: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8180: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
8190: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
81a0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
81b0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
81c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
81d0: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
81e0: 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  S1], -1));.#endi
81f0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8200: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
8210: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8220: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
8230: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8240: 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_1_METHOD). 
8250: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
8260: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8270: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8280: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8290: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
82a0: 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  1], -1));.#endif
82b0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
82c0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
82d0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
82e0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
82f0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
8300: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_2_METHOD).  
8310: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
8320: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
8330: 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  p, objPtr, Tcl_N
8340: 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74  ewStringObj(prot
8350: 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32  ocols[TLS_TLS1_2
8360: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8370: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8380: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
8390: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
83a0: 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c  LS1_3).    Tcl_L
83b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
83c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
83d0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
83e0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
83f0: 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29  LS_TLS1_3], -1))
8400: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
8410: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
8420: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
8430: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
8440: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
8490: 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f   *. * HandshakeO
84a0: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54  bjCmd --. *. *.T
84b0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
84c0: 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77 68  sed to verify wh
84d0: 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73 68  ether the handsh
84e0: 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a  ake is complete.
84f0: 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a   *.or not.. *. *
8500: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
8510: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
8520: 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64  lt. 1 means hand
8530: 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20  shake complete, 
8540: 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e  0 means pending.
8550: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
8560: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63  cts:. *.May forc
8570: 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f  e SSL negotiatio
8580: 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e  n to take place.
8590: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
85a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
85e0: 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61  atic int Handsha
85f0: 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  keObjCmd(ClientD
8600: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
8610: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8620: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
8630: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
8640: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
8650: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20  hannel chan;    
8660: 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e      /* The chann
8670: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
8680: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
8690: 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20  e *statePtr;    
86a0: 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74      /* client st
86b0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
86c0: 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  et */.    const 
86d0: 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e  char *errStr = N
86e0: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  ULL;.    int ret
86f0: 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72   = 1;.    int er
8700: 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64  r = 0;.    (void
8710: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
8720: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
8730: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
8740: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
8750: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8760: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8770: 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
8780: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8790: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
87a0: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
87b0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
87c0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
87d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
87e0: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54  mObj(objv[1], (T
87f0: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29  cl_Size *) NULL)
8800: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
8810: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
8820: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
8830: 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
8840: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
8850: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
8860: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
8870: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
8880: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
8890: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
88a0: 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
88b0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
88c0: 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
88d0: 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
88e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
88f0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
8900: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
8910: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
8920: 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
8930: 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
8940: 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
8950: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
8960: 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48  , "TLS", "HANDSH
8970: 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  AKE", "CHANNEL",
8980: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
8990: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
89a0: 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
89b0: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
89c0: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
89d0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
89e0: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
89f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
8a00: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
8a10: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20  rConnect");.    
8a20: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f  ret = Tls_WaitFo
8a30: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
8a40: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20  r, &err, 1);.   
8a50: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
8a60: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
8a70: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29  urned: %i", ret)
8a80: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c  ;..    if (ret <
8a90: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72   0 && ((statePtr
8aa0: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
8ab0: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72  L_ASYNC) && (err
8ac0: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a   == EAGAIN))) {.
8ad0: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20  .dprintf("Async 
8ae0: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41  set and err = EA
8af0: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30  GAIN");..ret = 0
8b00: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
8b10: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e  (ret < 0) {..lon
8b20: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74  g result;..errSt
8b30: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72  r = statePtr->er
8b40: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73  r;..Tcl_ResetRes
8b50: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63  ult(interp);..Tc
8b60: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
8b70: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c  ...if (!errStr |
8b80: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  | (*errStr == 0)
8b90: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20  ) {..    errStr 
8ba0: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  = Tcl_PosixError
8bb0: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54  (interp);..}...T
8bc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8bd0: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61  interp, "handsha
8be0: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72  ke failed: ", er
8bf0: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e  rStr, (char *) N
8c00: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75  ULL);..if ((resu
8c10: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  lt = SSL_get_ver
8c20: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
8c30: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35  Ptr->ssl)) != X5
8c40: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20  09_V_OK) {..    
8c50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8c60: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74  (interp, " due t
8c70: 6f 3a 20 22 2c 20 58 35 30 39 5f 76 65 72 69 66  o: ", X509_verif
8c80: 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72  y_cert_error_str
8c90: 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 28 63 68  ing(result), (ch
8ca0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a  ar *) NULL);..}.
8cb0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
8cc0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
8cd0: 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22 46   "HANDSHAKE", "F
8ce0: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
8cf0: 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66   NULL);..dprintf
8d00: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
8d10: 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64 73  ERROR with hands
8d20: 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73 22  hake failed: %s"
8d30: 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74 75  , errStr);..retu
8d40: 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20  rn(TCL_ERROR);. 
8d50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
8d60: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
8d70: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
8d80: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
8d90: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
8da0: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
8db0: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
8dc0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
8dd0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
8de0: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
8df0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
8e00: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
8e10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
8e20: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
8e30: 3b 0a 20 20 20 20 72 65 74 75 72 6e 28 54 43 4c  ;.    return(TCL
8e40: 5f 4f 4b 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  _OK);.}../*. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8e90: 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62  -. *. * ImportOb
8ea0: 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  jCmd --. *. *.Th
8eb0: 69 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20  is procedure is 
8ec0: 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65  invoked to proce
8ed0: 73 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d  ss the "ssl" com
8ee0: 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73  mand. *. *.The s
8ef0: 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65  sl command pushe
8f00: 73 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65  s SSL over a (ne
8f10: 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74  wly connected) t
8f20: 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20  cp socket. *. * 
8f30: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
8f40: 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
8f50: 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  t.. *. * Side ef
8f60: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f  fects:. *.May mo
8f70: 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f  dify the behavio
8f80: 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e  r of an IO chann
8f90: 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  el.. *. *-------
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 2d 2d 2d 2d  ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
8fe0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f  .static int.Impo
8ff0: 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44  rtObjCmd(ClientD
9000: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
9010: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9020: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63  rp, int objc, Tc
9030: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
9040: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43  v[]) {.    Tcl_C
9050: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a  hannel chan;../*
9060: 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20   The channel to 
9070: 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a  set a mode on. *
9080: 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61  /.    State *sta
9090: 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e  tePtr;../* clien
90a0: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
90b0: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53  socket */.    SS
90c0: 4c 5f 43 54 58 20 2a 63 74 78 09 20 20 20 20 20  L_CTX *ctx.     
90d0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
90e0: 63 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 20  cl_Obj *script. 
90f0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9100: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73     Tcl_Obj *pass
9110: 77 6f 72 64 09 20 20 20 20 20 20 20 20 3d 20 4e  word.        = N
9120: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
9130: 20 2a 76 63 6d 64 09 20 20 20 20 20 20 20 20 3d   *vcmd.        =
9140: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44   NULL;.    Tcl_D
9150: 53 74 72 69 6e 67 20 75 70 70 65 72 43 68 61 6e  String upperChan
9160: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20  nelTranslation, 
9170: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
9180: 6b 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  king, upperChann
9190: 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65  elEncoding, uppe
91a0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b  rChannelEOFChar;
91b0: 0a 20 20 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  .    int idx;.  
91c0: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
91d0: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 09 09 20      int flags.. 
91e0: 20 20 20 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c         = TLS_TCL
91f0: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
9200: 65 72 76 65 72 09 09 20 20 20 20 20 20 20 20 3d  erver..        =
9210: 20 30 3b 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63   0;./* is connec
9220: 74 69 6f 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72  tion incoming or
9230: 20 6f 75 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20   outgoing? */.  
9240: 20 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 09    char *keyfile.
9250: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
9260: 20 20 20 20 63 68 61 72 20 2a 63 65 72 74 66 69      char *certfi
9270: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
9280: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  L;.    unsigned 
9290: 63 68 61 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55  char *key  .= NU
92a0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  LL;.    Tcl_Size
92b0: 20 6b 65 79 5f 6c 65 6e 20 20 20 20 20 20 20 20   key_len        
92c0: 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20           = 0;.  
92d0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
92e0: 2a 63 65 72 74 20 20 20 20 20 20 20 20 20 3d 20  *cert         = 
92f0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9300: 7a 65 20 63 65 72 74 5f 6c 65 6e 20 20 20 20 20  ze cert_len     
9310: 20 20 20 20 20 20 20 20 20 20 20 3d 20 30 3b 0a             = 0;.
9320: 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72      char *cipher
9330: 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  s.        = NULL
9340: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9350: 65 72 73 75 69 74 65 73 09 20 20 20 20 20 20 20  ersuites.       
9360: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61   = NULL;.    cha
9370: 72 20 2a 43 41 66 69 6c 65 09 20 20 20 20 20 20  r *CAfile.      
9380: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
9390: 61 72 20 2a 43 41 64 69 72 09 09 20 20 20 20 20  ar *CAdir..     
93a0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
93b0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 20 20  har *DHparams.  
93c0: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
93d0: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20    char *model.. 
93e0: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
93f0: 20 20 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e     char *servern
9400: 61 6d 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ame.        = NU
9410: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
9420: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
9430: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
9440: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
9450: 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
9460: 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  d = NULL;.    Tc
9470: 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e  l_Obj *alpn..= N
9480: 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c  ULL;.    int ssl
9490: 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b  2 = 0, ssl3 = 0;
94a0: 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20  .    int tls1 = 
94b0: 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74  1, tls1_1 = 1, t
94c0: 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_2 = 1, tls1_
94d0: 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70  3 = 1;.    int p
94e0: 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20  roto = 0, level 
94f0: 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65  = -1;.    int ve
9500: 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72  rify = 0, requir
9510: 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d  e = 0, request =
9520: 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   1, post_handsha
9530: 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69  ke = 0;.    (voi
9540: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
9550: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
9560: 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  led");..#if defi
9570: 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  ned(NO_TLS1) || 
9580: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9590: 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73  NO_TLS1).    tls
95a0: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  1 = 0;.#endif.#i
95b0: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
95c0: 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_1) || defined(
95d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
95e0: 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20  1).    tls1_1 = 
95f0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
9600: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
9610: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
9620: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20  SSL_NO_TLS1_2). 
9630: 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23     tls1_2 = 0;.#
9640: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
9650: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20  d(NO_TLS1_3) || 
9660: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9670: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74  NO_TLS1_3).    t
9680: 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_3 = 0;.#endi
9690: 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  f..    if (objc 
96a0: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  < 2) {..Tcl_Wron
96b0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
96c0: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
96d0: 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a  el ?options?");.
96e0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
96f0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  R;.    }..    ER
9700: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
9710: 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
9720: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
9730: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
9740: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
9750: 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e  , (Tcl_Size *) N
9760: 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ULL), NULL);.   
9770: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
9780: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
9790: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
97a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
97b0: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
97c0: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
97d0: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
97e0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
97f0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
9800: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20  chan);..    for 
9810: 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c 20  (idx = 2; idx < 
9820: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09  objc; idx++) {..
9830: 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f  char *opt = Tcl_
9840: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
9850: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c  (objv[idx], (Tcl
9860: 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a  _Size *)NULL);..
9870: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27  .if (opt[0] != '
9880: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  -')..    break;.
9890: 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22  ..OPTOBJ("-alpn"
98a0: 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52  , alpn);..OPTSTR
98b0: 28 22 2d 63 61 64 69 72 22 2c 20 43 41 64 69 72  ("-cadir", CAdir
98c0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66  );..OPTSTR("-caf
98d0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
98e0: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c  OPTBYTE("-cert",
98f0: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29   cert, cert_len)
9900: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74  ;..OPTSTR("-cert
9910: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29  file", certfile)
9920: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9930: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  er", ciphers);..
9940: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9950: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9960: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69  TSTR("-ciphersui
9970: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74  tes", ciphersuit
9980: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63  es);..OPTOBJ("-c
9990: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29  ommand", script)
99a0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61  ;..OPTSTR("-dhpa
99b0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29  rams", DHparams)
99c0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79  ;..OPTBYTE("-key
99d0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  ", key, key_len)
99e0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66  ;..OPTSTR("-keyf
99f0: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a  ile", keyfile);.
9a00: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22  .OPTSTR("-model"
9a10: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42  , model);..OPTOB
9a20: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70  J("-password", p
9a30: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f  assword);..OPTBO
9a40: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68  OL("-post_handsh
9a50: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73  ake", post_hands
9a60: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  hake);..OPTBOOL(
9a70: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
9a80: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  est);..OPTBOOL("
9a90: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69  -require", requi
9aa0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73  re);..OPTINT("-s
9ab0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
9ac0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
9ad0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
9ae0: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
9af0: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
9b00: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
9b10: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
9b20: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
9b30: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73  TBOOL("-ssl2", s
9b40: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl2);..OPTBOOL("
9b50: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09  -ssl3", ssl3);..
9b60: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c  OPTBOOL("-tls1",
9b70: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c   tls1);..OPTBOOL
9b80: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31  ("-tls1.1", tls1
9b90: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _1);..OPTBOOL("-
9ba0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29  tls1.2", tls1_2)
9bb0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9bc0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09  1.3", tls1_3);..
9bd0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74  OPTOBJ("-validat
9be0: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29  ecommand", vcmd)
9bf0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64  ;..OPTOBJ("-vcmd
9c00: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42  ", vcmd);...OPTB
9c10: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61  AD("option", "-a
9c20: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61  lpn, -cadir, -ca
9c30: 66 69 6c 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65  file, -cert, -ce
9c40: 72 74 66 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c  rtfile, -cipher,
9c50: 20 2d 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   -ciphersuites, 
9c60: 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72  -command, -dhpar
9c70: 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66  ams, -key, -keyf
9c80: 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61  ile, -model, -pa
9c90: 73 73 77 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61  ssword, -post_ha
9ca0: 6e 64 73 68 61 6b 65 2c 20 2d 72 65 71 75 65 73  ndshake, -reques
9cb0: 74 2c 20 2d 72 65 71 75 69 72 65 2c 20 2d 73 65  t, -require, -se
9cc0: 63 75 72 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73  curity_level, -s
9cd0: 65 72 76 65 72 2c 20 2d 73 65 72 76 65 72 6e 61  erver, -serverna
9ce0: 6d 65 2c 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c  me, -session_id,
9cf0: 20 2d 73 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d   -ssl2, -ssl3, -
9d00: 74 6c 73 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d  tls1, -tls1.1, -
9d10: 74 6c 73 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c  tls1.2, -tls1.3,
9d20: 20 6f 72 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d   or -validatecom
9d30: 6d 61 6e 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e  mand");...return
9d40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
9d50: 7d 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  }.    if (reques
9d60: 74 29 09 09 76 65 72 69 66 79 20 7c 3d 20 53 53  t)..verify |= SS
9d70: 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f  L_VERIFY_CLIENT_
9d80: 4f 4e 43 45 20 7c 20 53 53 4c 5f 56 45 52 49 46  ONCE | SSL_VERIF
9d90: 59 5f 50 45 45 52 3b 0a 20 20 20 20 69 66 20 28  Y_PEER;.    if (
9da0: 72 65 71 75 65 73 74 20 26 26 20 72 65 71 75 69  request && requi
9db0: 72 65 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53  re).verify |= SS
9dc0: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
9dd0: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20  _NO_PEER_CERT;. 
9de0: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20 26     if (request &
9df0: 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  & post_handshake
9e00: 29 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f  ).verify |= SSL_
9e10: 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
9e20: 53 48 41 4b 45 3b 0a 20 20 20 20 69 66 20 28 76  SHAKE;.    if (v
9e30: 65 72 69 66 79 20 3d 3d 20 30 29 09 09 76 65 72  erify == 0)..ver
9e40: 69 66 79 20 3d 20 53 53 4c 5f 56 45 52 49 46 59  ify = SSL_VERIFY
9e50: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74  _NONE;..    prot
9e60: 6f 20 7c 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53  o |= (ssl2 ? TLS
9e70: 5f 50 52 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29  _PROTO_SSL2 : 0)
9e80: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9e90: 73 73 6c 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl3 ? TLS_PROTO
9ea0: 5f 53 53 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL3 : 0);.    
9eb0: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f  proto |= (tls1 ?
9ec0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20   TLS_PROTO_TLS1 
9ed0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
9ee0: 7c 3d 20 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53  |= (tls1_1 ? TLS
9ef0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20  _PROTO_TLS1_1 : 
9f00: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
9f10: 20 28 74 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50   (tls1_2 ? TLS_P
9f20: 52 4f 54 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29  ROTO_TLS1_2 : 0)
9f30: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9f40: 74 6c 73 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f  tls1_3 ? TLS_PRO
9f50: 54 4f 5f 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a  TO_TLS1_3 : 0);.
9f60: 0a 20 20 20 20 2f 2a 20 72 65 73 65 74 20 74 6f  .    /* reset to
9f70: 20 4e 55 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73   NULL if blank s
9f80: 74 72 69 6e 67 20 70 72 6f 76 69 64 65 64 20 2a  tring provided *
9f90: 2f 0a 20 20 20 20 69 66 20 28 63 65 72 74 20 26  /.    if (cert &
9fa0: 26 20 21 2a 63 65 72 74 29 09 09 20 20 20 20 20  & !*cert)..     
9fb0: 20 20 20 63 65 72 74 09 20 20 20 20 20 20 20 20     cert.        
9fc0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
9fd0: 6b 65 79 20 26 26 20 21 2a 6b 65 79 29 09 09 20  key && !*key).. 
9fe0: 20 20 20 20 20 20 20 6b 65 79 09 20 20 20 20 20         key.     
9ff0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a000: 66 20 28 63 65 72 74 66 69 6c 65 20 26 26 20 21  f (certfile && !
a010: 2a 63 65 72 74 66 69 6c 65 29 20 20 20 20 20 20  *certfile)      
a020: 20 20 20 63 65 72 74 66 69 6c 65 09 3d 20 4e 55     certfile.= NU
a030: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 66  LL;.    if (keyf
a040: 69 6c 65 20 26 26 20 21 2a 6b 65 79 66 69 6c 65  ile && !*keyfile
a050: 29 09 09 6b 65 79 66 69 6c 65 09 20 20 20 20 20  )..keyfile.     
a060: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69     = NULL;.    i
a070: 66 20 28 63 69 70 68 65 72 73 20 26 26 20 21 2a  f (ciphers && !*
a080: 63 69 70 68 65 72 73 29 09 20 20 20 20 20 20 20  ciphers).       
a090: 20 63 69 70 68 65 72 73 09 20 20 20 20 20 20 20   ciphers.       
a0a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a0b0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 26 26  (ciphersuites &&
a0c0: 20 21 2a 63 69 70 68 65 72 73 75 69 74 65 73 29   !*ciphersuites)
a0d0: 20 63 69 70 68 65 72 73 75 69 74 65 73 20 20 20   ciphersuites   
a0e0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a0f0: 28 43 41 66 69 6c 65 20 26 26 20 21 2a 43 41 66  (CAfile && !*CAf
a100: 69 6c 65 29 09 20 20 20 20 20 20 20 20 43 41 66  ile).        CAf
a110: 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ile.        = NU
a120: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 64 69  LL;.    if (CAdi
a130: 72 20 26 26 20 21 2a 43 41 64 69 72 29 09 20 20  r && !*CAdir).  
a140: 20 20 20 20 20 20 43 41 64 69 72 09 20 20 20 20        CAdir.    
a150: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a160: 69 66 20 28 44 48 70 61 72 61 6d 73 20 26 26 20  if (DHparams && 
a170: 21 2a 44 48 70 61 72 61 6d 73 29 09 20 20 20 20  !*DHparams).    
a180: 20 20 20 20 44 48 70 61 72 61 6d 73 20 20 20 20      DHparams    
a190: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20      = NULL;..   
a1a0: 20 2f 2a 20 6e 65 77 20 53 53 4c 20 73 74 61 74   /* new SSL stat
a1b0: 65 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74  e */.    statePt
a1c0: 72 09 09 3d 20 28 53 74 61 74 65 20 2a 29 20 63  r..= (State *) c
a1d0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
a1e0: 29 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29 29  ) sizeof(State))
a1f0: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 73 74 61  ;.    memset(sta
a200: 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66  tePtr, 0, sizeof
a210: 28 53 74 61 74 65 29 29 3b 0a 0a 20 20 20 20 73  (State));..    s
a220: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d  tatePtr->flags.=
a230: 20 66 6c 61 67 73 3b 0a 20 20 20 20 73 74 61 74   flags;.    stat
a240: 65 50 74 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69  ePtr->interp.= i
a250: 6e 74 65 72 70 3b 0a 20 20 20 20 73 74 61 74 65  nterp;.    state
a260: 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65  Ptr->vflags.= ve
a270: 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65 50  rify;.    stateP
a280: 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20  tr->err.= "";.. 
a290: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
a2a0: 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66 20  cript */.    if 
a2b0: 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f 69  (script) {..(voi
a2c0: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a2d0: 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20  FromObj(script, 
a2e0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a2f0: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a300: 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72  ->callback = scr
a310: 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ipt;..    Tcl_In
a320: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a330: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
a340: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a350: 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77 6f   allocate passwo
a360: 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70 61  rd */.    if (pa
a370: 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64  ssword) {..(void
a380: 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  ) Tcl_GetStringF
a390: 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64 2c  romObj(password,
a3a0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a3b0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a3c0: 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70 61  r->password = pa
a3d0: 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c  ssword;..    Tcl
a3e0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a3f0: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a400: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
a410: 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c   /* allocate val
a420: 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f  idate command */
a430: 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20 7b  .    if (vcmd) {
a440: 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74  ..(void) Tcl_Get
a450: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63  StringFromObj(vc
a460: 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  md, &len);..if (
a470: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a480: 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d  ePtr->vcmd = vcm
a490: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a4a0: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a4b0: 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20  r->vcmd);..}.   
a4c0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65   }..    if (mode
a4d0: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e  l != NULL) {..in
a4e0: 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20  t mode;../* Get 
a4f0: 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74  the "model" cont
a500: 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54  ext */..chan = T
a510: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
a520: 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f  terp, model, &mo
a530: 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d  de);..if (chan =
a540: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
a550: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a560: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a570: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a580: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a590: 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b  ..}.../*.. * Mak
a5a0: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
a5b0: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
a5c0: 20 63 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63   channel.. */..c
a5d0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
a5e0: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09  Channel(chan);..
a5f0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
a600: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
a610: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
a620: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
a630: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a640: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
a650: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
a660: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
a670: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
a680: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
a690: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
a6a0: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
a6b0: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
a6c0: 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41  "CHANNEL", "INVA
a6d0: 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LID", (char *) N
a6e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
a6f0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
a700: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a710: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a720: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a730: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a740: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a750: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a760: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a770: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
a780: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
a790: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
a7a0: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
a7b0: 72 74 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65  rt, (int) key_le
a7c0: 6e 2c 0a 09 20 20 20 20 28 69 6e 74 29 20 63 65  n,..    (int) ce
a7d0: 72 74 5f 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43  rt_len, CAdir, C
a7e0: 41 66 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20  Afile, ciphers, 
a7f0: 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65  ciphersuites, le
a800: 76 65 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20  vel, DHparams)) 
a810: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
a820: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
a830: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
a840: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a850: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
a860: 20 20 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20    statePtr->ctx 
a870: 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20  = ctx;..    /*. 
a880: 20 20 20 20 2a 20 57 65 20 6e 65 65 64 20 74 6f      * We need to
a890: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
a8a0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b  the channel work
a8b0: 73 20 69 6e 20 62 69 6e 61 72 79 20 28 66 6f 72  s in binary (for
a8c0: 20 74 68 65 0a 20 20 20 20 20 2a 20 65 6e 63 72   the.     * encr
a8d0: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
a8e0: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20  t goofed up)..  
a8f0: 20 20 20 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e     * We only wan
a900: 74 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20  t to adjust the 
a910: 62 75 66 66 65 72 69 6e 67 20 69 6e 20 70 72 65  buffering in pre
a920: 2d 76 32 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68  -v2 channels, wh
a930: 65 72 65 0a 20 20 20 20 20 2a 20 65 61 63 68 20  ere.     * each 
a940: 63 68 61 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73  channel in the s
a950: 74 61 63 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20  tack maintained 
a960: 69 74 73 20 6f 77 6e 20 62 75 66 66 65 72 73 2e  its own buffers.
a970: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c  .     */.    Tcl
a980: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
a990: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
a9a0: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
a9b0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
a9c0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
a9d0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
a9e0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
a9f0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
aa00: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
aa10: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
aa20: 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54  Encoding);.    T
aa30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
aa40: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
aa50: 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75  , "-eofchar", &u
aa60: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
aa70: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ar);.    Tcl_Get
aa80: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
aa90: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e  terp, chan, "-en
aaa0: 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43  coding", &upperC
aab0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
aac0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
aad0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aae0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
aaf0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
ab00: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
ab10: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ab20: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ab30: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
ab40: 6b 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  king", &upperCha
ab50: 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20  nnelBlocking);. 
ab60: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ab70: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ab80: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ab90: 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 3b  ion", "binary");
aba0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
abb0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
abc0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
abd0: 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a 20 20  ng", "true");.  
abe0: 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e 73 75    dprintf("Consu
abf0: 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c  ming Tcl channel
ac00: 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61   %s", Tcl_GetCha
ac10: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b  nnelName(chan));
ac20: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73  .    statePtr->s
ac30: 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43  elf = Tcl_StackC
ac40: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
ac50: 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29  ls_ChannelType()
ac60: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  , (ClientData) s
ac70: 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52  tatePtr,..(TCL_R
ac80: 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52  EADABLE | TCL_WR
ac90: 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a  ITABLE), chan);.
aca0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 72 65      dprintf("Cre
acb0: 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d  ated channel nam
acc0: 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  ed %s", Tcl_GetC
acd0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
ace0: 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20  Ptr->self));.   
acf0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73   if (statePtr->s
ad00: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  elf == (Tcl_Chan
ad10: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a  nel) NULL) {../*
ad20: 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54  .. * No use of T
ad30: 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46 72 65  cl_EventuallyFre
ad40: 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70 6f 73  e because no pos
ad50: 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73 65 72  sible Tcl_Preser
ad60: 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72  ve... */..Tls_Fr
ad70: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
ad80: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54  ePtr);..return T
ad90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ada0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
adb0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
adc0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
add0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
ade0: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
adf0: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
ae00: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20  Translation));. 
ae10: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
ae20: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ae30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
ae40: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c  "-encoding", Tcl
ae50: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
ae60: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
ae70: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ing));.    Tcl_S
ae80: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ae90: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
aea0: 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61  ->self, "-eofcha
aeb0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
aec0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
aed0: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
aee0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
aef0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
af00: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
af10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44  blocking", Tcl_D
af20: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
af30: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
af40: 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  g));..    /*.   
af50: 20 20 2a 20 53 53 4c 20 49 6e 69 74 69 61 6c 69    * SSL Initiali
af60: 7a 61 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20  zation.     */. 
af70: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c     statePtr->ssl
af80: 20 3d 20 53 53 4c 5f 6e 65 77 28 73 74 61 74 65   = SSL_new(state
af90: 50 74 72 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69  Ptr->ctx);.    i
afa0: 66 20 28 21 73 74 61 74 65 50 74 72 2d 3e 73 73  f (!statePtr->ss
afb0: 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62  l) {../* SSL lib
afc0: 72 61 72 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54  rary error */..T
afd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
afe0: 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27  interp, "couldn'
aff0: 74 20 63 6f 6e 73 74 72 75 63 74 20 73 73 6c 20  t construct ssl 
b000: 73 65 73 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f  session: ", GET_
b010: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
b020: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
b030: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
b040: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
b050: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e  ", "IMPORT", "IN
b060: 49 54 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  IT", "FAILED", (
b070: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b080: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b090: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65  ) statePtr);..re
b0a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
b0c0: 74 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61  t host server na
b0d0: 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65  me */.    if (se
b0e0: 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20  rvername) {../* 
b0f0: 53 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20  Sets the server 
b100: 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20  name indication 
b110: 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48  (SNI) in ClientH
b120: 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a  ello extension *
b130: 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30  /../* Per RFC 60
b140: 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20  66, hostname is 
b150: 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20  a ASCII encoded 
b160: 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52  string, though R
b170: 46 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46  FC 4366 says UTF
b180: 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  -8. */..if (!SSL
b190: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74  _set_tlsext_host
b1a0: 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  _name(statePtr->
b1b0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b1c0: 20 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09   && require) {..
b1d0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
b1e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
b1f0: 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20  t SNI extension 
b200: 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45  failed: ", GET_E
b210: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
b220: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b230: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
b240: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
b250: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49  , "IMPORT", "SNI
b260: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b270: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b280: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b290: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b2a0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b2b0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  RROR;..}.../* Se
b2c0: 74 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70  t hostname for p
b2d0: 65 65 72 20 63 65 72 74 69 66 69 63 61 74 65 20  eer certificate 
b2e0: 68 6f 73 74 6e 61 6d 65 20 76 65 72 69 66 69 63  hostname verific
b2f0: 61 74 69 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73  ation in clients
b300: 2e 0a 09 20 20 20 44 6f 6e 27 74 20 75 73 65 20  ...   Don't use 
b310: 53 53 4c 5f 73 65 74 31 5f 68 6f 73 74 20 73 69  SSL_set1_host si
b320: 6e 63 65 20 69 74 20 68 61 73 20 6c 69 6d 69 74  nce it has limit
b330: 61 74 69 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28  ations. */..if (
b340: 21 53 53 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73  !SSL_add1_host(s
b350: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65  tatePtr->ssl, se
b360: 72 76 65 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20  rvername)) {..  
b370: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b380: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b390: 44 4e 53 20 68 6f 73 74 6e 61 6d 65 20 66 61 69  DNS hostname fai
b3a0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b3b0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b3c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b3d0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b3e0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b3f0: 49 4d 50 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41  IMPORT", "HOSTNA
b400: 4d 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  ME", "FAILED", (
b410: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b420: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68      Tls_Free((ch
b430: 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  ar *) statePtr);
b440: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b450: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b460: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b470: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b480: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b490: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b4a0: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b4b0: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b4c0: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b4d0: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b4e0: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b4f0: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b500: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b510: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73  tatePtr->ssl), s
b520: 65 73 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69  ession_id, (unsi
b530: 67 6e 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e  gned int) strlen
b540: 28 73 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b  (session_id))) {
b550: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b560: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b570: 52 65 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66  Resume session f
b580: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b590: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b5a0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b5b0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b5c0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b5d0: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53   "IMPORT", "SESS
b5e0: 49 4f 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20  ION", "FAILED", 
b5f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b600: 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 63  .    Tls_Free((c
b610: 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72 29  har *) statePtr)
b620: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b630: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
b640: 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65  }..    /* Enable
b650: 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79   Application-Lay
b660: 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f  er Protocol Nego
b670: 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65  tiation. Example
b680: 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c  s are: http/1.0,
b690: 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20  ..http/1.1, h2, 
b6a0: 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c 20 70  h3, ftp, imap, p
b6b0: 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74  op3, xmpp-client
b6c0: 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d  , xmpp-server, m
b6d0: 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a  qtt, irc, etc. *
b6e0: 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e 29 20  /.    if (alpn) 
b6f0: 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20  {../* Convert a 
b700: 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20 61 20  TCL list into a 
b710: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e  protocol-list in
b720: 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a   wire-format */.
b730: 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  .unsigned char *
b740: 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73  protos, *p;..uns
b750: 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74 6f 73  igned int protos
b760: 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53  _len = 0;..Tcl_S
b770: 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74  ize cnt, i;..int
b780: 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c   j;..Tcl_Obj **l
b790: 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c  ist;...if (Tcl_L
b7a0: 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74  istObjGetElement
b7b0: 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20  s(interp, alpn, 
b7c0: 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21 3d 20  &cnt, &list) != 
b7d0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54  TCL_OK) {..    T
b7e0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b7f0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b800: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b810: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
b820: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
b830: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
b840: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
b850: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
b860: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
b870: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
b880: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
b890: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
b8a0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
b8b0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
b8c0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
b8d0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
b8e0: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
b8f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f  *) NULL);...Tcl_
b900: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b910: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b920: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
b930: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b940: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72   NULL);...Tls_Fr
b950: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
b960: 65 50 74 72 29 3b 0a 09 09 72 65 74 75 72 6e 20  ePtr);...return 
b970: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
b980: 7d 0a 09 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65  }..    protos_le
b990: 6e 20 2b 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c  n += 1 + (int) l
b9a0: 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c  en;..}.../* Buil
b9b0: 64 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 70  d the complete p
b9c0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
b9d0: 09 70 72 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f  .protos = ckallo
b9e0: 63 28 70 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09  c(protos_len);..
b9f0: 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  /* protocol-list
ba00: 73 20 63 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62  s consist of 8-b
ba10: 69 74 20 6c 65 6e 67 74 68 2d 70 72 65 66 69 78  it length-prefix
ba20: 65 64 2c 20 62 79 74 65 20 73 74 72 69 6e 67 73  ed, byte strings
ba30: 20 2a 2f 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c   */..for (j = 0,
ba40: 20 70 20 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c   p = protos; j <
ba50: 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20   cnt; j++) {..  
ba60: 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 54 63    char *str = Tc
ba70: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
ba80: 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e  bj(list[j], &len
ba90: 29 3b 0a 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28  );..    *p++ = (
baa0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 20 6c  unsigned char) l
bab0: 65 6e 3b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28  en;..    memcpy(
bac0: 70 2c 20 73 74 72 2c 20 28 73 69 7a 65 5f 74 29  p, str, (size_t)
bad0: 20 6c 65 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d   len);..    p +=
bae0: 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53   len;..}.../* SS
baf0: 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f  L_set_alpn_proto
bb00: 73 20 6d 61 6b 65 73 20 61 20 63 6f 70 79 20 6f  s makes a copy o
bb10: 66 20 74 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c  f the protocol-l
bb20: 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a  ist */../* Note:
bb30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   This functions 
bb40: 72 65 76 65 72 73 65 73 20 74 68 65 20 72 65 74  reverses the ret
bb50: 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e  urn value conven
bb60: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c  tion */..if (SSL
bb70: 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73  _set_alpn_protos
bb80: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bb90: 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c  protos, protos_l
bba0: 65 6e 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  en)) {..    Tcl_
bbb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bbc0: 65 72 70 2c 20 22 53 65 74 20 41 4c 50 4e 20 70  erp, "Set ALPN p
bbd0: 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a  rotocols failed:
bbe0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
bbf0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
bc00: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
bc10: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
bc20: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
bc30: 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41  RT", "ALPN", "FA
bc40: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
bc50: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
bc60: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
bc70: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b  atePtr);..    ck
bc80: 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20  free(protos);.. 
bc90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
bca0: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f  ROR;..}.../* Sto
bcb0: 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73  re protocols lis
bcc0: 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  t */..statePtr->
bcd0: 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b  protos = protos;
bce0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bcf0: 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f  os_len = protos_
bd00: 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  len;.    } else 
bd10: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  {..statePtr->pro
bd20: 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61  tos = NULL;..sta
bd30: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
bd40: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  n = 0;.    }..  
bd50: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20    /*.     * SSL 
bd60: 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a  Callbacks.     *
bd70: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70  /.    SSL_set_ap
bd80: 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72 2d  p_data(statePtr-
bd90: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
bda0: 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e  atePtr);./* poin
bdb0: 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a  t back to us */.
bdc0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69      SSL_set_veri
bdd0: 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  fy(statePtr->ssl
bde0: 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66 79  , verify, Verify
bdf0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
be00: 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c  SL_set_info_call
be10: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
be20: 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  sl, InfoCallback
be30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62  );..    /* Callb
be40: 61 63 6b 20 66 6f 72 20 6f 62 73 65 72 76 69 6e  ack for observin
be50: 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61  g protocol messa
be60: 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ges */.#ifndef O
be70: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52  PENSSL_NO_SSL_TR
be80: 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20  ACE.    /* void 
be90: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
bea0: 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74 61  callback_arg(sta
beb0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
bec0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 20  d *)statePtr);. 
bed0: 20 20 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f     void SSL_CTX_
bee0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
bef0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
bf00: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
bf10: 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74  ; */.    SSL_set
bf20: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
bf30: 67 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  g(statePtr->ssl,
bf40: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
bf50: 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f  r);.    SSL_set_
bf60: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
bf70: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73  tePtr->ssl, Mess
bf80: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65  ageCallback);.#e
bf90: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65  ndif..    /* Cre
bfa0: 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20  ate Tcl_Channel 
bfb0: 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  BIO Handler */. 
bfc0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62     statePtr->p_b
bfd0: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  io.= BIO_new_tcl
bfe0: 28 73 74 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e  (statePtr, BIO_N
bff0: 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20 73 74 61  OCLOSE);.    sta
c000: 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f  tePtr->bio.= BIO
c010: 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29  _new(BIO_f_ssl()
c020: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 72 76  );..    if (serv
c030: 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72  er) {../* Server
c040: 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53   callbacks */..S
c050: 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65 78  SL_CTX_set_tlsex
c060: 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 61 72 67  t_servername_arg
c070: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c080: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c090: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
c0a0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c0b0: 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65  e_callback(state
c0c0: 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c  Ptr->ctx, SNICal
c0d0: 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58  lback);..SSL_CTX
c0e0: 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  _set_client_hell
c0f0: 6f 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  o_cb(statePtr->c
c100: 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63  tx, HelloCallbac
c110: 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  k, (void *)state
c120: 50 74 72 29 3b 0a 09 69 66 20 28 73 74 61 74 65  Ptr);..if (state
c130: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c140: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
c150: 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c  CTX_set_alpn_sel
c160: 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d  ect_cb(statePtr-
c170: 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61  >ctx, ALPNCallba
c180: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c190: 65 50 74 72 29 3b 0a 23 69 66 64 65 66 20 55 53  ePtr);.#ifdef US
c1a0: 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66 20 28 74  E_NPN..    if (t
c1b0: 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c  ls1_2 == 0 && tl
c1c0: 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53  s1_3 == 0) {...S
c1d0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f  SL_CTX_set_next_
c1e0: 70 72 6f 74 6f 73 5f 61 64 76 65 72 74 69 73 65  protos_advertise
c1f0: 64 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  d_cb(statePtr->c
c200: 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c  tx, NPNCallback,
c210: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c220: 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69  r);..    }.#endi
c230: 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65  f..}.../* Enable
c240: 20 73 65 72 76 65 72 20 74 6f 20 73 65 6e 64 20   server to send 
c250: 63 65 72 74 20 72 65 71 75 65 73 74 20 61 66 74  cert request aft
c260: 65 72 20 68 61 6e 64 73 68 61 6b 65 20 28 54 4c  er handshake (TL
c270: 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09  S 1.3 only) */..
c280: 2f 2a 20 41 20 77 72 69 74 65 20 6f 70 65 72 61  /* A write opera
c290: 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b 65 20 70  tion must take p
c2a0: 6c 61 63 65 20 66 6f 72 20 74 68 65 20 43 65 72  lace for the Cer
c2b0: 74 69 66 69 63 61 74 65 20 52 65 71 75 65 73 74  tificate Request
c2c0: 20 74 6f 20 62 65 0a 09 20 20 20 73 65 6e 74 20   to be..   sent 
c2d0: 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 2c 20 74  to the client, t
c2e0: 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e 65 20  his can be done 
c2f0: 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64  with SSL_do_hand
c300: 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20  shake(). */..if 
c310: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c320: 5f 68 61 6e 64 73 68 61 6b 65 20 26 26 20 74 6c  _handshake && tl
c330: 73 31 5f 33 29 20 7b 0a 09 20 20 20 20 53 53 4c  s1_3) {..    SSL
c340: 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70  _verify_client_p
c350: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 28 73 74  ost_handshake(st
c360: 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d  atePtr->ssl);..}
c370: 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61  .../* set automa
c380: 74 69 63 20 63 75 72 76 65 20 73 65 6c 65 63 74  tic curve select
c390: 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f  ion */..SSL_set_
c3a0: 65 63 64 68 5f 61 75 74 6f 28 73 74 61 74 65 50  ecdh_auto(stateP
c3b0: 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f  tr->ssl, 1);.../
c3c0: 2a 20 53 65 74 20 73 65 72 76 65 72 20 6d 6f 64  * Set server mod
c3d0: 65 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e  e */..statePtr->
c3e0: 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c  flags |= TLS_TCL
c3f0: 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65  _SERVER;..SSL_se
c400: 74 5f 61 63 63 65 70 74 5f 73 74 61 74 65 28 73  t_accept_state(s
c410: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
c420: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20     } else {../* 
c430: 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73  Client callbacks
c440: 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
c450: 50 4e 0a 09 69 66 20 28 73 74 61 74 65 50 74 72  PN..if (statePtr
c460: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c  ->protos != NULL
c470: 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20   && tls1_2 == 0 
c480: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
c490: 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  {..    SSL_CTX_s
c4a0: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65  et_next_proto_se
c4b0: 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50 74 72  lect_cb(statePtr
c4c0: 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62  ->ctx, ALPNCallb
c4d0: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c4e0: 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69  tePtr);..}.#endi
c4f0: 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63  f.../* Session c
c500: 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43  aching */..SSL_C
c510: 54 58 5f 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63  TX_set_session_c
c520: 61 63 68 65 5f 6d 6f 64 65 28 73 74 61 74 65 50  ache_mode(stateP
c530: 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53  tr->ctx, SSL_SES
c540: 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c  S_CACHE_CLIENT |
c550: 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f   SSL_SESS_CACHE_
c560: 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52  NO_INTERNAL_STOR
c570: 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73  E);..SSL_CTX_ses
c580: 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28 73 74 61  s_set_new_cb(sta
c590: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 65 73 73  tePtr->ctx, Sess
c5a0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09  ionCallback);...
c5b0: 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73 74 20 68  /* Enable post h
c5c0: 61 6e 64 73 68 61 6b 65 20 41 75 74 68 65 6e 74  andshake Authent
c5d0: 69 63 61 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f  ication extensio
c5e0: 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c  n. TLS 1.3 only,
c5f0: 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a   not http/2. */.
c600: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c610: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 20  post_handshake) 
c620: 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65 74 5f 70  {..    SSL_set_p
c630: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75  ost_handshake_au
c640: 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  th(statePtr->ssl
c650: 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  , 1);..}.../* Se
c660: 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f  t client mode */
c670: 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63  ..SSL_set_connec
c680: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c690: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  ->ssl);.    }.  
c6a0: 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74    SSL_set_bio(st
c6b0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61  atePtr->ssl, sta
c6c0: 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74  tePtr->p_bio, st
c6d0: 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a  atePtr->p_bio);.
c6e0: 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28      BIO_set_ssl(
c6f0: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73  statePtr->bio, s
c700: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49  tatePtr->ssl, BI
c710: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20  O_NOCLOSE);..   
c720: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f   /*.     * End o
c730: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20  f SSL Init.     
c740: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
c750: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54  Returning %s", T
c760: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
c770: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
c780: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  ));.    Tcl_SetR
c790: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c7a0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  har *) Tcl_GetCh
c7b0: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
c7c0: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56  tr->self), TCL_V
c7d0: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72  OLATILE);..    r
c7e0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
c7f0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
c800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
c840: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   UnimportObjCmd 
c850: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
c860: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
c870: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
c880: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
c890: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52   filter.. *. * R
c8a0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
c8b0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
c8c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
c8d0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
c8e0: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
c8f0: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
c900: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
c950: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
c960: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
c970: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
c980: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c990: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
c9a0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
c9b0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
c9c0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f  Channel chan;../
c9d0: 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f  * The channel to
c9e0: 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20   set a mode on. 
c9f0: 2a 2f 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  */.    (void) cl
ca00: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
ca10: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
ca20: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
ca30: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
ca40: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ca50: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
ca60: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
ca70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
ca80: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
ca90: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
caa0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
cab0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
cac0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
cad0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
cae0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
caf0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cb00: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
cb10: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cb20: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cb30: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cb40: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cb50: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20  nnel(chan);..   
cb60: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e   if (Tcl_GetChan
cb70: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d  nelType(chan) !=
cb80: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
cb90: 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  ()) {..Tcl_Appen
cba0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
cbb0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
cbc0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
cbd0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
cbe0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
cbf0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  nnel", NULL);.. 
cc00: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
cc10: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
cc20: 22 2c 20 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22  ", "UNIMPORT", "
cc30: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
cc40: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
cc50: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
cc60: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cc70: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
cc80: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
cc90: 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45  , chan) == TCL_E
cca0: 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 6e 20  RROR) {..return 
ccb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
ccc0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
ccd0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
cce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ccf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74  -. *. * CTX_Init
cd30: 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74 20 61 20   -- construct a 
cd40: 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65  SSL_CTX instance
cd50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
cd60: 20 2a 09 41 20 76 61 6c 69 64 20 53 53 4c 5f 43   *.A valid SSL_C
cd70: 54 58 20 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e  TX instance or N
cd80: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ULL.. *. * Side 
cd90: 65 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73  effects:. *.cons
cda0: 74 72 75 63 74 73 20 53 53 4c 20 63 6f 6e 74 65  tructs SSL conte
cdb0: 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d  xt (CTX). *. *--
cdc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cde0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce00: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c  -. */.static SSL
ce10: 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28  _CTX *.CTX_Init(
ce20: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c  State *statePtr,
ce30: 20 69 6e 74 20 69 73 53 65 72 76 65 72 2c 20 69   int isServer, i
ce40: 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a  nt proto, char *
ce50: 6b 65 79 66 69 6c 65 2c 20 63 68 61 72 20 2a 63  keyfile, char *c
ce60: 65 72 74 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73  ertfile,.    uns
ce70: 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 2c  igned char *key,
ce80: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
ce90: 63 65 72 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65  cert, int key_le
cea0: 6e 2c 20 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c  n, int cert_len,
ceb0: 20 63 68 61 72 20 2a 43 41 64 69 72 2c 0a 20 20   char *CAdir,.  
cec0: 20 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20    char *CAfile, 
ced0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
cee0: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
cef0: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
cf00: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a  ar *DHparams) {.
cf10: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
cf20: 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50 74  interp = statePt
cf30: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53  r->interp;.    S
cf40: 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55  SL_CTX *ctx = NU
cf50: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
cf60: 69 6e 67 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f  ing ds;.    Tcl_
cf70: 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 20 20 20  DString ds1;.   
cf80: 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20   int off = 0;.  
cf90: 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61    int load_priva
cfa0: 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73  te_key;.    cons
cfb0: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
cfc0: 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e  thod;..    dprin
cfd0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
cfe0: 20 20 20 69 66 20 28 21 70 72 6f 74 6f 29 20 7b     if (!proto) {
cff0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d000: 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76  lt(interp, "no v
d010: 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65  alid protocol se
d020: 6c 65 63 74 65 64 22 2c 20 28 63 68 61 72 20 2a  lected", (char *
d030: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d040: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
d050: 20 20 2f 2a 20 63 72 65 61 74 65 20 53 53 4c 20    /* create SSL 
d060: 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f  context */.#if O
d070: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
d080: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
d090: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
d0a0: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
d0b0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
d0c0: 53 4c 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  SL2).    if (ENA
d0d0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d0e0: 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09  PROTO_SSL2)) {..
d0f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d100: 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 32 20 70  (interp, "SSL2 p
d110: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
d120: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
d130: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
d140: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
d150: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
d160: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
d170: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
d180: 4c 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  L3).    if (ENAB
d190: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
d1a0: 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b 0a 09 54  ROTO_SSL3)) {..T
d1b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d1c0: 69 6e 74 65 72 70 2c 20 22 53 53 4c 33 20 70 72  interp, "SSL3 pr
d1d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
d1e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
d1f0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e  NULL);..return N
d200: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ULL;.    }.#endi
d210: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
d220: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
d230: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d240: 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c  1).    if (ENABL
d250: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
d260: 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a 09 54 63  OTO_TLS1)) {..Tc
d270: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d280: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 30 20  nterp, "TLS 1.0 
d290: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d2a0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d2b0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d2c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d2d0: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d2e0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
d2f0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d300: 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20 69 66 20  _TLS1_1).    if 
d310: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d320: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31  TLS_PROTO_TLS1_1
d330: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d340: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d350: 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c  TLS 1.1 protocol
d360: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d370: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d380: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d390: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
d3a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
d3b0: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
d3c0: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
d3d0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d3e0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d3f0: 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63  O_TLS1_2)) {..Tc
d400: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d410: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 32 20  nterp, "TLS 1.2 
d420: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
d430: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
d440: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
d450: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
d460: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
d470: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
d480: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d490: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
d4a0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
d4b0: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
d4c0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
d4d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d4e0: 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c  TLS 1.3 protocol
d4f0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
d500: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d510: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
d520: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
d530: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20  if (proto == 0) 
d540: 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72  {../* Use full r
d550: 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58  ange */..SSL_CTX
d560: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
d570: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a  ersion(ctx, 0);.
d580: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78  .SSL_CTX_set_max
d590: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
d5a0: 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  tx, 0);.    }.. 
d5b0: 20 20 20 73 77 69 74 63 68 20 28 70 72 6f 74 6f     switch (proto
d5c0: 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  ) {.#if OPENSSL_
d5d0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
d5e0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
d5f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
d600: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
d610: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20  ENSSL_NO_SSL2). 
d620: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d630: 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20  O_SSL2:..method 
d640: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c  = isServer ? SSL
d650: 76 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v2_server_method
d660: 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e  () : SSLv2_clien
d670: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d680: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d690: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29  defined(NO_SSL3)
d6a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d6b0: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26  NSSL_NO_SSL3) &&
d6c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d6d0: 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44  L_NO_SSL3_METHOD
d6e0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
d6f0: 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68  ROTO_SSL3:..meth
d700: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d710: 53 53 4c 76 33 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv3_server_met
d720: 68 6f 64 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c  hod() : SSLv3_cl
d730: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
d740: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
d750: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d760: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
d770: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29  OPENSSL_NO_TLS1)
d780: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d790: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
d7a0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
d7b0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d  S_PROTO_TLS1:..m
d7c0: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
d7d0: 20 3f 20 54 4c 53 76 31 5f 73 65 72 76 65 72 5f   ? TLSv1_server_
d7e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
d7f0: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
d800: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
d810: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
d820: 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66  _TLS1_1) && !def
d830: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
d840: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
d850: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d860: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20  LS1_1_METHOD).  
d870: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d880: 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64  _TLS1_1:..method
d890: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
d8a0: 53 76 31 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74  Sv1_1_server_met
d8b0: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f  hod() : TLSv1_1_
d8c0: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
d8d0: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
d8e0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
d8f0: 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69  TLS1_2) && !defi
d900: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
d910: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
d920: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d930: 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_2_METHOD).   
d940: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
d950: 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20  TLS1_2:..method 
d960: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
d970: 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d 65 74 68  v1_2_server_meth
d980: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63  od() : TLSv1_2_c
d990: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
d9a0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
d9b0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
d9c0: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
d9d0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d9e0: 53 31 5f 33 29 0a 20 20 20 20 63 61 73 65 20 54  S1_3).    case T
d9f0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a  LS_PROTO_TLS1_3:
da00: 0a 09 2f 2a 20 55 73 65 20 74 68 65 20 67 65 6e  ../* Use the gen
da10: 65 72 69 63 20 6d 65 74 68 6f 64 20 61 6e 64 20  eric method and 
da20: 63 6f 6e 73 74 72 61 69 6e 74 20 72 61 6e 67 65  constraint range
da30: 20 61 66 74 65 72 20 63 6f 6e 74 65 78 74 20 69   after context i
da40: 73 20 63 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65  s created */..me
da50: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
da60: 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74  ? TLS_server_met
da70: 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65  hod() : TLS_clie
da80: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
da90: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  eak;.#endif.    
daa0: 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67  default:../* Neg
dab0: 6f 74 69 61 74 65 20 68 69 67 68 65 73 74 20 61  otiate highest a
dac0: 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53  vailable SSL/TLS
dad0: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74   version */..met
dae0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
daf0: 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68   TLS_server_meth
db00: 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e  od() : TLS_clien
db10: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23 69 66 20  t_method();.#if 
db20: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
db30: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
db40: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
db50: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
db60: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
db70: 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL2)..off |= (
db80: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
db90: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20  LS_PROTO_SSL2)  
dba0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
dbb0: 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv2);.#endif.
dbc0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
dbd0: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
dbe0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
dbf0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  3)..off |= (ENAB
dc00: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
dc10: 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30  ROTO_SSL3)   ? 0
dc20: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
dc30: 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v3);.#endif.#if 
dc40: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
dc50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dc60: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09  ENSSL_NO_TLS1)..
dc70: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dc80: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dc90: 5f 54 4c 53 31 29 20 20 20 3f 20 30 20 3a 20 53  _TLS1)   ? 0 : S
dca0: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b  SL_OP_NO_TLSv1);
dcb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dcc0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
dcd0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dce0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09  SSL_NO_TLS1_1)..
dcf0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
dd00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
dd10: 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20 3a 20 53  _TLS1_1) ? 0 : S
dd20: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31  SL_OP_NO_TLSv1_1
dd30: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  );.#endif.#if !d
dd40: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32  efined(NO_TLS1_2
dd50: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dd60: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
dd70: 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45  ..off |= (ENABLE
dd80: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
dd90: 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a  TO_TLS1_2) ? 0 :
dda0: 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31   SSL_OP_NO_TLSv1
ddb0: 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  _2);.#endif.#if 
ddc0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
ddd0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
dde0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
ddf0: 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  3)..off |= (ENAB
de00: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
de10: 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30  ROTO_TLS1_3) ? 0
de20: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
de30: 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62  v1_3);.#endif..b
de40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
de50: 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
de60: 28 29 3b 0a 0a 20 20 20 20 63 74 78 20 3d 20 53  ();..    ctx = S
de70: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
de80: 64 29 3b 0a 20 20 20 20 69 66 20 28 21 63 74 78  d);.    if (!ctx
de90: 29 20 7b 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c  ) {..return(NULL
dea0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
deb0: 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c   (getenv(SSLKEYL
dec0: 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f  OGFILE)) {..SSL_
ded0: 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63  CTX_set_keylog_c
dee0: 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b 65 79  allback(ctx, Key
def0: 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  LogCallback);.  
df00: 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65    }..#if !define
df10: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
df20: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
df30: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
df40: 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53  if (proto == TLS
df50: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b  _PROTO_TLS1_3) {
df60: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69  ..SSL_CTX_set_mi
df70: 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  n_proto_version(
df80: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
df90: 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  ION);..SSL_CTX_s
dfa0: 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72  et_max_proto_ver
dfb0: 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33  sion(ctx, TLS1_3
dfc0: 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d  _VERSION);.    }
dfd0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
dfe0: 46 6f 72 63 65 20 63 69 70 68 65 72 20 73 65 6c  Force cipher sel
dff0: 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62 79 20  ection order by 
e000: 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20 69 66  server */.    if
e010: 20 28 21 69 73 53 65 72 76 65 72 29 20 7b 0a 09   (!isServer) {..
e020: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69  SSL_CTX_set_opti
e030: 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f  ons(ctx, SSL_OP_
e040: 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f 50 52  CIPHER_SERVER_PR
e050: 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d  EFERENCE);.    }
e060: 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
e070: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
e080: 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20 20 4f  x10100000L.    O
e090: 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61  penSSL_add_all_a
e0a0: 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20  lgorithms(); /* 
e0b0: 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61 6e 64  Load ciphers and
e0c0: 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64   digests */.#end
e0d0: 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  if..    SSL_CTX_
e0e0: 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63 74 78  set_app_data(ctx
e0f0: 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72 70 29  , (void*)interp)
e100: 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20 74 68  ;./* remember th
e110: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f  e interpreter */
e120: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e130: 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53  _options(ctx, SS
e140: 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c  L_OP_ALL);./* al
e150: 6c 20 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72  l SSL bug workar
e160: 6f 75 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c  ounds */.    SSL
e170: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e180: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  (ctx, SSL_OP_NO_
e190: 43 4f 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a  COMPRESSION);./*
e1a0: 20 64 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73   disable compres
e1b0: 73 69 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70  sion even if sup
e1c0: 70 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53  ported */.    SS
e1d0: 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e  L_CTX_set_option
e1e0: 73 28 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a  s(ctx, off);../*
e1f0: 20 64 69 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f   disable protoco
e200: 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69  l versions */.#i
e210: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
e220: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
e230: 30 31 30 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43  01000L.    SSL_C
e240: 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c  TX_set_mode(ctx,
e250: 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52   SSL_MODE_AUTO_R
e260: 45 54 52 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65  ETRY);./* handle
e270: 20 6e 65 77 20 68 61 6e 64 73 68 61 6b 65 73 20   new handshakes 
e280: 69 6e 20 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f  in background. O
e290: 6e 20 62 79 20 64 65 66 61 75 6c 74 20 69 6e 20  n by default in 
e2a0: 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a  OpenSSL 1.1.1. *
e2b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 53 53 4c  /.#endif.    SSL
e2c0: 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 63 61  _CTX_sess_set_ca
e2d0: 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20 31 32  che_size(ctx, 12
e2e0: 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  8);..    /* Set 
e2f0: 75 73 65 72 20 64 65 66 69 6e 65 64 20 63 69 70  user defined cip
e300: 68 65 72 73 2c 20 63 69 70 68 65 72 20 73 75 69  hers, cipher sui
e310: 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72 69 74  tes, and securit
e320: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
e330: 66 20 28 28 63 69 70 68 65 72 73 20 21 3d 20 4e  f ((ciphers != N
e340: 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43 54 58  ULL) && !SSL_CTX
e350: 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69 73 74  _set_cipher_list
e360: 28 63 74 78 2c 20 63 69 70 68 65 72 73 29 29 20  (ctx, ciphers)) 
e370: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
e390: 20 63 69 70 68 65 72 73 20 66 61 69 6c 65 64 3a   ciphers failed:
e3a0: 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72   No valid cipher
e3b0: 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  s", (char *) NUL
e3c0: 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65  L);..SSL_CTX_fre
e3d0: 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20  e(ctx);..return 
e3e0: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
e3f0: 69 66 20 28 28 63 69 70 68 65 72 73 75 69 74 65  if ((ciphersuite
e400: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
e410: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
e420: 72 73 75 69 74 65 73 28 63 74 78 2c 20 63 69 70  rsuites(ctx, cip
e430: 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a 09 54  hersuites)) {..T
e440: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e450: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e460: 68 65 72 20 73 75 69 74 65 73 20 66 61 69 6c 65  her suites faile
e470: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
e480: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
e490: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
e4a0: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
e4b0: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  n NULL;.    }.. 
e4c0: 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69     /* Set securi
e4d0: 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20  ty level */.    
e4e0: 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26  if (level > -1 &
e4f0: 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09  & level < 6) {..
e500: 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72  /* SSL_set_secur
e510: 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53  ity_level */..SS
e520: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69  L_CTX_set_securi
e530: 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65  ty_level(ctx, le
e540: 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  vel);.    }..   
e550: 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c   /* set some cal
e560: 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53  lbacks */.    SS
e570: 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c  L_CTX_set_defaul
e580: 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c  t_passwd_cb(ctx,
e590: 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63   PasswordCallbac
e5a0: 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  k);.    SSL_CTX_
e5b0: 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73  set_default_pass
e5c0: 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63  wd_cb_userdata(c
e5d0: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
e5e0: 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72  ePtr);..    /* r
e5f0: 65 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c  ead a Diffie-Hel
e600: 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20  lman parameters 
e610: 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65  file, or use the
e620: 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f   built-in one */
e630: 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f  .#ifdef OPENSSL_
e640: 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44 48  NO_DH.    if (DH
e650: 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20  params != NULL) 
e660: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
e670: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48 20  ult(interp, "DH 
e680: 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f 72  parameter suppor
e690: 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 22  t not available"
e6a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e6b0: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e6c0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e6d0: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  LL;.    }.#else.
e6e0: 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09      {..DH* dh;..
e6f0: 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d 20  if (DHparams != 
e700: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f  NULL) {..    BIO
e710: 20 2a 62 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f   *bio;..    Tcl_
e720: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
e730: 3b 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f  ;..    bio = BIO
e740: 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48  _new_file(F2N(DH
e750: 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72  params, &ds), "r
e760: 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69  ");..    if (!bi
e770: 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69  o) {...Tcl_DStri
e780: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54  ngFree(&ds);...T
e790: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e7a0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
e7b0: 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d  ot find DH param
e7c0: 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68  eters file", (ch
e7d0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
e7e0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e7f0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
e800: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68  ..    }...    dh
e810: 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f   = PEM_read_bio_
e820: 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55  DHparams(bio, NU
e830: 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b  LL, NULL, NULL);
e840: 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62  ..    BIO_free(b
e850: 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  io);..    Tcl_DS
e860: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
e870: 09 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a  .    if (!dh) {.
e880: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e890: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c  lt(interp, "Coul
e8a0: 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61  d not read DH pa
e8b0: 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69  rameters from fi
e8c0: 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  le", (char *) NU
e8d0: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
e8e0: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
e8f0: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
e900: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e910: 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29  _tmp_dh(ctx, dh)
e920: 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64  ;..    DH_free(d
e930: 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  h);...} else {..
e940: 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20      /* Use well 
e950: 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74  known DH paramet
e960: 65 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75  ers that have bu
e970: 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69  ilt-in support i
e980: 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20  n OpenSSL */..  
e990: 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73    if (!SSL_CTX_s
e9a0: 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20  et_dh_auto(ctx, 
e9b0: 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65  1)) {...Tcl_Appe
e9c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e9d0: 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62   "Could not enab
e9e0: 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20  le set DH auto: 
e9f0: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
ea00: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ea10: 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66  LL);...SSL_CTX_f
ea20: 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75  ree(ctx);...retu
ea30: 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
ea40: 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .}.    }.#endif.
ea50: 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20  .    /* set our 
ea60: 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20  certificate */. 
ea70: 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f     load_private_
ea80: 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20  key = 0;.    if 
ea90: 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c  (certfile != NUL
eaa0: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
eab0: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63  te_key = 1;...Tc
eac0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
ead0: 73 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54  s);...if (SSL_CT
eae0: 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74  X_use_certificat
eaf0: 65 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28  e_file(ctx, F2N(
eb00: 63 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20  certfile, &ds), 
eb10: 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d  SSL_FILETYPE_PEM
eb20: 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54  ) <= 0) {..    T
eb30: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
eb40: 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70  ds);..    Tcl_Ap
eb50: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
eb60: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
eb70: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
eb80: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
eb90: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
eba0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
ebb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
ebc0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ebd0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
ebe0: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
ebf0: 65 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55  e if (cert != NU
ec00: 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76  LL) {..load_priv
ec10: 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66  ate_key = 1;..if
ec20: 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65   (SSL_CTX_use_ce
ec30: 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63  rtificate_ASN1(c
ec40: 74 78 2c 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65  tx, cert_len, ce
ec50: 72 74 29 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20  rt) <= 0) {..   
ec60: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
ec70: 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
ec80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ec90: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
eca0: 73 65 74 20 63 65 72 74 69 66 69 63 61 74 65 3a  set certificate:
ecb0: 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45   ",...GET_ERR_RE
ecc0: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
ecd0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c   NULL);..    SSL
ece0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
ecf0: 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c  .    return NULL
ed00: 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
ed10: 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20 28 63  {..certfile = (c
ed20: 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f 64 65  har*)X509_get_de
ed30: 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28  fault_cert_file(
ed40: 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  );...if (SSL_CTX
ed50: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
ed60: 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72 74 66  _file(ctx, certf
ed70: 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ile, SSL_FILETYP
ed80: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23  E_PEM) <= 0) {.#
ed90: 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f 44 53  if 0..    Tcl_DS
eda0: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
edb0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
edc0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
edd0: 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66  nable to use def
ede0: 61 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65  ault certificate
edf0: 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c   file ", certfil
ee00: 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45  e, ": ",...GET_E
ee10: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
ee20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
ee30: 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63    SSL_CTX_free(c
ee40: 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tx);..    return
ee50: 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d   NULL;.#endif..}
ee60: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73  .    }..    /* s
ee70: 65 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b  et our private k
ee80: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f  ey */.    if (lo
ee90: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20  ad_private_key) 
eea0: 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d  {..if (keyfile =
eeb0: 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d  = NULL && key ==
eec0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65   NULL) {..    ke
eed0: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
eee0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69  ;..}...if (keyfi
eef0: 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
ef00: 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72     /* get the pr
ef10: 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69  ivate key associ
ef20: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63  ated with this c
ef30: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20  ertificate */.. 
ef40: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d     if (keyfile =
ef50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66  = NULL) {...keyf
ef60: 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a  ile = certfile;.
ef70: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
ef80: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
ef90: 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78  vateKey_file(ctx
efa0: 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26  , F2N(keyfile, &
efb0: 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50  ds), SSL_FILETYP
efc0: 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09  E_PEM) <= 0) {..
efd0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
efe0: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
eff0: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
f000: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
f010: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
f020: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
f030: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
f040: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
f050: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
f060: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
f070: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
f080: 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65  c key file ", ke
f090: 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20  yfile, " ",...  
f0a0: 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e    GET_ERR_REASON
f0b0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f0c0: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f0d0: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f0e0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f0f0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f100: 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c  ree(&ds);...} el
f110: 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55  se if (key != NU
f120: 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53  LL) {..    if (S
f130: 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61  SL_CTX_use_Priva
f140: 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50  teKey_ASN1(EVP_P
f150: 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65  KEY_RSA, ctx, ke
f160: 79 2c 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29  y,key_len) <= 0)
f170: 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67   {...Tcl_DString
f180: 46 72 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20  Free(&ds);.../* 
f190: 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70 68  flush the passph
f1a0: 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68 74  rase which might
f1b0: 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20   be left in the 
f1c0: 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f  result */...Tcl_
f1d0: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
f1e0: 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54  , NULL, TCL_STAT
f1f0: 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  IC);...Tcl_Appen
f200: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f210: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70  "unable to set p
f220: 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45  ublic key: ", GE
f230: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
f240: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f250: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f260: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f270: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f  LL;..    }..}../
f280: 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68  * Now we know th
f290: 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72  at a key and cer
f2a0: 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74 20  t have been set 
f2b0: 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20  against.. * the 
f2c0: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09  SSL context */..
f2d0: 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65  if (!SSL_CTX_che
f2e0: 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63  ck_private_key(c
f2f0: 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  tx)) {..    Tcl_
f300: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f310: 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65  erp, "private ke
f320: 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  y does not match
f330: 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74 65   the certificate
f340: 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09   public key",...
f350: 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e  .     (char *) N
f360: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
f370: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
f380: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
f390: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
f3a0: 20 53 65 74 20 76 65 72 69 66 69 63 61 74 69 6f   Set verificatio
f3b0: 6e 20 43 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c  n CAs */.    Tcl
f3c0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
f3d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
f3e0: 6e 67 49 6e 69 74 28 26 64 73 31 29 3b 0a 20 20  ngInit(&ds1);.  
f3f0: 20 20 2f 2a 20 54 68 65 72 65 20 69 73 20 6f 6e    /* There is on
f400: 65 20 64 65 66 61 75 6c 74 20 64 69 72 65 63 74  e default direct
f410: 6f 72 79 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74  ory, one default
f420: 20 66 69 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64   file, and one d
f430: 65 66 61 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54  efault store...T
f440: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65  he default CA ce
f450: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63  rtificates direc
f460: 74 6f 72 79 20 28 61 6e 64 20 64 65 66 61 75 6c  tory (and defaul
f470: 74 20 73 74 6f 72 65 29 20 69 73 20 69 6e 20 74  t store) is in t
f480: 68 65 20 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74  he OpenSSL..cert
f490: 73 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20  s directory. It 
f4a0: 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
f4b0: 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
f4c0: 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e 20 54  T_DIR env var. T
f4d0: 68 65 0a 09 64 65 66 61 75 6c 74 20 43 41 20 63  he..default CA c
f4e0: 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65  ertificates file
f4f0: 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e   is called cert.
f500: 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75  pem in the defau
f510: 6c 74 20 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65  lt OpenSSL..dire
f520: 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20 62 65  ctory. It can be
f530: 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
f540: 68 65 20 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45  he SSL_CERT_FILE
f550: 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a   env var. */../*
f560: 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65 74   int SSL_CTX_set
f570: 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79 5f  _default_verify_
f580: 64 69 72 28 53 53 4c 5f 43 54 58 20 2a 63 74 78  dir(SSL_CTX *ctx
f590: 29 20 61 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54  ) and int SSL_CT
f5a0: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65  X_set_default_ve
f5b0: 72 69 66 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54  rify_file(SSL_CT
f5c0: 58 20 2a 63 74 78 29 20 2a 2f 0a 20 20 20 20 69  X *ctx) */.    i
f5d0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
f5e0: 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
f5f0: 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
f600: 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 64  e, &ds), F2N(CAd
f610: 69 72 2c 20 26 64 73 31 29 29 20 7c 7c 0a 09 21  ir, &ds1)) ||..!
f620: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f630: 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68 73  ult_verify_paths
f640: 28 63 74 78 29 29 20 7b 0a 23 69 66 20 30 0a 09  (ctx)) {.#if 0..
f650: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f660: 26 64 73 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69  &ds);..Tcl_DStri
f670: 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 2f  ngFree(&ds1);../
f680: 2a 20 44 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c  * Don't currentl
f690: 79 20 63 61 72 65 20 69 66 20 74 68 69 73 20 66  y care if this f
f6a0: 61 69 6c 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70  ails */..Tcl_App
f6b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f6c0: 2c 20 22 53 53 4c 20 64 65 66 61 75 6c 74 20 76  , "SSL default v
f6d0: 65 72 69 66 79 20 70 61 74 68 73 3a 20 22 2c 20  erify paths: ", 
f6e0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
f6f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
f700: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
f710: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
f720: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  LL;.#endif.    }
f730: 0a 0a 20 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f  ..    /* https:/
f740: 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65 74  /sourceforge.net
f750: 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20  /p/tls/bugs/57/ 
f760: 2a 2f 0a 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f  */.    /* XXX:TO
f770: 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73 65 72  DO: Let the user
f780: 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73 20 68   supply values h
f790: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ere instead of s
f7a0: 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20 65 78  omething that ex
f7b0: 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69 6c 65  ists on the file
f7c0: 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66  system */.    if
f7d0: 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c   (CAfile != NULL
f7e0: 29 20 7b 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35  ) {..STACK_OF(X5
f7f0: 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
f800: 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
f810: 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
f820: 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
f830: 0a 09 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20  ..if (certNames 
f840: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
f850: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
f860: 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
f870: 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20  certNames);..}. 
f880: 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
f890: 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
f8a0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
f8b0: 72 65 65 28 26 64 73 31 29 3b 0a 20 20 20 20 72  ree(&ds1);.    r
f8c0: 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f  eturn ctx;.}.../
f8d0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f910: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74  -------. *. * St
f920: 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  atusObjCmd -- re
f930: 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74 65  turn certificate
f940: 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70   for connected p
f950: 65 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  eer.. *. * Resul
f960: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
f970: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
f980: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
f990: 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
f9f0: 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28  nt.StatusObjCmd(
fa00: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
fa10: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
fa20: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
fa30: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
fa40: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
fa50: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
fa60: 72 3b 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65  r;.    X509 *pee
fa70: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  r;.    Tcl_Obj *
fa80: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f  objPtr;.    Tcl_
fa90: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20  Channel chan;.  
faa0: 20 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e    char *channelN
fab0: 61 6d 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20  ame, *ciphers;. 
fac0: 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
fad0: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
fae0: 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20  char *proto;.   
faf0: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65   unsigned int le
fb00: 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20  n;.    int nid, 
fb10: 72 65 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  res;.    (void) 
fb20: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
fb30: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
fb40: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
fb50: 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20  c < 2 || objc > 
fb60: 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20  3 || (objc == 3 
fb70: 26 26 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47  && !strcmp(Tcl_G
fb80: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
fb90: 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b  ), "-local"))) {
fba0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
fbb0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
fbc0: 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68  jv, "?-local? ch
fbd0: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
fbe0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
fbf0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68  }..    /* Get ch
fc00: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20  annel Id */.    
fc10: 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63  channelName = Tc
fc20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
fc30: 62 6a 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d  bj(objv[(objc ==
fc40: 20 32 20 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54   2 ? 1 : 2)], (T
fc50: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29  cl_Size *) NULL)
fc60: 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ;.    chan = Tcl
fc70: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
fc80: 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  rp, channelName,
fc90: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20   &mode);.    if 
fca0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
fcb0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
fcc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
fcd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
fce0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
fcf0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
fd00: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
fd10: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
fd20: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
fd30: 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
fd40: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
fd50: 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
fd60: 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
fd70: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fd80: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
fd90: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
fda0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
fdb0: 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54  ,..."\": not a T
fdc0: 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c  LS channel", NUL
fdd0: 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  L);..Tcl_SetErro
fde0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
fdf0: 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c 20 22  LS", "STATUS", "
fe00: 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
fe10: 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
fe20: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
fe30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
fe40: 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74    statePtr = (St
fe50: 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  ate *) Tcl_GetCh
fe60: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74  annelInstanceDat
fe70: 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a  a(chan);..    /*
fe80: 20 47 65 74 20 63 65 72 74 69 66 69 63 61 74 65   Get certificate
fe90: 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73 65 6c   for peer or sel
fea0: 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  f */.    if (obj
feb0: 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65 72 20  c == 2) {..peer 
fec0: 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63  = SSL_get_peer_c
fed0: 65 72 74 69 66 69 63 61 74 65 28 73 74 61 74 65  ertificate(state
fee0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
fef0: 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20 3d 20   else {..peer = 
ff00: 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66 69 63  SSL_get_certific
ff10: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
ff20: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  l);.    }.    /*
ff30: 20 47 65 74 20 58 35 30 39 20 63 65 72 74 69 66   Get X509 certif
ff40: 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20  icate info */.  
ff50: 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a 09 6f    if (peer) {..o
ff60: 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58  bjPtr = Tls_NewX
ff70: 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70  509Obj(interp, p
ff80: 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  eer);..if (objc 
ff90: 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
ffa0: 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
ffb0: 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
ffc0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
ffd0: 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
ffe0: 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
fff0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10000 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
10010 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10020 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10030 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
10040 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
10050 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
10060 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10070 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10080 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
10090 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
100a0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
100b0 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
100c0 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
100d0 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
100e0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
100f0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10100 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
10110 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
10120 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
10130 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
10140 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
10150 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
10160 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10170 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10180 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
10190 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
101a0 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
101b0 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
101c0 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
101d0 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
101e0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
101f0 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
10200 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
10210 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10220 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
10230 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
10240 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
10250 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10260 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
10270 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
10280 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
10290 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
102a0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
102b0 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
102c0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
102d0 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
102e0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
102f0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10300 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
10310 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
10320 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
10330 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
10340 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
10350 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
10360 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10370 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10380 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
10390 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
103a0 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
103b0 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
103c0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
103d0 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
103e0 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
103f0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
10400 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
10410 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
10420 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
10430 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
10440 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
10450 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
10460 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
10470 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
10480 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
10490 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
104a0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
104b0 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
104c0 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
104d0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
104e0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
104f0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
10500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
10510 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
10520 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
10530 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
10540 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
10550 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
10560 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
10570 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
10580 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
10590 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
105a0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
105b0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
105c0 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
105d0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
105e0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
105f0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
10600 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
10610 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
10620 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
10630 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
10640 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10650 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10660 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10670 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
10680 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
10690 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
106a0 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
106b0 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
106c0 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
106d0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
106e0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
106f0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10700 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10710 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
10720 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
10730 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
10740 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
10750 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
10760 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
10770 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
10780 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10790 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
107a0 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
107b0 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
107c0 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  ..    if (objc =
107d0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
107e0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
107f0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
10800 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
10810 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
10820 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
10830 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
10840 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
10850 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
10860 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
10870 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
10880 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10890 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
108a0 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
108b0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a  2ln(nid), -1);..
108c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
108d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
108e0 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
108f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
10900 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e  -----. *. * Conn
10950 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10960 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65   -- return conne
10970 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20  ction info from 
10980 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52  OpenSSL.. *. * R
10990 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73  esults:. *.A lis
109a0 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  t of connection 
109b0 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d  info.  *. *-----
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 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10a00 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 43  */..static int C
10a10 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
10a20 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
10a30 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
10a40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
10a50 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
10a60 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
10a70 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65  {.    Tcl_Channe
10a80 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20  l chan;../* The 
10a90 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
10aa0 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20   mode on */.    
10ab0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
10ac0 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74  ../* client stat
10ad0 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
10ae0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
10af0 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74  *objPtr, *listPt
10b00 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  r;.    const SSL
10b10 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74   *ssl;.    const
10b20 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 69 70   SSL_CIPHER *cip
10b30 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  her;.    const S
10b40 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
10b50 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ion;.    const E
10b60 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28  VP_MD *md;.    (
10b70 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
10b80 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
10b90 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
10ba0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10bb0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
10bc0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 28 54  nel");..return(T
10bd0 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
10be0 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  ..    chan = Tcl
10bf0 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65  _GetChannel(inte
10c00 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10c10 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
10c20 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55  , (Tcl_Size *)NU
10c30 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  LL), NULL);.    
10c40 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
10c50 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
10c60 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52  {..return(TCL_ER
10c70 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ROR);.    }..   
10c80 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
10c90 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
10ca0 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
10cb0 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
10cc0 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
10cd0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
10ce0 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
10cf0 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
10d00 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
10d10 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
10d20 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
10d30 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
10d40 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
10d50 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20  han),..    "\": 
10d60 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
10d70 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f  l", NULL);..Tcl_
10d80 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
10d90 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
10da0 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
10db0 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
10dc0 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
10dd0 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
10de0 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f  R);.    }..    o
10df0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
10e00 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
10e10 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  ..    /* Connect
10e20 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
10e30 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
10e40 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
10e50 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
10e60 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20  han);.    ssl = 
10e70 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20  statePtr->ssl;. 
10e80 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
10e90 4c 4c 29 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63  LL) {../* connec
10ea0 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c  tion state */..L
10eb0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10ec0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74  p, objPtr, "stat
10ed0 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74  e", SSL_state_st
10ee0 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20  ring_long(ssl), 
10ef0 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e  -1);.../* Get SN
10f00 49 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76  I requested serv
10f10 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
10f20 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10f30 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e  objPtr, "servern
10f40 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65  ame", SSL_get_se
10f50 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c  rvername(ssl, TL
10f60 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f  SEXT_NAMETYPE_ho
10f70 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a  st_name), -1);..
10f80 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c  ./* Get protocol
10f90 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
10fa0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10fb0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
10fc0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c  _get_version(ssl
10fd0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e  ), -1);.../* Ren
10fe0 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77  egotiation allow
10ff0 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ed */..LAPPEND_B
11000 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
11010 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69  tr, "renegotiati
11020 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c  on_allowed", SSL
11030 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65  _get_secure_rene
11040 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72  gotiation_suppor
11050 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65  t(ssl));.../* Ge
11060 74 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c  t security level
11070 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54   */..LAPPEND_INT
11080 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11090 20 22 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c   "security_level
110a0 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72  ", SSL_get_secur
110b0 69 74 79 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b  ity_level(ssl));
110c0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e  .../* Session in
110d0 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  fo */..LAPPEND_B
110e0 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
110f0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 72 65 75  tr, "session_reu
11100 73 65 64 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f  sed", SSL_sessio
11110 6e 5f 72 65 75 73 65 64 28 73 73 6c 29 29 3b 0a  n_reused(ssl));.
11120 0a 09 2f 2a 20 49 73 20 73 65 72 76 65 72 20 69  ../* Is server i
11130 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  nfo */..LAPPEND_
11140 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
11150 50 74 72 2c 20 22 69 73 5f 73 65 72 76 65 72 22  Ptr, "is_server"
11160 2c 20 53 53 4c 5f 69 73 5f 73 65 72 76 65 72 28  , SSL_is_server(
11170 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44  ssl));.../* Is D
11180 54 4c 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  TLS */..LAPPEND_
11190 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
111a0 50 74 72 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20  Ptr, "is_dtls", 
111b0 53 53 4c 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29  SSL_is_dtls(ssl)
111c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
111d0 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a 2f 0a   Cipher info */.
111e0 20 20 20 20 63 69 70 68 65 72 20 3d 20 53 53 4c      cipher = SSL
111f0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 69 70  _get_current_cip
11200 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  her(ssl);.    if
11210 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55 4c 4c   (cipher != NULL
11220 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b 42 55  ) {..char buf[BU
11230 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09 69 6e  FSIZ] = {0};..in
11240 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69 74 73  t bits, alg_bits
11250 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 6e 61  ;.../* Cipher na
11260 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53  me */..LAPPEND_S
11270 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11280 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53 53 4c  r, "cipher", SSL
11290 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65  _CIPHER_get_name
112a0 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
112b0 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f 66 20  ./* RFC name of 
112c0 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
112d0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
112e0 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61 72 64  bjPtr, "standard
112f0 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49 50 48  _name", SSL_CIPH
11300 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
11310 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a  (cipher), -1);..
11320 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61 6d 65  ./* OpenSSL name
11330 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c   of cipher */..L
11340 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11350 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70 65 6e  p, objPtr, "open
11360 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45 4e 53  ssl_name", OPENS
11370 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65 28 53  SL_cipher_name(S
11380 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61  SL_CIPHER_standa
11390 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 29  rd_name(cipher))
113a0 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75 6d 62  , -1);.../* numb
113b0 65 72 20 6f 66 20 73 65 63 72 65 74 20 62 69 74  er of secret bit
113c0 73 20 75 73 65 64 20 66 6f 72 20 63 69 70 68 65  s used for ciphe
113d0 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53 53 4c  r */..bits = SSL
113e0 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69 74 73  _CIPHER_get_bits
113f0 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f 62 69  (cipher, &alg_bi
11400 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  ts);..LAPPEND_IN
11410 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
11420 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73 22 2c  , "secret_bits",
11430 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44   bits);..LAPPEND
11440 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11450 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68 6d 5f  Ptr, "algorithm_
11460 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74 73 29  bits", alg_bits)
11470 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73 20 69  ;../* alg_bits i
11480 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73 65 63  s actual key sec
11490 72 65 74 20 62 69 74 73 2e 20 49 66 20 75 73 65  ret bits. If use
114a0 20 62 69 74 73 20 61 6e 64 20 73 65 63 72 65 74   bits and secret
114b0 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62 69 74   (algorithm) bit
114c0 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20 74 68  s differ,..   th
114d0 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 62 69  e rest of the bi
114e0 74 73 20 61 72 65 20 66 69 78 65 64 2c 20 69 2e  ts are fixed, i.
114f0 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64 20 65  e. for limited e
11500 78 70 6f 72 74 20 63 69 70 68 65 72 73 20 28 62  xport ciphers (b
11510 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a 09 2f  its < 56) */.../
11520 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68 69 63  * Indicates whic
11530 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74 6f 63  h SSL/TLS protoc
11540 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72 73 74  ol version first
11550 20 64 65 66 69 6e 65 64 20 74 68 65 20 63 69 70   defined the cip
11560 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
11570 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11580 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69 6f 6e  tr, "min_version
11590 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ", SSL_CIPHER_ge
115a0 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68 65 72  t_version(cipher
115b0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43 69 70  ), -1);.../* Cip
115c0 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41 50 50  her NID */..LAPP
115d0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
115e0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 4e  objPtr, "cipherN
115f0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
11600 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
11610 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f 6e 69  ER_get_cipher_ni
11620 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b  d(cipher)), -1);
11630 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11640 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
11650 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68 61 72  igestNID", (char
11660 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
11670 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64 69 67  L_CIPHER_get_dig
11680 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72 29 29  est_nid(cipher))
11690 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
116a0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
116b0 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e 67 65  tr, "keyExchange
116c0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
116d0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
116e0 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64 28 63  HER_get_kx_nid(c
116f0 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c  ipher)), -1);..L
11700 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11710 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75 74 68  p, objPtr, "auth
11720 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22 2c 20  enticationNID", 
11730 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
11740 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
11750 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70 68 65  t_auth_nid(ciphe
11760 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6d  r)), -1);.../* m
11770 65 73 73 61 67 65 20 61 75 74 68 65 6e 74 69 63  essage authentic
11780 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43 69 70  ation code - Cip
11790 68 65 72 20 69 73 20 41 45 41 44 20 28 65 2e 67  her is AEAD (e.g
117a0 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68 61 32  . GCM or ChaCha2
117b0 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72 20 6e  0/Poly1305) or n
117c0 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68 65 6e  ot */../* Authen
117d0 74 69 63 61 74 65 64 20 45 6e 63 72 79 70 74 69  ticated Encrypti
117e0 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69 61 74  on with associat
117f0 65 64 20 64 61 74 61 20 28 41 45 41 44 29 20 63  ed data (AEAD) c
11800 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  heck */..LAPPEND
11810 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11820 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 73  jPtr, "cipher_is
11830 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49 50 48  _aead", SSL_CIPH
11840 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70 68 65  ER_is_aead(ciphe
11850 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65 73 74  r));.../* Digest
11860 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 68 65   used during the
11870 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73 68 61   SSL/TLS handsha
11880 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20 74 68  ke when using th
11890 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09 6d 64  e cipher. */..md
118a0 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
118b0 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65  t_handshake_dige
118c0 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c 41 50  st(cipher);..LAP
118d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
118e0 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64 73 68   objPtr, "handsh
118f0 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28 63 68  ake_digest", (ch
11900 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61 6d 65  ar *)EVP_MD_name
11910 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  (md), -1);.../* 
11920 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70 65 63  Get OpenSSL-spec
11930 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49 41 4e  ific ID, not IAN
11940 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  A ID */..LAPPEND
11950 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11960 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69 64 22  Ptr, "cipher_id"
11970 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48  , (int) SSL_CIPH
11980 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68 65 72  ER_get_id(cipher
11990 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62 79 74  ));.../* Two-byt
119a0 65 20 49 44 20 75 73 65 64 20 69 6e 20 74 68 65  e ID used in the
119b0 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 6f 66   TLS protocol of
119c0 20 74 68 65 20 67 69 76 65 6e 20 63 69 70 68 65   the given ciphe
119d0 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 49 4e  r */..LAPPEND_IN
119e0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
119f0 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64 22 2c  , "protocol_id",
11a00 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50 48 45   (int) SSL_CIPHE
11a10 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c 5f 69  R_get_protocol_i
11a20 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a  d(cipher));.../*
11a30 20 54 65 78 74 75 61 6c 20 64 65 73 63 72 69 70   Textual descrip
11a40 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68  tion of the ciph
11a50 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 43  er */..if (SSL_C
11a60 49 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f  IPHER_descriptio
11a70 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c 20 73  n(cipher, buf, s
11a80 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
11a90 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41 50 50  ULL) {..    LAPP
11aa0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11ab0 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72 69 70  objPtr, "descrip
11ac0 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31 29 3b  tion", buf, -1);
11ad0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
11ae0 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a  * Session info *
11af0 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20 3d 20  /.    session = 
11b00 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
11b10 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 73 65  ssl);.    if (se
11b20 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29 20 7b  ssion != NULL) {
11b30 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
11b40 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b 0a 09   char *ticket;..
11b50 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09 75 6e  size_t len2;..un
11b60 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
11b70 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  ..const unsigned
11b80 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69   char *session_i
11b90 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 63 68 61 72  d, *proto;..char
11ba0 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f   buffer[SSL_MAX_
11bb0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
11bc0 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20  H];.../* Report 
11bd0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
11be0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
11bf0 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65  t of the ALPN ne
11c00 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53  gotiation */..SS
11c10 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61  L_SESSION_get0_a
11c20 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73  lpn_selected(ses
11c30 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  sion, &proto, &l
11c40 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  en2);..LAPPEND_S
11c50 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11c60 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72  r, "alpn", (char
11c70 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
11c80 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
11c90 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c  * Report the sel
11ca0 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61  ected protocol a
11cb0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  s a result of th
11cc0 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f  e NPN negotiatio
11cd0 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f  n */.#ifdef USE_
11ce0 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65  NPN..SSL_get0_ne
11cf0 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61  xt_proto_negotia
11d00 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  ted(ssl, &proto,
11d10 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
11d20 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11d30 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68  jPtr, "npn", (ch
11d40 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
11d50 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23  l_Size) ulen);.#
11d60 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d  endif.../* Resum
11d70 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a  able session */.
11d80 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
11d90 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72  terp, objPtr, "r
11da0 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53  esumable", SSL_S
11db0 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61  ESSION_is_resuma
11dc0 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  ble(session));..
11dd0 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72  ./* Session star
11de0 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20  t time (seconds 
11df0 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a  since epoch) */.
11e00 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
11e10 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11e20 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f  tart_time", SSL_
11e30 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
11e40 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
11e50 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d   Timeout value -
11e60 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d   SSL_CTX_get_tim
11e70 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  eout (in seconds
11e80 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
11e90 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
11ea0 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53  r, "timeout", SS
11eb0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
11ec0 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b  meout(session));
11ed0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64  .../* Session id
11ee0 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62   - TLSv1.2 and b
11ef0 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65  elow only */..se
11f00 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53  ssion_id = SSL_S
11f10 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65  ESSION_get_id(se
11f20 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09  ssion, &ulen);..
11f30 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69  LAPPEND_BARRAY(i
11f40 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11f50 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
11f60 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69  sion_id, (Tcl_Si
11f70 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20  ze) ulen);.../* 
11f80 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20  Session context 
11f90 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d  */..session_id =
11fa0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
11fb0 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73  0_id_context(ses
11fc0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
11fd0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
11fe0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
11ff0 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c  ession_context",
12000 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63   session_id, (Tc
12010 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
12020 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b  ./* Session tick
12030 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79  et - client only
12040 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e   */..SSL_SESSION
12050 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
12060 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
12070 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  len2);..LAPPEND_
12080 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f  BARRAY(interp, o
12090 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f  bjPtr, "session_
120a0 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c  ticket", ticket,
120b0 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
120c0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
120d0 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20  ticket lifetime 
120e0 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73  hint (in seconds
120f0 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f  ) */..LAPPEND_LO
12100 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NG(interp, objPt
12110 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53  r, "lifetime", S
12120 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
12130 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
12140 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  int(session));..
12150 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64  ./* Ticket app d
12160 61 74 61 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53  ata */..SSL_SESS
12170 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 5f  ION_get0_ticket_
12180 61 70 70 64 61 74 61 28 73 65 73 73 69 6f 6e 2c  appdata(session,
12190 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
121a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
121b0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
121c0 2c 20 22 74 69 63 6b 65 74 5f 61 70 70 5f 64 61  , "ticket_app_da
121d0 74 61 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63  ta", ticket, (Tc
121e0 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
121f0 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b  ./* Get master k
12200 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53  ey */..len2 = SS
12210 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61  L_SESSION_get_ma
12220 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e  ster_key(session
12230 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41  , buffer, SSL_MA
12240 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
12250 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  GTH);..LAPPEND_B
12260 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
12270 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65  jPtr, "master_ke
12280 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c  y", buffer, (Tcl
12290 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
122a0 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69  /* Compression i
122b0 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69  d */..unsigned i
122c0 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  nt id = SSL_SESS
122d0 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73  ION_get_compress
122e0 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c  _id(session);..L
122f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12300 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
12310 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20  ression_id", id 
12320 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20  == 1 ? "zlib" : 
12330 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
12340 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72   }..    /* Compr
12350 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20  ession info */. 
12360 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
12370 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56  LL) {.#ifdef HAV
12380 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f  E_SSL_COMPRESSIO
12390 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45  N..const COMP_ME
123a0 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70  THOD *comp, *exp
123b0 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67  n;..comp = SSL_g
123c0 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72  et_current_compr
123d0 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78  ession(ssl);..ex
123e0 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72  pn = SSL_get_cur
123f0 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73  rent_expansion(s
12400 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53  sl);...LAPPEND_S
12410 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
12420 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22  r, "compression"
12430 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d  , comp ? SSL_COM
12440 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29  P_get_name(comp)
12450 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a   : "none", -1);.
12460 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12470 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78  erp, objPtr, "ex
12480 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f  pansion", expn ?
12490 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61   SSL_COMP_get_na
124a0 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65  me(expn) : "none
124b0 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c  ", -1);.#else..L
124c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
124d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70  p, objPtr, "comp
124e0 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22  ression", "none"
124f0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
12500 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12510 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c  tr, "expansion",
12520 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65   "none", -1);.#e
12530 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
12540 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a  /* Server info *
12550 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f  /.    {..long mo
12560 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74  de = SSL_CTX_get
12570 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d  _session_cache_m
12580 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ode(statePtr->ct
12590 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a  x);..char *msg;.
125a0 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c  ..if (mode & SSL
125b0 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29  _SESS_CACHE_OFF)
125c0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f   {..    msg = "o
125d0 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  ff";..} else if 
125e0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
125f0 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b  _CACHE_CLIENT) {
12600 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69  ..    msg = "cli
12610 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ent";..} else if
12620 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
12630 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20  S_CACHE_SERVER) 
12640 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65  {..    msg = "se
12650 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69  rver";..} else i
12660 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12670 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b  SS_CACHE_BOTH) {
12680 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74  ..    msg = "bot
12690 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  h";..} else {.. 
126a0 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77     msg = "unknow
126b0 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  n";..}..LAPPEND_
126c0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
126d0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63  tr, "session_cac
126e0 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d  he_mode", msg, -
126f0 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  1);.    }..    /
12700 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20  * CA List */.   
12710 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72   /* IF not a ser
12720 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c  ver, same as SSL
12730 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69  _get0_peer_CA_li
12740 73 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61  st. If server sa
12750 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65  me as SSL_CTX_ge
12760 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
12770 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20   */.    listPtr 
12780 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
12790 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53  (0, NULL);.    S
127a0 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d  TACK_OF(X509_NAM
127b0 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20  E) *ca_list;.   
127c0 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20   if ((ca_list = 
127d0 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43  SSL_get_client_C
127e0 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20  A_list(ssl)) != 
127f0 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
12800 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66  ffer[BUFSIZ];..f
12810 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
12820 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f   < sk_X509_NAME_
12830 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b  num(ca_list); i+
12840 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e  +) {..    X509_N
12850 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58  AME *name = sk_X
12860 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63  509_NAME_value(c
12870 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20  a_list, i);..   
12880 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58   if (name) {...X
12890 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65  509_NAME_oneline
128a0 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42  (name, buffer, B
128b0 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69  UFSIZ);...Tcl_Li
128c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
128d0 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  nt(interp, listP
128e0 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
128f0 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29  gObj(buffer, -1)
12900 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20  );..    }..}.   
12910 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f   }.    LAPPEND_O
12920 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
12930 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73  r, "caList", lis
12940 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45  tPtr);.    LAPPE
12950 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12960 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f  bjPtr, "caListCo
12970 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41  unt", sk_X509_NA
12980 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29  ME_num(ca_list))
12990 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
129a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
129b0 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
129c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
129d0 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
129e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
129f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a10 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56  --------. *. * V
12a20 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20  ersionObjCmd -- 
12a30 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73  return version s
12a40 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53  tring from OpenS
12a50 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
12a60 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
12a70 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
12a80 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12a90 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ae0 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
12af0 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28  t.VersionObjCmd(
12b00 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
12b10 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
12b20 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
12b30 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
12b40 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
12b50 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
12b60 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  r;.    (void) cl
12b70 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76  ientData;.    (v
12b80 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28  oid) objc;.    (
12b90 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20  void) objv;..   
12ba0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
12bb0 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20  ");..    objPtr 
12bc0 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
12bd0 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  bj(OPENSSL_VERSI
12be0 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20  ON_TEXT, -1);.  
12bf0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
12c00 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
12c10 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
12c20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
12c30 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c70 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f  ----. *. * MiscO
12c80 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f  bjCmd -- misc co
12c90 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73  mmands. *. * Res
12ca0 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
12cb0 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
12cc0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
12cd0 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.None.. *.
12ce0 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d20 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
12d30 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28   int.MiscObjCmd(
12d40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
12d50 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
12d60 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
12d70 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
12d80 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
12d90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
12da0 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d  har *commands []
12db0 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72   = { "req", "str
12dc0 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20  req", NULL };.  
12dd0 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b    enum command {
12de0 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51   C_REQ, C_STRREQ
12df0 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20  , C_DUMMY };.   
12e00 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20   Tcl_Size cmd;. 
12e10 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20     int isStr;.  
12e20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36    char buffer[16
12e30 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29  384];.    (void)
12e40 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
12e50 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
12e60 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
12e70 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57  jc < 2) {..Tcl_W
12e80 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
12e90 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75  rp, 1, objv, "su
12ea0 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22  bcommand ?args?"
12eb0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
12ec0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
12ed0 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
12ee0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
12ef0 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64  objv[1], command
12f00 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c  s, "command", 0,
12f10 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b   &cmd) != TCL_OK
12f20 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
12f30 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
12f40 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
12f50 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20  r();..    isStr 
12f60 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52  = (cmd == C_STRR
12f70 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20  EQ);.    switch 
12f80 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20  ((enum command) 
12f90 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52  cmd) {..case C_R
12fa0 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52  EQ:..case C_STRR
12fb0 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50  EQ: {..    EVP_P
12fc0 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a  KEY *pkey=NULL;.
12fd0 09 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d  .    X509 *cert=
12fe0 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f  NULL;..    X509_
12ff0 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b  NAME *name=NULL;
13000 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a  ..    Tcl_Obj **
13010 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f  listv;..    Tcl_
13020 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20  Size listc;..   
13030 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49   int i;...    BI
13040 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20  O *out=NULL;... 
13050 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c     char *k_C="",
13060 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22  *k_ST="",*k_L=""
13070 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22  ,*k_O="",*k_OU="
13080 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d  ",*k_CN="",*k_Em
13090 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61  ail="";..    cha
130a0 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75  r *keyout,*pemou
130b0 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74  t,*str;..    int
130c0 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d   keysize,serial=
130d0 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66  0,days=365;..#if
130e0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
130f0 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
13100 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55  0000L..    BIGNU
13110 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09  M *bne = NULL;..
13120 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e      RSA *rsa = N
13130 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ULL;.#else..    
13140 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74  EVP_PKEY_CTX *ct
13150 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66  x = NULL;.#endif
13160 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63  ...    if ((objc
13170 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29  <5) || (objc>6))
13180 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75   {...Tcl_WrongNu
13190 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
131a0 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20   objv, "keysize 
131b0 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65  keyfile certfile
131c0 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74   ?info?");...ret
131d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
131e0 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
131f0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13200 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
13210 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20  ], &keysize) != 
13220 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75  TCL_OK) {...retu
13230 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
13240 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74     }..    keyout
13250 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  =Tcl_GetString(o
13260 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65  bjv[3]);..    pe
13270 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69  mout=Tcl_GetStri
13280 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20  ng(objv[4]);..  
13290 20 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09    if (isStr) {..
132a0 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
132b0 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b  rp,keyout,"",0);
132c0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
132d0 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30  terp,pemout,"",0
132e0 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
132f0 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09  if (objc>=6) {..
13300 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a  .if (Tcl_ListObj
13310 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
13320 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69  rp, objv[5], &li
13330 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20  stc, &listv) != 
13340 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20  TCL_OK) {...    
13350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13360 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69  ;...}....if ((li
13370 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09  stc%2) != 0) {..
13380 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
13390 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72  lt(interp,"Infor
133a0 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74  mation list must
133b0 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65   have even numbe
133c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c  r of arguments",
133d0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74  NULL);...    ret
133e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
133f0 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69  .}...for (i=0; i
13400 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a  <listc; i+=2) {.
13410 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65  ..    str=Tcl_Ge
13420 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d  tString(listv[i]
13430 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72  );...    if (str
13440 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d  cmp(str,"days")=
13450 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
13460 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13470 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13480 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29  ,&days)!=TCL_OK)
13490 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
134a0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
134b0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
134c0 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d  p(str,"serial")=
134d0 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c  =0) {....if (Tcl
134e0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
134f0 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d  nterp,listv[i+1]
13500 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f  ,&serial)!=TCL_O
13510 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
13520 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
13530 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
13540 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29  cmp(str,"C")==0)
13550 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65   {....k_C=Tcl_Ge
13560 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13570 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13580 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13590 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09  ,"ST")==0) {....
135a0 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69  k_ST=Tcl_GetStri
135b0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
135c0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
135d0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29  (strcmp(str,"L")
135e0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63  ==0) {....k_L=Tc
135f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13600 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13610 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13620 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a  (str,"O")==0) {.
13630 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74  ...k_O=Tcl_GetSt
13640 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
13650 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
13660 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f  f (strcmp(str,"O
13670 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f  U")==0) {....k_O
13680 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  U=Tcl_GetString(
13690 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
136a0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
136b0 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d  rcmp(str,"CN")==
136c0 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c  0) {....k_CN=Tcl
136d0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
136e0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
136f0 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13700 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29  str,"Email")==0)
13710 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63   {....k_Email=Tc
13720 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74  l_GetString(list
13730 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d  v[i+1]);...    }
13740 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53   else {....Tcl_S
13750 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
13760 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74  "Unknown paramet
13770 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65  er",NULL);....re
13780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13790 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20  ..    }...}..   
137a0 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
137b0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
137c0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20   0x30000000L..  
137d0 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29    bne = BN_new()
137e0 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41  ;..    rsa = RSA
137f0 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65  _new();..    pke
13800 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77  y = EVP_PKEY_new
13810 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65  ();..    if (bne
13820 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20   == NULL || rsa 
13830 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20  == NULL || pkey 
13840 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73  == NULL || !BN_s
13850 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f  et_word(bne,RSA_
13860 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65  F4) ||...!RSA_ge
13870 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73  nerate_key_ex(rs
13880 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c  a, keysize, bne,
13890 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50   NULL) || !EVP_P
138a0 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70  KEY_assign_RSA(p
138b0 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45  key, rsa)) {...E
138c0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
138d0 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65  y);.../* RSA_fre
138e0 65 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79  e(rsa); freed by
138f0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a   EVP_PKEY_free *
13900 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29  /...BN_free(bne)
13910 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65  ;.#else..    pke
13920 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28  y = EVP_RSA_gen(
13930 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b  (unsigned int) k
13940 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74  eysize);..    ct
13950 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58  x = EVP_PKEY_CTX
13960 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b  _new(pkey,NULL);
13970 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d  ..    if (pkey =
13980 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d  = NULL || ctx ==
13990 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b   NULL || !EVP_PK
139a0 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63  EY_keygen_init(c
139b0 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b  tx) ||...!EVP_PK
139c0 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b  EY_CTX_set_rsa_k
139d0 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20  eygen_bits(ctx, 
139e0 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50  keysize) || !EVP
139f0 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78  _PKEY_keygen(ctx
13a00 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56  , &pkey)) {...EV
13a10 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
13a20 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54  );...EVP_PKEY_CT
13a30 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e  X_free(ctx);.#en
13a40 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73  dif...Tcl_SetRes
13a50 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
13a60 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69  r generating pri
13a70 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b  vate key",NULL);
13a80 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ...return TCL_ER
13a90 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  ROR;..    } else
13aa0 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20   {...if (isStr) 
13ab0 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
13ac0 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
13ad0 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13ae0 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
13af0 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
13b00 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
13b10 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
13b20 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
13b30 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
13b40 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
13b50 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
13b60 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
13b70 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
13b80 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66  nterp,keyout,buf
13b90 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
13ba0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
13bb0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
13bc0 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
13bd0 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
13be0 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
13bf0 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
13c00 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f  ilename(out,keyo
13c10 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
13c20 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65  rite_bio_Private
13c30 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c  Key(out,pkey,NUL
13c40 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55  L,NULL,0,NULL,NU
13c50 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45  LL);...    /* PE
13c60 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50  M_write_bio_RSAP
13c70 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72  rivateKey(out, r
13c80 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20  sa, NULL, NULL, 
13c90 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20  0, NULL, NULL); 
13ca0 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65  */...    BIO_fre
13cb0 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d  e_all(out);.. .}
13cc0 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35  ....if ((cert=X5
13cd0 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29  09_new())==NULL)
13ce0 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74   {...    Tcl_Set
13cf0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45  Result(interp,"E
13d00 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20  rror generating 
13d10 63 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75  certificate requ
13d20 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20  est",NULL);...  
13d30 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
13d40 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
13d50 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
13d60 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
13d70 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
13d80 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
13d90 20 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f   return(TCL_ERRO
13da0 52 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f  R);...}....X509_
13db0 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74  set_version(cert
13dc0 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45  ,2);...ASN1_INTE
13dd0 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74  GER_set(X509_get
13de0 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65  _serialNumber(ce
13df0 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58  rt),serial);...X
13e00 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
13e10 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f  509_getm_notBefo
13e20 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58  re(cert),0);...X
13e30 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58  509_gmtime_adj(X
13e40 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65  509_getm_notAfte
13e50 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30  r(cert),(long)60
13e60 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09  *60*24*days);...
13e70 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28  X509_set_pubkey(
13e80 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e  cert,pkey);....n
13e90 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62  ame=X509_get_sub
13ea0 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b  ject_name(cert);
13eb0 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64  ....X509_NAME_ad
13ec0 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e  d_entry_by_txt(n
13ed0 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e  ame,"C", MBSTRIN
13ee0 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
13ef0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
13f00 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  _C, -1, -1, 0);.
13f10 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13f20 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13f30 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47  e,"ST", MBSTRING
13f40 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
13f50 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
13f60 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  ST, -1, -1, 0);.
13f70 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13f80 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13f90 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"L", MBSTRING_
13fa0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
13fb0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c  gned char *) k_L
13fc0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13fd0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13fe0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13ff0 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "O", MBSTRING_AS
14000 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14010 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20  ed char *) k_O, 
14020 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14030 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14040 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
14050 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  U", MBSTRING_ASC
14060 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14070 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20  d char *) k_OU, 
14080 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14090 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
140a0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
140b0 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  N", MBSTRING_ASC
140c0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
140d0 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20  d char *) k_CN, 
140e0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
140f0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14100 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45  y_by_txt(name,"E
14110 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f  mail", MBSTRING_
14120 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
14130 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45  gned char *) k_E
14140 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29  mail, -1, -1, 0)
14150 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75  ;....X509_set_su
14160 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c  bject_name(cert,
14170 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58  name);....if (!X
14180 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b  509_sign(cert,pk
14190 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29  ey,EVP_sha256())
141a0 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66  ) {...    X509_f
141b0 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20  ree(cert);...   
141c0 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
141d0 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
141e0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
141f0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14200 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
14210 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
14220 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14230 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e  terp,"Error sign
14240 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65 22  ing certificate"
14250 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65  ,NULL);...    re
14260 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14270 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72  ..}....if (isStr
14280 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
14290 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
142a0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
142b0 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74  ite_bio_X509(out
142c0 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d  ,cert);...    i=
142d0 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66  BIO_read(out,buf
142e0 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65  fer,sizeof(buffe
142f0 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28  r)-1);...    i=(
14300 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09  i<0) ? 0 : i;...
14310 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c      buffer[i]='\
14320 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  0';...    Tcl_Se
14330 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f  tVar(interp,pemo
14340 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09  ut,buffer,0);...
14350 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75      BIO_flush(ou
14360 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72  t);...    BIO_fr
14370 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73  ee(out);...} els
14380 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  e {...    out=BI
14390 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65  O_new(BIO_s_file
143a0 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77  ());...    BIO_w
143b0 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75  rite_filename(ou
143c0 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20  t,pemout);...   
143d0 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58   PEM_write_bio_X
143e0 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09  509(out,cert);..
143f0 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c  .    BIO_free_al
14400 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58  l(out);...}....X
14410 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a  509_free(cert);.
14420 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28  ..EVP_PKEY_free(
14430 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
14440 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
14450 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
14460 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
14470 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d  #endif..    }..}
14480 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66  ..break;.    def
14490 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20  ault:..break;.  
144a0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54    }.    return T
144b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a  CL_OK;.}.../****
144c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
144d0 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20  /./* Init       
144e0 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a        */./******
144f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14500 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
14530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14540 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
14550 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20  Tls_Free --. *. 
14560 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
14570 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
14580 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
14590 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
145a0 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
145b0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
145c0 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a  falls below 1. *
145d0 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
145e0 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  none. *. * Side 
145f0 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65  effects:. *.Free
14600 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a  s all the state.
14610 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14650 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69  --------. */.voi
14660 64 0a 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20  d.Tls_Free(char 
14670 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20  *blockPtr) {.   
14680 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
14690 20 3d 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63   = (State *)bloc
146a0 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e  kPtr;..    dprin
146b0 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
146c0 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61     Tls_Clean(sta
146d0 74 65 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72  tePtr);.    ckfr
146e0 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a  ee(blockPtr);.}.
146f0 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d  ----------------
14720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
14740 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a   Tls_Clean --. *
14750 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
14760 72 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65  re cleans up whe
14770 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62  n a SSL socket b
14780 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09  ased channel. *.
14790 69 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74  is closed and it
147a0 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  s reference coun
147b0 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e  t falls below 1.
147c0 20 20 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a    This should. *
147d0 09 62 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68  .be called synch
147e0 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20  ronously by the 
147f0 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69  CloseProc, not i
14800 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61  n the. *.Eventua
14810 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b  llyFree callback
14820 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
14830 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53  . *.none. *. * S
14840 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
14850 46 72 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74  Frees all the st
14860 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ate. *. *-------
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 2d 2d 2d 2d  ----------------
14890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
148a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
148b0 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28  .void Tls_Clean(
148c0 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29  State *statePtr)
148d0 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
148e0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f  Called");..    /
148f0 2a 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61  *.     * we're a
14900 73 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61  ssuming here tha
14910 74 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74  t we're single-t
14920 68 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a  hreaded.     */.
14930 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14940 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f  ->timer != (Tcl_
14950 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c  TimerToken) NULL
14960 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54  ) {..Tcl_DeleteT
14970 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74  imerHandler(stat
14980 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73  ePtr->timer);..s
14990 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d  tatePtr->timer =
149a0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
149b0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
149c0 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65  protos) {..ckfre
149d0 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  e(statePtr->prot
149e0 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  os);..statePtr->
149f0 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20  protos = NULL;. 
14a00 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61     }.    if (sta
14a10 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
14a20 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
14a30 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
14a40 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
14a50 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
14a60 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
14a70 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
14a80 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
14a90 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
14aa0 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
14ab0 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
14ac0 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09  atePtr->ssl) {..
14ad0 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65  dprintf("SSL_fre
14ae0 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  e(%p)", statePtr
14af0 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65  ->ssl);..SSL_fre
14b00 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
14b10 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ;..statePtr->ssl
14b20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14b30 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14b40 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
14b50 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
14b60 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
14b70 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
14b80 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14b90 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
14ba0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
14bb0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
14bc0 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
14bd0 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
14be0 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
14bf0 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
14c00 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
14c10 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
14c20 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
14c30 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
14c40 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
14c50 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14c60 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
14c70 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
14c80 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
14c90 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
14ca0 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
14cb0 20 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e   dprintf("Return
14cc0 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54  ing");.}...#if T
14cd0 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
14ce0 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e   > 8.#define MIN
14cf0 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23  _VERSION "9.0".#
14d00 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e  else.#define MIN
14d10 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23  _VERSION "8.5".#
14d20 65 6e 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  endif../*. *----
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 2d  ----------------
14d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14d70 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
14d80 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
14d90 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
14da0 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
14db0 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
14dc0 6c 65 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68  led. *.by Tcl wh
14dd0 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
14de0 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
14df0 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
14e00 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
14e10 20 20 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64    Ssl configured
14e20 20 61 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20   and loaded. *. 
14e30 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
14e40 20 2a 09 20 63 72 65 61 74 65 20 74 68 65 20 73   *. create the s
14e50 73 6c 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74  sl command, init
14e60 69 61 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65  ialize ssl conte
14e70 78 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  xt. *. *--------
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 2d 2d 2d 2d 2d  ----------------
14ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
14ec0 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c  DLLEXPORT int Tl
14ed0 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  s_Init(Tcl_Inter
14ee0 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p *interp) {.   
14ef0 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54   const char tlsT
14f00 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d  clInitScript[] =
14f10 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73   {.#include "tls
14f20 2e 74 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20  .tcl.h"..0x00.  
14f30 20 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74    };..    dprint
14f40 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69  f("Called");..#i
14f50 66 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55  fdef USE_TCL_STU
14f60 42 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49  BS.    if (Tcl_I
14f70 6e 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c  nitStubs(interp,
14f80 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29   MIN_VERSION, 0)
14f90 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74   == NULL) {..ret
14fa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14fb0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
14fc0 69 66 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69  if (Tcl_PkgRequi
14fd0 72 65 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22  re(interp, "Tcl"
14fe0 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30  , MIN_VERSION, 0
14ff0 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  ) == NULL) {..re
15000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15010 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54      }..    if (T
15020 6c 73 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20  lsLibInit(0) != 
15030 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41  TCL_OK) {..Tcl_A
15040 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
15050 72 70 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69  rp, "could not i
15060 6e 69 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69  nitialize SSL li
15070 62 72 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29  brary", (char *)
15080 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
15090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
150a0 0a 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ..    Tcl_Create
150b0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
150c0 70 2c 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  p, "tls::ciphers
150d0 22 2c 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64  ", CiphersObjCmd
150e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
150f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
15100 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
15110 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
15120 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
15130 70 2c 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74  p, "tls::connect
15140 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e  ion", Connection
15150 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  InfoObjCmd, (Cli
15160 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15170 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15180 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15190 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
151a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
151b0 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48  s::handshake", H
151c0 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20  andshakeObjCmd, 
151d0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
151e0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
151f0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
15200 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15210 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15220 20 22 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20   "tls::import", 
15230 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  ImportObjCmd, (C
15240 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15250 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15260 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15270 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15280 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15290 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20  tls::unimport", 
152a0 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20  UnimportObjCmd, 
152b0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
152c0 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
152d0 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
152e0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
152f0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15300 20 22 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20   "tls::status", 
15310 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43  StatusObjCmd, (C
15320 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15330 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15340 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15350 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15360 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15370 74 6c 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56  tls::version", V
15380 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43  ersionObjCmd, (C
15390 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
153a0 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
153b0 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
153c0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
153d0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
153e0 74 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63  tls::misc", Misc
153f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
15400 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
15410 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
15420 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
15430 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
15440 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70  (interp, "tls::p
15450 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f  rotocols", Proto
15460 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  colsObjCmd, (Cli
15470 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15480 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15490 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20  c *) NULL);..   
154a0 20 69 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09   if (interp) {..
154b0 54 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c  Tcl_Eval(interp,
154c0 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70   tlsTclInitScrip
154d0 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  t);.    }..    r
154e0 65 74 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f  eturn Tcl_PkgPro
154f0 76 69 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43  vide(interp, PAC
15500 4b 41 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41  KAGE_NAME, PACKA
15510 47 45 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a  GE_VERSION);.}..
15520 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15560 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20   *.Tls_SafeInit 
15570 2d 2d 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  --. *. *.-------
15580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74  ---------*. *.St
155b0 61 6e 64 61 72 64 20 70 72 6f 63 65 64 75 72 65  andard procedure
155c0 20 72 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f   required by 'lo
155d0 61 64 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69  ad'.. *.Initiali
155e0 7a 65 73 20 74 68 69 73 20 65 78 74 65 6e 73 69  zes this extensi
155f0 6f 6e 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e  on for a safe in
15600 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d  terpreter.. *.--
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15640 20 2a 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63   *. *.Side effec
15650 74 73 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54  ts:. *..As of 'T
15660 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52  ls_Init'. *. *.R
15670 65 73 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61  esult:. *..A sta
15680 6e 64 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20  ndard Tcl error 
15690 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  code.. *. *-----
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156d0 2d 2a 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54  -*. */.DLLEXPORT
156e0 20 69 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69   int Tls_SafeIni
156f0 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
15700 74 65 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69  terp) {.    dpri
15710 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20  ntf("Called");. 
15720 20 20 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e     return(Tls_In
15730 69 74 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a  it(interp));.}..
15740 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15780 20 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d   *.TlsLibInit --
15790 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
157a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157c0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74  -------*. *.Init
157d0 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
157e0 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70  ary once per app
157f0 6c 69 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d  lication. *.----
15800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
15830 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
15840 3a 0a 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65  :. *..initialize
15850 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a  s SSL library. *
15860 0a 20 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09  . *.Result:. *..
15870 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  none. *. *------
15880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  *. */.static int
158c0 20 54 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20   TlsLibInit(int 
158d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a  uninitialize) {.
158e0 20 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69      static int i
158f0 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a  nitialized = 0;.
15900 20 20 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d      int status =
15910 20 54 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66   TCL_OK;.#if def
15920 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
15930 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
15940 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20  (TCL_THREADS).  
15950 20 20 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63    size_t num_loc
15960 6b 73 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  ks;.#endif..    
15970 69 66 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65  if (uninitialize
15980 29 20 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61  ) {..if (!initia
15990 6c 69 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70  lized) {..    dp
159a0 72 69 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20  rintf("Asked to 
159b0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75  uninitialize, bu
159c0 74 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69  t we are not ini
159d0 74 69 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20  tialized");...  
159e0 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
159f0 3b 0a 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22  ;..}...dprintf("
15a00 41 73 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69  Asked to uniniti
15a10 61 6c 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65  alize");..#if de
15a20 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
15a30 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
15a40 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
15a50 54 63 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69  Tcl_MutexLock(&i
15a60 6e 69 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c  nit_mx);...if (l
15a70 6f 63 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65  ocks) {..    fre
15a80 65 28 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c  e(locks);..    l
15a90 6f 63 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  ocks = NULL;..  
15aa0 20 20 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30    locksCount = 0
15ab0 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69  ;..}.#endif..ini
15ac0 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23  tialized = 0;..#
15ad0 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15ae0 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15af0 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15b00 44 53 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e  DS)..Tcl_MutexUn
15b10 6c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a  lock(&init_mx);.
15b20 23 65 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28  #endif...return(
15b30 54 43 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a  TCL_OK);.    }..
15b40 20 20 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69      if (initiali
15b50 7a 65 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28  zed) {..dprintf(
15b60 22 43 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69  "Called, but usi
15b70 6e 67 20 63 61 63 68 65 64 20 76 61 6c 75 65 22  ng cached value"
15b80 29 3b 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75  );..return(statu
15b90 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  s);.    }..    d
15ba0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
15bb0 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f  ;..#if defined(O
15bc0 50 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20  PENSSL_THREADS) 
15bd0 26 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54  && defined(TCL_T
15be0 48 52 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f  HREADS).    Tcl_
15bf0 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f  MutexLock(&init_
15c00 6d 78 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  mx);.#endif.    
15c10 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
15c20 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50  ..#if defined(OP
15c30 45 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26  ENSSL_THREADS) &
15c40 26 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48  & defined(TCL_TH
15c50 52 45 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c  READS).    num_l
15c60 6f 63 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  ocks = 1;.    lo
15c70 63 6b 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29  cksCount = (int)
15c80 20 6e 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20   num_locks;.    
15c90 6c 6f 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73  locks = malloc(s
15ca0 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
15cb0 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20  num_locks);.    
15cc0 6d 65 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c  memset(locks, 0,
15cd0 20 73 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20   sizeof(*locks) 
15ce0 2a 20 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65  * num_locks);.#e
15cf0 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69  ndif..    /* Ini
15d00 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62  tialize BOTH lib
15d10 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73  crypto and libss
15d20 6c 2e 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53  l. */.    OPENSS
15d30 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53  L_init_ssl(OPENS
15d40 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c  SL_INIT_LOAD_SSL
15d50 5f 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53  _STRINGS | OPENS
15d60 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59  SL_INIT_LOAD_CRY
15d70 50 54 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f  PTO_STRINGS..| O
15d80 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
15d90 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
15da0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
15db0 4c 4c 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c  LL_DIGESTS, NULL
15dc0 29 3b 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f  );..    BIO_new_
15dd0 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23  tcl(NULL, 0);..#
15de0 69 66 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20  if 0.    /*.    
15df0 20 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d   * XXX:TODO: Rem
15e00 6f 76 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e  ove this code an
15e10 64 20 72 65 70 6c 61 63 65 20 69 74 20 77 69 74  d replace it wit
15e20 68 20 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a  h a check.     *
15e30 20 66 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72   for enough entr
15e40 6f 70 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  opy and do not t
15e50 72 79 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72  ry to create our
15e60 20 6f 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72   own.     * terr
15e70 69 62 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20  ible entropy.   
15e80 20 20 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20    */.    /*.    
15e90 20 2a 20 53 65 65 64 20 74 68 65 20 72 61 6e 64   * Seed the rand
15ea0 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61  om number genera
15eb0 74 6f 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c  tor in the SSL l
15ec0 69 62 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75  ibrary,.     * u
15ed0 73 69 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c  sing the do/whil
15ee0 65 20 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61  e construct beca
15ef0 75 73 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e  use of the bug n
15f00 6f 74 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ote in the.     
15f10 2a 20 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74  * OpenSSL FAQ at
15f20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e   http://www.open
15f30 73 73 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f  ssl.org/support/
15f40 66 61 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20  faq.html#USER1. 
15f50 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
15f60 20 63 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f   crux of the pro
15f70 62 6c 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c  blem is that Sol
15f80 61 72 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20  aris 7 does not 
15f90 68 61 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64  have a.     * /d
15fa0 65 76 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65  ev/random or /de
15fb0 76 2f 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65  v/urandom device
15fc0 20 73 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61   so it cannot ga
15fd0 74 68 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20  ther enough.    
15fe0 20 2a 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20   * entropy from 
15ff0 74 68 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20  the RAND_seed() 
16000 77 68 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c  when TLS initial
16010 69 7a 65 73 20 61 6e 64 20 72 65 66 75 73 65 73  izes and refuses
16020 0a 20 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75  .     * to go fu
16030 72 74 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76  rther. Earlier v
16040 65 72 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53  ersions of OpenS
16050 53 4c 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65  SL carried on re
16060 67 61 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a  gardless..     *
16070 2f 0a 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73  /.    srand((uns
16080 69 67 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28  igned int) time(
16090 28 74 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29  (time_t *) NULL)
160a0 29 3b 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72  );.    do {..for
160b0 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b   (i = 0; i < 16;
160c0 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64   i++) {..    rnd
160d0 5f 73 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28  _seed[i] = 1 + (
160e0 63 68 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72  char) (255.0 * r
160f0 61 6e 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b  and()/(RAND_MAX+
16100 31 2e 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f  1.0));..}..RAND_
16110 73 65 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73  seed(rnd_seed, s
16120 69 7a 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29  izeof(rnd_seed))
16130 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52  ;.    } while (R
16140 41 4e 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20  AND_status() != 
16150 31 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  1);.#endif..#if 
16160 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
16170 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
16180 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
16190 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
161a0 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
161b0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28  dif..    return(
161c0 73 74 61 74 75 73 29 3b 0a 7d 0a                 status);.}.