Hex Artifact Content

Artifact 675528fb5bd1327f43c367c2d211c9ecaecad09fafabc610a8c2823bba8bbb5f:


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 23 69 66 20 4f 50 45  ..break;.#if OPE
1d90: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
1da0: 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
1db0: 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c 53 31  L.    case DTLS1
1dc0: 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a 0a 09  _RT_HEARTBEAT:..
1dd0: 74 79 70 65 20 3d 20 22 48 65 61 72 74 62 65 61  type = "Heartbea
1de0: 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  t";..break;.#end
1df0: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
1e00: 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f 77 6e  .type = "unknown
1e10: 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  ";.    }..    /*
1e20: 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65 20 74   Needs compile t
1e30: 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e 61 62  ime option "enab
1e40: 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e 20 2a  le-ssl-trace". *
1e50: 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f 20 3d  /.    if ((bio =
1e60: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d   BIO_new(BIO_s_m
1e70: 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c 29 20  em())) != NULL) 
1e80: 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c 5f 74  {..int n;..SSL_t
1e90: 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20 76 65  race(write_p, ve
1ea0: 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74 5f 74  rsion, content_t
1eb0: 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c 20 73  ype, buf, len, s
1ec0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69 6f 29  sl, (void *)bio)
1ed0: 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61 64 28  ;..n = BIO_read(
1ee0: 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42 49 4f  bio, buffer, BIO
1ef0: 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20 3c 20  _pending(bio) < 
1f00: 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65 6e 64  15000 ? BIO_pend
1f10: 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39 39 39  ing(bio) : 14999
1f20: 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20 3f 20  );..n = (n<0) ? 
1f30: 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72 5b 6e  0 : n;..buffer[n
1f40: 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29 42 49  ] = 0;..(void)BI
1f50: 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a 09 42  O_flush(bio);..B
1f60: 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a 20 20  IO_free(bio);.  
1f70: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
1f80: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
1f90: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
1fa0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
1fb0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  bj(statePtr->cal
1fc0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f  lback);.    Tcl_
1fd0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1fe0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1ff0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
2000: 6e 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c  ngObj("message",
2010: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2020: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2030: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2040: 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77  tr,..    Tcl_New
2050: 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65  StringObj(Tcl_Ge
2060: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
2070: 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31  tePtr->self), -1
2080: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2090: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
20a0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
20b0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
20c0: 6a 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e  j(write_p ? "Sen
20d0: 74 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c  t" : "Received",
20e0: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
20f0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2100: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2110: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
2120: 67 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a  gObj(ver, -1));.
2130: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2140: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2150: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2160: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79  _NewStringObj(ty
2170: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  pe, -1));.    Tc
2180: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2190: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
21a0: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
21b0: 72 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20  ringObj(buffer, 
21c0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
21d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
21e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
21f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
2200: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
2210: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
2220: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
2230: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2240: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d  Count(cmdPtr);.}
2250: 0a 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d  .#endif.../*. *-
2260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
22a0: 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43  --. *. * VerifyC
22b0: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
22c0: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65  .Monitors SSL ce
22d0: 72 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61  rtificate valida
22e0: 74 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73  tion process. Us
22f0: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
2300: 65 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68  e. *.behavior wh
2310: 65 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46  en the SSL_VERIF
2320: 59 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73  Y_PEER flag is s
2330: 65 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  et. This is call
2340: 65 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61  ed. *.whenever a
2350: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20   certificate is 
2360: 69 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63  inspected or dec
2370: 69 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61  ided invalid. Ca
2380: 6c 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68  lled for. *.each
2390: 20 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20   certificate in 
23a0: 74 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a  the cert chain..
23b0: 20 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a   *. * Checks:. *
23c0: 09 63 65 72 74 69 66 69 63 61 74 65 20 63 68 61  .certificate cha
23d0: 69 6e 20 69 73 20 63 68 65 63 6b 65 64 20 73 74  in is checked st
23e0: 61 72 74 69 6e 67 20 77 69 74 68 20 74 68 65 20  arting with the 
23f0: 64 65 65 70 65 73 74 20 6e 65 73 74 69 6e 67 20  deepest nesting 
2400: 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74 68 65 20  level. *.  (the 
2410: 72 6f 6f 74 20 43 41 20 63 65 72 74 69 66 69 63  root CA certific
2420: 61 74 65 29 20 61 6e 64 20 77 6f 72 6b 65 64 20  ate) and worked 
2430: 75 70 77 61 72 64 20 74 6f 20 74 68 65 20 70 65  upward to the pe
2440: 65 72 27 73 20 63 65 72 74 69 66 69 63 61 74 65  er's certificate
2450: 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e 61 74 75  .. *.All signatu
2460: 72 65 73 20 61 72 65 20 76 61 6c 69 64 2c 20 63  res are valid, c
2470: 75 72 72 65 6e 74 20 74 69 6d 65 20 69 73 20 77  urrent time is w
2480: 69 74 68 69 6e 20 66 69 72 73 74 20 61 6e 64 20  ithin first and 
2490: 6c 61 73 74 20 76 61 6c 69 64 69 74 79 20 74 69  last validity ti
24a0: 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 61  me.. *.Check tha
24b0: 74 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  t the certificat
24c0: 65 20 69 73 20 69 73 73 75 65 64 20 62 79 20 74  e is issued by t
24d0: 68 65 20 69 73 73 75 65 72 20 63 65 72 74 69 66  he issuer certif
24e0: 69 63 61 74 65 20 69 73 73 75 65 72 2e 0a 20 2a  icate issuer.. *
24f0: 09 43 68 65 63 6b 20 74 68 65 20 72 65 76 6f 63  .Check the revoc
2500: 61 74 69 6f 6e 20 73 74 61 74 75 73 20 66 6f 72  ation status for
2510: 20 65 61 63 68 20 63 65 72 74 69 66 69 63 61 74   each certificat
2520: 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20  e.. *.Check the 
2530: 76 61 6c 69 64 69 74 79 20 6f 66 20 74 68 65 20  validity of the 
2540: 67 69 76 65 6e 20 43 52 4c 20 61 6e 64 20 74 68  given CRL and th
2550: 65 20 63 65 72 74 20 72 65 76 6f 63 61 74 69 6f  e cert revocatio
2560: 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09 43 68 65  n status.. *.Che
2570: 63 6b 20 74 68 65 20 70 6f 6c 69 63 69 65 73 20  ck the policies 
2580: 6f 66 20 61 6c 6c 20 74 68 65 20 63 65 72 74 69  of all the certi
2590: 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a 20 41 72  ficates. *. * Ar
25a0: 67 73 0a 20 2a 09 70 72 65 76 65 72 69 66 79 5f  gs. *.preverify_
25b0: 6f 6b 20 69 6e 64 69 63 61 74 65 73 20 77 68 65  ok indicates whe
25c0: 74 68 65 72 20 74 68 65 20 63 65 72 74 69 66 69  ther the certifi
25d0: 63 61 74 65 20 76 65 72 69 66 69 63 61 74 69 6f  cate verificatio
25e0: 6e 20 70 61 73 73 65 64 20 28 31 29 20 6f 72 20  n passed (1) or 
25f0: 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a 20 52 65  not (0). *. * Re
2600: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63 61 6c 6c  sults:. *.A call
2610: 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f 20 74 68  back bound to th
2620: 65 20 73 6f 63 6b 65 74 20 6d 61 79 20 72 65 74  e socket may ret
2630: 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20 2a 09 20  urn one of:. *. 
2640: 20 20 20 30 09 09 09 2d 20 74 68 65 20 63 65 72     0...- the cer
2650: 74 69 66 69 63 61 74 65 20 69 73 20 64 65 65 6d  tificate is deem
2660: 65 64 20 69 6e 76 61 6c 69 64 2c 20 73 65 6e 64  ed invalid, send
2670: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 0a 20 2a   verification. *
2680: 09 09 09 09 20 20 66 61 69 6c 75 72 65 20 61 6c  ....  failure al
2690: 65 72 74 20 74 6f 20 70 65 65 72 2c 20 61 6e 64  ert to peer, and
26a0: 20 74 65 72 6d 69 6e 61 74 65 20 68 61 6e 64 73   terminate hands
26b0: 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20 31 09 09  hake.. *.    1..
26c0: 09 2d 20 74 68 65 20 63 65 72 74 69 66 69 63 61  .- the certifica
26d0: 74 65 20 69 73 20 64 65 65 6d 65 64 20 76 61 6c  te is deemed val
26e0: 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  id, continue wit
26f0: 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09  h handshake.. *.
2700: 20 20 20 20 65 6d 70 74 79 20 73 74 72 69 6e 67      empty string
2710: 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20 74 6f 20  .- no change to 
2720: 63 65 72 74 69 66 69 63 61 74 65 20 76 61 6c 69  certificate vali
2730: 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 53 69 64  dation. *. * Sid
2740: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68  e effects:. *.Th
2750: 65 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74  e err field of t
2760: 68 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  he currently ope
2770: 72 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20  rative State is 
2780: 73 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74  set. *.  to a st
2790: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
27a0: 74 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74  the SSL negotiat
27b0: 69 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73  ion failure reas
27c0: 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  on. *. *--------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2810: 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72 69 66  static int.Verif
2820: 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74 20 6f 6b  yCallback(int ok
2830: 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58  , X509_STORE_CTX
2840: 20 2a 63 74 78 29 20 7b 0a 20 20 20 20 54 63 6c   *ctx) {.    Tcl
2850: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
2860: 20 20 53 53 4c 20 20 20 2a 73 73 6c 09 09 3d 20    SSL   *ssl..= 
2870: 28 53 53 4c 2a 29 58 35 30 39 5f 53 54 4f 52 45  (SSL*)X509_STORE
2880: 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64 61 74 61  _CTX_get_ex_data
2890: 28 63 74 78 2c 20 53 53 4c 5f 67 65 74 5f 65 78  (ctx, SSL_get_ex
28a0: 5f 64 61 74 61 5f 58 35 30 39 5f 53 54 4f 52 45  _data_X509_STORE
28b0: 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a 20 20 20  _CTX_idx());.   
28c0: 20 58 35 30 39 20 20 2a 63 65 72 74 09 09 3d 20   X509  *cert..= 
28d0: 58 35 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67  X509_STORE_CTX_g
28e0: 65 74 5f 63 75 72 72 65 6e 74 5f 63 65 72 74 28  et_current_cert(
28f0: 63 74 78 29 3b 0a 20 20 20 20 53 74 61 74 65 20  ctx);.    State 
2900: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
2910: 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f  te*)SSL_get_app_
2920: 64 61 74 61 28 73 73 6c 29 3b 0a 20 20 20 20 54  data(ssl);.    T
2930: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2940: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
2950: 74 65 72 70 3b 0a 20 20 20 20 69 6e 74 20 64 65  terp;.    int de
2960: 70 74 68 09 09 3d 20 58 35 30 39 5f 53 54 4f 52  pth..= X509_STOR
2970: 45 5f 43 54 58 5f 67 65 74 5f 65 72 72 6f 72 5f  E_CTX_get_error_
2980: 64 65 70 74 68 28 63 74 78 29 3b 0a 20 20 20 20  depth(ctx);.    
2990: 69 6e 74 20 65 72 72 09 09 3d 20 58 35 30 39 5f  int err..= X509_
29a0: 53 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72  STORE_CTX_get_er
29b0: 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20 20 20 64  ror(ctx);..    d
29c0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
29d0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 56  ;.    dprintf("V
29e0: 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 25  erifyCallback: %
29f0: 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20 69 66  d", ok);..    if
2a00: 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
2a10: 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55   == (Tcl_Obj*)NU
2a20: 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65 20 6f 6b  LL) {../* Use ok
2a30: 20 76 61 6c 75 65 20 69 66 20 76 65 72 69 66 69   value if verifi
2a40: 63 61 74 69 6f 6e 20 69 73 20 72 65 71 75 69 72  cation is requir
2a50: 65 64 20 2a 2f 0a 09 69 66 20 28 73 74 61 74 65  ed */..if (state
2a60: 50 74 72 2d 3e 76 66 6c 61 67 73 20 26 20 53 53  Ptr->vflags & SS
2a70: 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
2a80: 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
2a90: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  ..    return ok;
2aa0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
2ab0: 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a 20 20 20  return 1;..}.   
2ac0: 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72 74   } else if (cert
2ad0: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73 73 6c 20   == NULL || ssl 
2ae0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
2af0: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rn 0;.    }..   
2b00: 20 64 70 72 69 6e 74 66 28 22 56 65 72 69 66 79   dprintf("Verify
2b10: 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c 20 63  Callback: eval c
2b20: 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20 20 20  allback");..    
2b30: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
2b40: 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20 20  d to eval */.   
2b50: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2b60: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2b70: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
2b80: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b90: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2ba0: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2bb0: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
2bc0: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
2bd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2be0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2bf0: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2c00: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2c10: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2c20: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2c30: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2c40: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c50: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
2c70: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
2c80: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c90: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2ca0: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
2cb0: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
2cc0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2cd0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2ce0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2cf0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
2d00: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2d10: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2d20: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2d30: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2d40: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76  bj((char*)X509_v
2d50: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
2d60: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
2d70: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76  ));..    /* Prev
2d80: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61  ent I/O while ca
2d90: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f  llback is in pro
2da0: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20  gress */.    /* 
2db0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2dc0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42  |= TLS_TCL_CALLB
2dd0: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ACK; */..    /* 
2de0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2df0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2e00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2e10: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  dPtr);.    ok = 
2e20: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2e30: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2e40: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2e50: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2e60: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Ptr);..    dprin
2e70: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61  tf("VerifyCallba
2e80: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75  ck: command resu
2e90: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  lt = %d", ok);..
2ea0: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2eb0: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2ec0: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2ed0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 28 6f 6b 29  /.    return(ok)
2ee0: 3b 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c  ;./* By default,
2ef0: 20 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74   leave verificat
2f00: 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a  ion unchanged. *
2f10: 2f 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  /.}.../*. *-----
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2f60: 2a 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d  *. * Tls_Error -
2f70: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61  -. *. *.Calls ca
2f80: 6c 6c 62 61 63 6b 20 77 69 74 68 20 6c 69 73 74  llback with list
2f90: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 20 2a 0a 20   of errors.. *. 
2fa0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
2fb0: 20 2a 09 54 68 65 20 65 72 72 20 66 69 65 6c 64   *.The err field
2fc0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c   of the currentl
2fd0: 79 20 6f 70 65 72 61 74 69 76 65 20 53 74 61 74  y operative Stat
2fe0: 65 20 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f  e is set. *.  to
2ff0: 20 61 20 73 74 72 69 6e 67 20 64 65 73 63 72 69   a string descri
3000: 62 69 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67  bing the SSL neg
3010: 6f 74 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65  otiation failure
3020: 20 72 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d   reason. *. *---
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3070: 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72  . */.void.Tls_Er
3080: 72 6f 72 28 53 74 61 74 65 20 2a 73 74 61 74 65  ror(State *state
3090: 50 74 72 2c 20 63 68 61 72 20 2a 6d 73 67 29 20  Ptr, char *msg) 
30a0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
30b0: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
30c0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
30d0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
30e0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
30f0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
3100: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
3110: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3120: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3130: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
3140: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
3150: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
3160: 4c 29 0a 09 72 65 74 75 72 6e 3b 0a 0a 20 20 20  L)..return;..   
3170: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
3180: 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20 20  nd to eval */.  
3190: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
31a0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
31b0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
31c0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
31d0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
31e0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
31f0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
3200: 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20 20  error", -1));.  
3210: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
3220: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3230: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
3240: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
3250: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
3260: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
3270: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 69  lf), -1));.    i
3280: 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29 20  f (msg != NULL) 
3290: 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  {..Tcl_ListObjAp
32a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
32b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
32c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73 67  NewStringObj(msg
32d0: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20 65  , -1));..    } e
32e0: 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20 54  lse if ((msg = T
32f0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
3300: 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a 52 65  Obj(Tcl_GetObjRe
3310: 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 28 54  sult(interp), (T
3320: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29  cl_Size *) NULL)
3330: 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  ) != NULL) {..Tc
3340: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
3350: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
3360: 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  mdPtr, Tcl_NewSt
3370: 72 69 6e 67 4f 62 6a 28 6d 73 67 2c 20 2d 31 29  ringObj(msg, -1)
3380: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  );..    } else {
3390: 0a 09 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f  ..listPtr = Tcl_
33a0: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
33b0: 4c 4c 29 3b 0a 09 77 68 69 6c 65 20 28 28 65 72  LL);..while ((er
33c0: 72 20 3d 20 45 52 52 5f 67 65 74 5f 65 72 72 6f  r = ERR_get_erro
33d0: 72 28 29 29 20 21 3d 20 30 29 20 7b 0a 09 20 20  r()) != 0) {..  
33e0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
33f0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
3400: 70 2c 20 6c 69 73 74 50 74 72 2c 20 54 63 6c 5f  p, listPtr, Tcl_
3410: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 45 52 52  NewStringObj(ERR
3420: 5f 72 65 61 73 6f 6e 5f 65 72 72 6f 72 5f 73 74  _reason_error_st
3430: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
3440: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ..}..Tcl_ListObj
3450: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3460: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 6c 69  terp, cmdPtr, li
3470: 73 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  stPtr);.    }.. 
3480: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
3490: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
34a0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
34b0: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
34c0: 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e   EvalCallback(in
34d0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20  terp, statePtr, 
34e0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c  cmdPtr);.    Tcl
34f0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _DecrRefCount(cm
3500: 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  dPtr);.}.../*. *
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3550: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f 67  ---. *. * KeyLog
3560: 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20  Callback --. *. 
3570: 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65 64  *.Write received
3580: 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f 67   key data to log
3590: 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64   file.. *. * Sid
35a0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f  e effects:. *.no
35b0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
3600: 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c 62  void KeyLogCallb
3610: 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73  ack(const SSL *s
3620: 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  sl, const char *
3630: 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61 72  line) {.    char
3640: 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28 53   *str = getenv(S
3650: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a 20  SLKEYLOGFILE);. 
3660: 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20 20     FILE *fd;..  
3670: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
3680: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74  d");..    if (st
3690: 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65 6e  r) {..fd = fopen
36a0: 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70 72  (str, "a");..fpr
36b0: 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22 2c  intf(fd, "%s\n",
36c0: 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28 66  line);..fclose(f
36d0: 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a  d);.    }.}.../*
36e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3720: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61 73  ------. *. * Pas
3730: 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20 2d  sword Callback -
3740: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77  -. *. *.Called w
3750: 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20 66  hen a password f
3760: 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65 79  or a private key
3770: 20 6c 6f 61 64 69 6e 67 2f 73 74 6f 72 69 6e 67   loading/storing
3780: 20 61 20 50 45 4d 0a 20 2a 09 63 65 72 74 69 66   a PEM. *.certif
3790: 69 63 61 74 65 20 77 69 74 68 20 65 6e 63 72 79  icate with encry
37a0: 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20 63 61 6c  ption. Evals cal
37b0: 6c 62 61 63 6b 20 73 63 72 69 70 74 20 61 6e 64  lback script and
37c0: 20 72 65 74 75 72 6e 73 0a 20 2a 09 74 68 65 20   returns. *.the 
37d0: 72 65 73 75 6c 74 20 61 73 20 74 68 65 20 70 61  result as the pa
37e0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 69 6e  ssword string in
37f0: 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   buf.. *. * Resu
3800: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
3810: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
3820: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
3830: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
3840: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20   *. * Returns:. 
3850: 2a 09 50 61 73 73 77 6f 72 64 20 73 69 7a 65 20  *.Password size 
3860: 69 6e 20 62 79 74 65 73 20 6f 72 20 2d 31 20 66  in bytes or -1 f
3870: 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a  or an error.. *.
3880: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38c0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
38d0: 20 69 6e 74 0a 50 61 73 73 77 6f 72 64 43 61 6c   int.PasswordCal
38e0: 6c 62 61 63 6b 28 63 68 61 72 20 2a 62 75 66 2c  lback(char *buf,
38f0: 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e 74 20 72   int size, int r
3900: 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a 75 64 61  wflag, void *uda
3910: 74 61 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  ta) {.    State 
3920: 2a 73 74 61 74 65 50 74 72 09 3d 20 28 53 74 61  *statePtr.= (Sta
3930: 74 65 20 2a 29 20 75 64 61 74 61 3b 0a 20 20 20  te *) udata;.   
3940: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3950: 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp.= statePtr->
3960: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f  interp;.    Tcl_
3970: 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20  Obj *cmdPtr;.   
3980: 20 69 6e 74 20 63 6f 64 65 3b 0a 0a 20 20 20 20   int code;..    
3990: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
39a0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  );..    /* If no
39b0: 20 63 61 6c 6c 62 61 63 6b 2c 20 75 73 65 20 64   callback, use d
39c0: 65 66 61 75 6c 74 20 63 61 6c 6c 62 61 63 6b 20  efault callback 
39d0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
39e0: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 3d  Ptr->password ==
39f0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 63   NULL) {..if (Tc
3a00: 6c 5f 45 76 61 6c 45 78 28 69 6e 74 65 72 70 2c  l_EvalEx(interp,
3a10: 20 22 74 6c 73 3a 3a 70 61 73 73 77 6f 72 64 22   "tls::password"
3a20: 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  , -1, TCL_EVAL_G
3a30: 4c 4f 42 41 4c 29 20 3d 3d 20 54 43 4c 5f 4f 4b  LOBAL) == TCL_OK
3a40: 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 72  ) {..    char *r
3a50: 65 74 20 3d 20 28 63 68 61 72 20 2a 29 20 54 63  et = (char *) Tc
3a60: 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
3a70: 74 28 69 6e 74 65 72 70 29 3b 0a 09 20 20 20 20  t(interp);..    
3a80: 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74  strncpy(buf, ret
3a90: 2c 20 28 73 69 7a 65 5f 74 29 20 73 69 7a 65 29  , (size_t) size)
3aa0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69  ;..    return (i
3ab0: 6e 74 29 73 74 72 6c 65 6e 28 72 65 74 29 3b 0a  nt)strlen(ret);.
3ac0: 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72  .} else {..    r
3ad0: 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20 20 20  eturn -1;..}.   
3ae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
3af0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61  e command to eva
3b00: 6c 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  l */.    cmdPtr 
3b10: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
3b20: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  bj(statePtr->pas
3b30: 73 77 6f 72 64 29 3b 0a 20 20 20 20 54 63 6c 5f  sword);.    Tcl_
3b40: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3b50: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3b60: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
3b70: 6e 67 4f 62 6a 28 22 70 61 73 73 77 6f 72 64 22  ngObj("password"
3b80: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
3b90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3ba0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3bb0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ptr, Tcl_NewIntO
3bc0: 62 6a 28 72 77 66 6c 61 67 29 29 3b 0a 20 20 20  bj(rwflag));.   
3bd0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
3be0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
3bf0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
3c00: 77 49 6e 74 4f 62 6a 28 73 69 7a 65 29 29 3b 0a  wIntObj(size));.
3c10: 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76  .    Tcl_Preserv
3c20: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69  e((ClientData) i
3c30: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
3c40: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3c50: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29 3b  Data) statePtr);
3c60: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
3c70: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
3c80: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
3c90: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
3ca0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
3cb0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
3cc0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
3cd0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69  L_GLOBAL);.    i
3ce0: 66 20 28 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f  f (code != TCL_O
3cf0: 4b 29 20 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41  K) {.#if (TCL_MA
3d00: 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38  JOR_VERSION == 8
3d10: 29 20 26 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f  ) && (TCL_MINOR_
3d20: 56 45 52 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63  VERSION < 6)..Tc
3d30: 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f  l_BackgroundErro
3d40: 72 28 69 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65  r(interp);.#else
3d50: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
3d60: 45 78 63 65 70 74 69 6f 6e 28 69 6e 74 65 72 70  Exception(interp
3d70: 2c 20 63 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a  , code);.#endif.
3d80: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
3d90: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3da0: 72 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c  r);..    Tcl_Rel
3db0: 65 61 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61  ease((ClientData
3dc0: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20 20  ) statePtr);..  
3dd0: 20 20 2f 2a 20 49 66 20 73 75 63 63 65 73 73 66    /* If successf
3de0: 75 6c 2c 20 70 61 73 73 20 62 61 63 6b 20 70 61  ul, pass back pa
3df0: 73 73 77 6f 72 64 20 73 74 72 69 6e 67 20 61 6e  ssword string an
3e00: 64 20 74 72 75 6e 63 61 74 65 20 69 66 20 74 6f  d truncate if to
3e10: 6f 20 6c 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66  o long */.    if
3e20: 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b   (code == TCL_OK
3e30: 29 20 7b 0a 09 54 63 6c 5f 53 69 7a 65 20 6c 65  ) {..Tcl_Size le
3e40: 6e 3b 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20  n;..char *ret = 
3e50: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3e60: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3e70: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3e80: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3e90: 69 66 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53  if (len > (Tcl_S
3ea0: 69 7a 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09  ize) size-1) {..
3eb0: 20 20 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53      len = (Tcl_S
3ec0: 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a  ize) size-1;..}.
3ed0: 09 73 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65  .strncpy(buf, re
3ee0: 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29  t, (size_t) len)
3ef0: 3b 0a 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c  ;..buf[len] = '\
3f00: 30 27 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65  0';..Tcl_Release
3f10: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3f20: 74 65 72 70 29 3b 0a 09 72 65 74 75 72 6e 28 28  terp);..return((
3f30: 69 6e 74 29 20 6c 65 6e 29 3b 0a 20 20 20 20 7d  int) len);.    }
3f40: 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73 65  .    Tcl_Release
3f50: 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e  ((ClientData) in
3f60: 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 75 72  terp);.    retur
3f70: 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  n -1;.}.../*. *-
3f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3fc0: 2d 2d 0a 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e  --. *. * Session
3fd0: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
3fe0: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43  ients --. *. *.C
3ff0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77  alled when a new
4000: 20 73 65 73 73 69 6f 6e 20 69 73 20 61 64 64 65   session is adde
4010: 64 20 74 6f 20 74 68 65 20 63 61 63 68 65 2e 20  d to the cache. 
4020: 49 6e 20 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68  In TLS 1.3. *.th
4030: 69 73 20 6d 61 79 20 62 65 20 72 65 63 65 69 76  is may be receiv
4040: 65 64 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  ed multiple time
4050: 73 20 61 66 74 65 72 20 74 68 65 20 68 61 6e 64  s after the hand
4060: 73 68 61 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61  shake. For. *.ea
4070: 72 6c 69 65 72 20 76 65 72 73 69 6f 6e 73 2c 20  rlier versions, 
4080: 74 68 69 73 20 77 69 6c 6c 20 62 65 20 72 65 63  this will be rec
4090: 65 69 76 65 64 20 64 75 72 69 6e 67 20 74 68 65  eived during the
40a0: 20 68 61 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54   handshake.. *.T
40b0: 68 69 73 20 69 73 20 74 68 65 20 70 72 65 66 65  his is the prefe
40c0: 72 72 65 64 20 77 61 79 20 74 6f 20 6f 62 74 61  rred way to obta
40d0: 69 6e 20 61 20 72 65 73 75 6d 61 62 6c 65 20 73  in a resumable s
40e0: 65 73 73 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65  ession.. *. * Re
40f0: 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20  sults:. *.None. 
4100: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
4110: 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c  s:. *.Calls call
4120: 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64  back (if defined
4130: 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63  ). *. * Return c
4140: 6f 64 65 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72  odes:. *.0 = err
4150: 6f 72 20 77 68 65 72 65 20 73 65 73 73 69 6f 6e  or where session
4160: 20 77 69 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61   will be immedia
4170: 74 65 6c 79 20 72 65 6d 6f 76 65 64 20 66 72 6f  tely removed fro
4180: 6d 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  m the internal c
4190: 61 63 68 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63  ache.. *.1 = suc
41a0: 63 65 73 73 20 77 68 65 72 65 20 61 70 70 20 72  cess where app r
41b0: 65 74 61 69 6e 73 20 73 65 73 73 69 6f 6e 20 69  etains session i
41c0: 6e 20 73 65 73 73 69 6f 6e 20 63 61 63 68 65 2c  n session cache,
41d0: 20 61 6e 64 20 6d 75 73 74 20 63 61 6c 6c 20 53   and must call S
41e0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 66 72 65 65 28  SL_SESSION_free(
41f0: 29 20 77 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a  ) when done.. *.
4200: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4240: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
4250: 20 69 6e 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c   int.SessionCall
4260: 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53  back(SSL *ssl, S
4270: 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65 73 73  SL_SESSION *sess
4280: 69 6f 6e 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ion) {.    State
4290: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
42a0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
42b0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
42c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
42d0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
42e0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
42f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
4300: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  r;.    const uns
4310: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
4320: 65 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e  et;.    const un
4330: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
4340: 73 69 6f 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a  sion_id;.    siz
4350: 65 5f 74 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e  e_t len2;.    un
4360: 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b  signed int ulen;
4370: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
4380: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66  alled");..    if
4390: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
43a0: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
43b0: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
43c0: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
43d0: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
43e0: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29  if (ssl == NULL)
43f0: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4400: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
4420: 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f  reate command to
4430: 20 65 76 61 6c 20 2a 2f 0a 20 20 20 20 63 6d 64   eval */.    cmd
4440: 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  Ptr = Tcl_Duplic
4450: 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d  ateObj(statePtr-
4460: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  >callback);.    
4470: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
4480: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
4490: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
44a0: 53 74 72 69 6e 67 4f 62 6a 28 22 73 65 73 73 69  StringObj("sessi
44b0: 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  on", -1));.    T
44c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
44d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
44e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
44f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63  _NewStringObj(Tc
4500: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
4510: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29  (statePtr->self)
4520: 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  , -1));..    /* 
4530: 53 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  Session id */.  
4540: 20 20 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53    session_id = S
4550: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69  SL_SESSION_get_i
4560: 64 28 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e  d(session, &ulen
4570: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4580: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4590: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
45a0: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
45b0: 4f 62 6a 28 73 65 73 73 69 6f 6e 5f 69 64 2c 20  Obj(session_id, 
45c0: 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
45d0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69  );..    /* Sessi
45e0: 6f 6e 20 74 69 63 6b 65 74 20 2a 2f 0a 20 20 20  on ticket */.   
45f0: 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
4600: 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e  0_ticket(session
4610: 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32  , &ticket, &len2
4620: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
4630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
4640: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
4650: 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
4660: 4f 62 6a 28 74 69 63 6b 65 74 2c 20 28 54 63 6c  Obj(ticket, (Tcl
4670: 5f 53 69 7a 65 29 20 6c 65 6e 32 29 29 3b 0a 0a  _Size) len2));..
4680: 20 20 20 20 2f 2a 20 4c 69 66 65 74 69 6d 65 20      /* Lifetime 
4690: 2d 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 6f  - number of seco
46a0: 6e 64 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4c  nds */.    Tcl_L
46b0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
46c0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
46d0: 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 4c 6f 6e 67  tr,..Tcl_NewLong
46e0: 4f 62 6a 28 28 6c 6f 6e 67 29 20 53 53 4c 5f 53  Obj((long) SSL_S
46f0: 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65  ESSION_get_ticke
4700: 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28  t_lifetime_hint(
4710: 73 65 73 73 69 6f 6e 29 29 29 3b 0a 0a 20 20 20  session)));..   
4720: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
4730: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
4740: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
4750: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45  t(cmdPtr);.    E
4760: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
4770: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
4780: 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44  dPtr);.    Tcl_D
4790: 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ecrRefCount(cmdP
47a0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
47b0: 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  0;.}.../*. *----
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4800: 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61 6c 6c 62   *. * ALPN Callb
4810: 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73 20  ack for Servers 
4820: 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62 61 63 6b  and NPN Callback
4830: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4840: 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d 20 70 72   *. *.Perform pr
4850: 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f 31 2e 31  otocol (http/1.1
4860: 2c 20 68 32 2c 20 68 33 2c 20 65 74 63 2e 29 20  , h2, h3, etc.) 
4870: 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72 20 74 68  selection for th
4880: 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67 20 63 6f  e. *.incoming co
4890: 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c 6c 65 64  nnection. Called
48a0: 20 61 66 74 65 72 20 48 65 6c 6c 6f 20 61 6e 64   after Hello and
48b0: 20 73 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b   server callback
48c0: 73 2e 0a 20 2a 09 57 68 65 72 65 20 27 6f 75 74  s.. *.Where 'out
48d0: 27 20 69 73 20 73 65 6c 65 63 74 65 64 20 70 72  ' is selected pr
48e0: 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69 6e 27 20  otocol and 'in' 
48f0: 69 73 20 74 68 65 20 70 65 65 72 20 61 64 76 65  is the peer adve
4900: 72 74 69 73 65 64 20 6c 69 73 74 2e 0a 20 2a 0a  rtised list.. *.
4910: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
4920: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
4930: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
4940: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
4950: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
4960: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
4970: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
4980: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73   ALPN protocol s
4990: 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e  elected. The con
49a0: 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65  nection continue
49b0: 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  s.. *.SSL_TLSEXT
49c0: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
49d0: 3a 20 54 68 65 72 65 20 77 61 73 20 6e 6f 20 6f  : There was no o
49e0: 76 65 72 6c 61 70 20 62 65 74 77 65 65 6e 20 74  verlap between t
49f0: 68 65 20 63 6c 69 65 6e 74 27 73 0a 20 2a 09 20  he client's. *. 
4a00: 20 20 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74     supplied list
4a10: 20 61 6e 64 20 74 68 65 20 73 65 72 76 65 72 20   and the server 
4a20: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 20 54  configuration. T
4a30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  he connection wi
4a40: 6c 6c 20 62 65 20 61 62 6f 72 74 65 64 2e 0a 20  ll be aborted.. 
4a50: 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  *.SSL_TLSEXT_ERR
4a60: 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20 70 72 6f  _NOACK: ALPN pro
4a70: 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63 74  tocol not select
4a80: 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63 61 75 73  ed, e.g., becaus
4a90: 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09 20 20 20  e no ALPN. *.   
4aa0: 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72 65 20 63   protocols are c
4ab0: 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 74 68  onfigured for th
4ac0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 54  is connection. T
4ad0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f  he connection co
4ae0: 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d  ntinues.. *. *--
4af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4b30: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
4b40: 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 28 53 53  .ALPNCallback(SS
4b50: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
4b60: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
4b70: 74 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  t, unsigned char
4b80: 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f 6e 73 74   *outlen,..const
4b90: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4ba0: 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  in, unsigned int
4bb0: 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20 2a 61 72   inlen, void *ar
4bc0: 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a  g) {.    State *
4bd0: 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
4be0: 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63 6c 5f  e*)arg;.    Tcl_
4bf0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d  Interp *interp.=
4c00: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
4c10: 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  p;.    Tcl_Obj *
4c20: 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20  cmdPtr;.    int 
4c30: 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20 20 20 20  code, res;..    
4c40: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
4c50: 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20  );..    if (ssl 
4c60: 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d  == NULL || arg =
4c70: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4c80: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4c90: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4ca0: 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 70 72 6f     /* Select pro
4cb0: 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20 69 66 20  tocol */.    if 
4cc0: 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e 65 78 74  (SSL_select_next
4cd0: 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67 6e 65 64  _proto((unsigned
4ce0: 20 63 68 61 72 20 2a 2a 29 20 6f 75 74 2c 20 6f   char **) out, o
4cf0: 75 74 6c 65 6e 2c 20 73 74 61 74 65 50 74 72 2d  utlen, statePtr-
4d00: 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74 65 50 74  >protos, statePt
4d10: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 2c 0a 09  r->protos_len,..
4d20: 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d 20 4f 50  in, inlen) == OP
4d30: 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47 4f 54 49  ENSSL_NPN_NEGOTI
4d40: 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d 61 74 63  ATED) {../* Matc
4d50: 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72 65 73 20  h found */..res 
4d60: 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  = SSL_TLSEXT_ERR
4d70: 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  _OK;.    } else 
4d80: 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c 5f 4e 50  {../* OPENSSL_NP
4d90: 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20 3d 20 4e  N_NO_OVERLAP = N
4da0: 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f 20 75 73  o overlap, so us
4db0: 65 20 66 69 72 73 74 20 69 74 65 6d 20 66 72 6f  e first item fro
4dc0: 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74 6f 63 6f  m client protoco
4dd0: 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65 73 20 3d  l list */..res =
4de0: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
4df0: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
4e00: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
4e10: 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  vcmd == (Tcl_Obj
4e20: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
4e30: 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  n res;.    }..  
4e40: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
4e50: 61 6e 64 20 74 6f 20 65 76 61 6c 20 2a 2f 0a 20  and to eval */. 
4e60: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
4e70: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
4e80: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
4e90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4ea0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4eb0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4ec0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
4ed0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
4ee0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
4ef0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
4f00: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
4f10: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
4f20: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
4f30: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
4f40: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
4f50: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4f60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4f70: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
4f80: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72  gObj((const char
4f90: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a   *) *out, -1));.
4fa0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4fb0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4fc0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4fd0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
4fe0: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
4ff0: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
5000: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5010: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5020: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5030: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5040: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5050: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5060: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5070: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
5080: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5090: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
50a0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
50b0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
50c0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
50d0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
50e0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
50f0: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
5100: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5110: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5120: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5130: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
5180: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
5190: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
51a0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
51b0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
51c0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
51d0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
51e0: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
51f0: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
5200: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5210: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5220: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5230: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5240: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5250: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5260: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5270: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
5280: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
5290: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
52a0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
52b0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
52c0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
52d0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
52e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
52f0: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5300: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5310: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5350: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5360: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5370: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
5380: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
5390: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
53a0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
53b0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
53c0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
53d0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
53e0: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
53f0: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
5400: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5410: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5420: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5430: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5440: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5450: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5460: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5470: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
5480: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
5490: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
54a0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
54b0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
54c0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
54d0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
54e0: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
54f0: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
5500: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5510: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5520: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5530: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5540: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5590: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
55a0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
55b0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
55c0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
55d0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
55e0: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
55f0: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
5600: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5610: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5620: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5630: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5640: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5650: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5660: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5670: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
5680: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
5690: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
56a0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
56b0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
56c0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
56d0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
56e0: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
56f0: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5700: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5710: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5720: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5730: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5740: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5750: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5760: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5770: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5780: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
5790: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
57a0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
57b0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
57c0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
57d0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
57e0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
57f0: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
5800: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5810: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5820: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5830: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5840: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5850: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5860: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5870: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
5880: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
5890: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
58a0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
58f0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5900: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5910: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5920: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5930: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5940: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5950: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5960: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5970: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5980: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5990: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
59a0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
59b0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
59c0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
59d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
59e0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
59f0: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5a00: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5a10: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5a20: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5a30: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20    /* Only works 
5a40: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20  for TLS 1.2 and 
5a50: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73  earlier */.    s
5a60: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f  ervername = SSL_
5a70: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
5a80: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
5a90: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a  YPE_host_name);.
5aa0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e      if (!servern
5ab0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d  ame || servernam
5ac0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
5ad0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5ae0: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5af0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
5b00: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
5b10: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
5b20: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5b30: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5b40: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5b50: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
5b60: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
5b70: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
5b80: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
5b90: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
5ba0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
5bb0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
5bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5bd0: 28 22 73 6e 69 22 2c 20 2d 31 29 29 3b 0a 20 20  ("sni", -1));.  
5be0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
5bf0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
5c00: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
5c10: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
5c20: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
5c30: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
5c40: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
5c50: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
5c60: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
5c70: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
5c80: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
5c90: 61 6d 65 20 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  ame , -1));..   
5ca0: 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63   /* Eval callbac
5cb0: 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  k command */.   
5cc0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
5cd0: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69  t(cmdPtr);.    i
5ce0: 66 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43  f ((code = EvalC
5cf0: 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20  allback(interp, 
5d00: 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72  statePtr, cmdPtr
5d10: 29 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d  )) > 1) {..res =
5d20: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5d30: 41 4c 45 52 54 5f 57 41 52 4e 49 4e 47 3b 0a 09  ALERT_WARNING;..
5d40: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f  *alert = SSL_AD_
5d50: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
5d60: 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72  E; /* Not suppor
5d70: 74 65 64 20 62 79 20 54 4c 53 20 31 2e 33 20 2a  ted by TLS 1.3 *
5d80: 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  /.    } else if 
5d90: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
5da0: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5db0: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
5dc0: 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
5dd0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
5de0: 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c 65 72 74 20  _FATAL;..*alert 
5df0: 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47  = SSL_AD_UNRECOG
5e00: 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20 4e  NIZED_NAME; /* N
5e10: 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79 20  ot supported by 
5e20: 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 7d  TLS 1.3 */.    }
5e30: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
5e40: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5e50: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d     return res;.}
5e60: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
5eb0: 2a 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20 48 61  * ClientHello Ha
5ec0: 6e 64 73 68 61 6b 65 20 43 61 6c 6c 62 61 63 6b  ndshake Callback
5ed0: 20 66 6f 72 20 53 65 72 76 65 72 73 20 2d 2d 0a   for Servers --.
5ee0: 20 2a 0a 20 2a 09 55 73 65 64 20 62 79 20 73 65   *. *.Used by se
5ef0: 72 76 65 72 20 74 6f 20 65 78 61 6d 69 6e 65 20  rver to examine 
5f00: 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65 20  the server name 
5f10: 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49 29  indication (SNI)
5f20: 20 65 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 70 72   extension. *.pr
5f30: 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63 6c  ovided by the cl
5f40: 69 65 6e 74 20 69 6e 20 6f 72 64 65 72 20 74 6f  ient in order to
5f50: 20 73 65 6c 65 63 74 20 61 6e 20 61 70 70 72 6f   select an appro
5f60: 70 72 69 61 74 65 20 63 65 72 74 69 66 69 63 61  priate certifica
5f70: 74 65 20 74 6f 0a 20 2a 09 70 72 65 73 65 6e 74  te to. *.present
5f80: 2c 20 61 6e 64 20 6d 61 6b 65 20 6f 74 68 65 72  , and make other
5f90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 61   configuration a
5fa0: 64 6a 75 73 74 6d 65 6e 74 73 20 72 65 6c 65 76  djustments relev
5fb0: 61 6e 74 20 74 6f 20 74 68 61 74 20 73 65 72 76  ant to that serv
5fc0: 65 72 0a 20 2a 09 6e 61 6d 65 20 61 6e 64 20 69  er. *.name and i
5fd0: 74 73 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ts configuration
5fe0: 2e 20 54 68 69 73 20 69 6e 63 6c 75 64 65 73 20  . This includes 
5ff0: 73 77 61 70 70 69 6e 67 20 6f 75 74 20 74 68 65  swapping out the
6000: 20 61 73 73 6f 63 69 61 74 65 64 0a 20 2a 09 53   associated. *.S
6010: 53 4c 5f 43 54 58 20 70 6f 69 6e 74 65 72 2c 20  SL_CTX pointer, 
6020: 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 73 65  modifying the se
6030: 72 76 65 72 27 73 20 6c 69 73 74 20 6f 66 20 70  rver's list of p
6040: 65 72 6d 69 74 74 65 64 20 54 4c 53 20 76 65 72  ermitted TLS ver
6050: 73 69 6f 6e 73 2c 0a 20 2a 09 63 68 61 6e 67 69  sions,. *.changi
6060: 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73 20  ng the server's 
6070: 63 69 70 68 65 72 20 6c 69 73 74 20 69 6e 20 72  cipher list in r
6080: 65 73 70 6f 6e 73 65 20 74 6f 20 74 68 65 20 63  esponse to the c
6090: 6c 69 65 6e 74 27 73 20 63 69 70 68 65 72 20 6c  lient's cipher l
60a0: 69 73 74 2c 20 65 74 63 2e 0a 20 2a 09 43 61 6c  ist, etc.. *.Cal
60b0: 6c 65 64 20 62 65 66 6f 72 65 20 53 4e 49 20 61  led before SNI a
60c0: 6e 64 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63 6b  nd ALPN callback
60d0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
60e0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
60f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6100: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
6110: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
6120: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
6130: 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  . *.SSL_CLIENT_H
6140: 45 4c 4c 4f 5f 52 45 54 52 59 3a 20 73 75 73 70  ELLO_RETRY: susp
6150: 65 6e 64 20 74 68 65 20 68 61 6e 64 73 68 61 6b  end the handshak
6160: 65 2c 20 61 6e 64 20 74 68 65 20 68 61 6e 64 73  e, and the hands
6170: 68 61 6b 65 20 66 75 6e 63 74 69 6f 6e 20 77 69  hake function wi
6180: 6c 6c 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  ll return immedi
6190: 61 74 65 6c 79 0a 20 2a 09 53 53 4c 5f 43 4c 49  ately. *.SSL_CLI
61a0: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3a  ENT_HELLO_ERROR:
61b0: 20 66 61 69 6c 75 72 65 2c 20 74 65 72 6d 69 6e   failure, termin
61c0: 61 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  ate connection. 
61d0: 53 65 74 20 61 6c 65 72 74 20 74 6f 20 65 72 72  Set alert to err
61e0: 6f 72 20 63 6f 64 65 2e 0a 20 2a 09 53 53 4c 5f  or code.. *.SSL_
61f0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55 43  CLIENT_HELLO_SUC
6200: 43 45 53 53 3a 20 73 75 63 63 65 73 73 0a 20 2a  CESS: success. *
6210: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
6220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6250: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
6260: 63 20 69 6e 74 0a 48 65 6c 6c 6f 43 61 6c 6c 62  c int.HelloCallb
6270: 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  ack(SSL *ssl, in
6280: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
6290: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
62a0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
62b0: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
62c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
62d0: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
62e0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
62f0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
6300: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
6310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
6320: 76 65 72 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e  vername;.    con
6330: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
6340: 20 2a 70 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20   *p;.    size_t 
6350: 6c 65 6e 2c 20 72 65 6d 61 69 6e 69 6e 67 3b 0a  len, remaining;.
6360: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
6370: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
6380: 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  (statePtr->vcmd 
6390: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c  == (Tcl_Obj*)NUL
63a0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c  L) {..return SSL
63b0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
63c0: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
63d0: 65 20 69 66 20 28 73 73 6c 20 3d 3d 20 28 63 6f  e if (ssl == (co
63e0: 6e 73 74 20 53 53 4c 20 2a 29 4e 55 4c 4c 20 7c  nst SSL *)NULL |
63f0: 7c 20 61 72 67 20 3d 3d 20 28 76 6f 69 64 20 2a  | arg == (void *
6400: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
6410: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6420: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  O_ERROR;.    }..
6430: 20 20 20 20 2f 2a 20 47 65 74 20 6e 61 6d 65 73      /* Get names
6440: 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c   */.    if (!SSL
6450: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 67 65  _client_hello_ge
6460: 74 30 5f 65 78 74 28 73 73 6c 2c 20 54 4c 53 45  t0_ext(ssl, TLSE
6470: 58 54 5f 54 59 50 45 5f 73 65 72 76 65 72 5f 6e  XT_TYPE_server_n
6480: 61 6d 65 2c 20 26 70 2c 20 26 72 65 6d 61 69 6e  ame, &p, &remain
6490: 69 6e 67 29 20 7c 7c 20 72 65 6d 61 69 6e 69 6e  ing) || remainin
64a0: 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c 65 72  g <= 2) {..*aler
64b0: 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f  t = SSL_R_SSLV3_
64c0: 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41  ALERT_ILLEGAL_PA
64d0: 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e  RAMETER;..return
64e0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
64f0: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  O_ERROR;.    }..
6500: 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74      /* Extract t
6510: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65  he length of the
6520: 20 73 75 70 70 6c 69 65 64 20 6c 69 73 74 20 6f   supplied list o
6530: 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  f names. */.    
6540: 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c  len = (*(p++) <<
6550: 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b 3d 20   8);.    len += 
6560: 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66 20 28  *(p++);.    if (
6570: 6c 65 6e 20 2b 20 32 20 21 3d 20 72 65 6d 61 69  len + 2 != remai
6580: 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74 20  ning) {..*alert 
6590: 3d 20 53 53 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c  = SSL_R_SSLV3_AL
65a0: 45 52 54 5f 49 4c 4c 45 47 41 4c 5f 50 41 52 41  ERT_ILLEGAL_PARA
65b0: 4d 45 54 45 52 3b 0a 09 72 65 74 75 72 6e 20 53  METER;..return S
65c0: 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f  SL_CLIENT_HELLO_
65d0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
65e0: 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e   remaining = len
65f0: 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 69  ;..    /* The li
6600: 73 74 20 69 6e 20 70 72 61 63 74 69 63 65 20 6f  st in practice o
6610: 6e 6c 79 20 68 61 73 20 61 20 73 69 6e 67 6c 65  nly has a single
6620: 20 65 6c 65 6d 65 6e 74 2c 20 73 6f 20 77 65 20   element, so we 
6630: 6f 6e 6c 79 20 63 6f 6e 73 69 64 65 72 20 74 68  only consider th
6640: 65 20 66 69 72 73 74 20 6f 6e 65 2e 20 2a 2f 0a  e first one. */.
6650: 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e 69 6e      if (remainin
6660: 67 20 3d 3d 20 30 20 7c 7c 20 2a 70 2b 2b 20 21  g == 0 || *p++ !
6670: 3d 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  = TLSEXT_NAMETYP
6680: 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 20 7b 0a 09  E_host_name) {..
6690: 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54  *alert = SSL_R_T
66a0: 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52  LSV1_ALERT_INTER
66b0: 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75  NAL_ERROR;..retu
66c0: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
66d0: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
66e0: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 2d 2d  .    remaining--
66f0: 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 77 65  ;..    /* Now we
6700: 20 63 61 6e 20 66 69 6e 61 6c 6c 79 20 70 75 6c   can finally pul
6710: 6c 20 6f 75 74 20 74 68 65 20 62 79 74 65 20 61  l out the byte a
6720: 72 72 61 79 20 77 69 74 68 20 74 68 65 20 61 63  rray with the ac
6730: 74 75 61 6c 20 68 6f 73 74 6e 61 6d 65 2e 20 2a  tual hostname. *
6740: 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61 69 6e  /.    if (remain
6750: 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a 61 6c  ing <= 2) {..*al
6760: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56  ert = SSL_R_TLSV
6770: 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c  1_ALERT_INTERNAL
6780: 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20  _ERROR;..return 
6790: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
67a0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
67b0: 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b 29 20    len = (*(p++) 
67c0: 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e 20 2b  << 8);.    len +
67d0: 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20 69 66  = *(p++);.    if
67e0: 20 28 6c 65 6e 20 2b 20 32 20 3e 20 72 65 6d 61   (len + 2 > rema
67f0: 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c 65 72 74  ining) {..*alert
6800: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6810: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6820: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6830: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6840: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6850: 65 6d 61 69 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a  emaining = len;.
6860: 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20 3d      servername =
6870: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
6880: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ;..    /* Create
6890: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
68a0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
68b0: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
68c0: 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  j(statePtr->vcmd
68d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
68e0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
68f0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
6900: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6910: 28 22 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a  ("hello", -1));.
6920: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
6930: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
6940: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
6950: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
6960: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
6970: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
6980: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
6990: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
69a0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
69b0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
69c0: 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65  wStringObj(serve
69d0: 72 6e 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65  rname, (Tcl_Size
69e0: 29 20 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a  ) len));..    /*
69f0: 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63   Eval callback c
6a00: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63  ommand */.    Tc
6a10: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63  l_IncrRefCount(c
6a20: 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  mdPtr);.    if (
6a30: 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c  (code = EvalCall
6a40: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
6a50: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20  tePtr, cmdPtr)) 
6a60: 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  > 1) {..res = SS
6a70: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6a80: 45 54 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20  ETRY;..*alert = 
6a90: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
6aa0: 54 5f 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44  T_USER_CANCELLED
6ab0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
6ac0: 28 63 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72  (code == 1) {..r
6ad0: 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  es = SSL_CLIENT_
6ae0: 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20  HELLO_SUCCESS;. 
6af0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
6b00: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6b10: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65  LLO_ERROR;..*ale
6b20: 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31  rt = SSL_R_TLSV1
6b30: 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f  _ALERT_INTERNAL_
6b40: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
6b50: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
6b60: 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72  t(cmdPtr);.    r
6b70: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f  eturn res;.}.../
6b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6b90: 2a 2a 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64  ****/./* Command
6ba0: 73 20 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a  s         */./**
6bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6bc0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  **/../*. *------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6c10: 0a 20 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d  . * CiphersObjCm
6c20: 64 20 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61  d -- list availa
6c30: 62 6c 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20  ble ciphers. *. 
6c40: 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
6c50: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70   is invoked to p
6c60: 72 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a  rocess the "tls:
6c70: 3a 63 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e  :ciphers" comman
6c80: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
6c90: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20  ilable ciphers, 
6ca0: 62 61 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f  based upon proto
6cb0: 63 6f 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a  col selected.. *
6cc0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
6cd0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72  A standard Tcl r
6ce0: 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20  esult list.. *. 
6cf0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
6d00: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e   *.constructs an
6d10: 64 20 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63  d destroys SSL c
6d20: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
6d30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
6d80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
6d90: 74 6f 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73  tocols[] = {.."s
6da0: 73 6c 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74  sl2", "ssl3", "t
6db0: 6c 73 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20  ls1", "tls1.1", 
6dc0: 22 74 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e  "tls1.2", "tls1.
6dd0: 33 22 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d  3", NULL.};.enum
6de0: 20 70 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20   protocol {.    
6df0: 54 4c 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53  TLS_SSL2, TLS_SS
6e00: 4c 33 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c  L3, TLS_TLS1, TL
6e10: 53 5f 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c  S_TLS1_1, TLS_TL
6e20: 53 31 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33  S1_2, TLS_TLS1_3
6e30: 2c 20 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73  , TLS_NONE.};..s
6e40: 74 61 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72  tatic int.Cipher
6e50: 73 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  sObjCmd(ClientDa
6e60: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
6e70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
6e80: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
6e90: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
6ea0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  []) {.    Tcl_Ob
6eb0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c  j *objPtr = NULL
6ec0: 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63  ;.    SSL_CTX *c
6ed0: 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53  tx = NULL;.    S
6ee0: 53 4c 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a  SL *ssl = NULL;.
6ef0: 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c      STACK_OF(SSL
6f00: 5f 43 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20  _CIPHER) *sk;.  
6f10: 20 20 63 68 61 72 20 2a 63 70 2c 20 62 75 66 5b    char *cp, buf[
6f20: 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20 69 6e 74  BUFSIZ];.    int
6f30: 20 69 6e 64 65 78 2c 20 76 65 72 62 6f 73 65 20   index, verbose 
6f40: 3d 20 30 2c 20 75 73 65 5f 73 75 70 70 6f 72 74  = 0, use_support
6f50: 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  ed = 0;.    cons
6f60: 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65  t SSL_METHOD *me
6f70: 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f 69 64 29  thod;.    (void)
6f80: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
6f90: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
6fa0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 28 6f  d");..    if ((o
6fb0: 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28 6f 62 6a  bjc < 2) || (obj
6fc0: 63 20 3e 20 34 29 29 20 7b 0a 09 54 63 6c 5f 57  c > 4)) {..Tcl_W
6fd0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
6fe0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 70 72  rp, 1, objv, "pr
6ff0: 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f 73 65 3f  otocol ?verbose?
7000: 20 3f 73 75 70 70 6f 72 74 65 64 3f 22 29 3b 0a   ?supported?");.
7010: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7020: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
7030: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
7040: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
7050: 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f 6c 73 2c  v[1], protocols,
7060: 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 30 2c 20   "protocol", 0, 
7070: 26 69 6e 64 65 78 29 20 21 3d 20 54 43 4c 5f 4f  &index) != TCL_O
7080: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7090: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
70a0: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 32 29    if ((objc > 2)
70b0: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
70c0: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
70d0: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 65 72 62  , objv[2], &verb
70e0: 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  ose) != TCL_OK) 
70f0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
7100: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
7110: 66 20 28 28 6f 62 6a 63 20 3e 20 33 29 20 26 26  f ((objc > 3) &&
7120: 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
7130: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
7140: 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f 73 75 70  bjv[3], &use_sup
7150: 70 6f 72 74 65 64 29 20 21 3d 20 54 43 4c 5f 4f  ported) != TCL_O
7160: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7170: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
7180: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
7190: 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77 69 74 63  or();..    switc
71a0: 68 20 28 28 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  h ((enum protoco
71b0: 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63 61 73 65  l)index) {..case
71c0: 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69 66 20 4f   TLS_SSL2:.#if O
71d0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
71e0: 55 4d 42 45 52 20 3e 3d 20 30 78 31 30 31 30 30  UMBER >= 0x10100
71f0: 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28  000L || defined(
7200: 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64 65 66 69  NO_SSL2) || defi
7210: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
7220: 53 4c 32 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  SL2)..    Tcl_Ap
7230: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7240: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7250: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7260: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7270: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7280: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7290: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
72a0: 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28   = SSLv2_method(
72b0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
72c0: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a  ..case TLS_SSL3:
72d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
72e0: 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL3) || defined
72f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
7300: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7310: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
7320: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
7330: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7340: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7350: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7360: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7370: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7380: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7390: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
73a0: 20 3d 20 53 53 4c 76 33 5f 6d 65 74 68 6f 64 28   = SSLv3_method(
73b0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
73c0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 3a  ..case TLS_TLS1:
73d0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
73e0: 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  TLS1) || defined
73f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
7400: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7410: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54  NSSL_NO_TLS1_MET
7420: 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70  HOD)..    Tcl_Ap
7430: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7440: 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64  p, protocols[ind
7450: 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c  ex], ": protocol
7460: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
7470: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7480: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7490: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
74a0: 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28   = TLSv1_method(
74b0: 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ); break;.#endif
74c0: 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f  ..case TLS_TLS1_
74d0: 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  1:.#if defined(N
74e0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
74f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
7500: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7510: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7520: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  S1_1_METHOD)..  
7530: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
7540: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
7550: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
7560: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
7570: 70 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a  ported", NULL);.
7580: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7590: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
75a0: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
75b0: 5f 31 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _1_method(); bre
75c0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
75d0: 20 54 4c 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66   TLS_TLS1_2:.#if
75e0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
75f0: 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _2) || defined(O
7600: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
7610: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7620: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d  NSSL_NO_TLS1_2_M
7630: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
7640: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7650: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
7660: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
7670: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
7680: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  ", NULL);..    r
7690: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
76a0: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
76b0: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
76c0: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
76d0: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
76e0: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
76f0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7700: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7710: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
7720: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7730: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
7740: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
7750: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
7760: 6f 72 74 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09  orted", NULL);..
7770: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
7780: 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20  RROR;.#else..   
7790: 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65   method = TLS_me
77a0: 74 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c  thod();..    SSL
77b0: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
77c0: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
77d0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
77e0: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
77f0: 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73  t_max_proto_vers
7800: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
7810: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62  VERSION);..    b
7820: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65  reak;.#endif..de
7830: 66 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68  fault:..    meth
7840: 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28  od = TLS_method(
7850: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20  );..    break;. 
7860: 20 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20     }..    ctx = 
7870: 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68  SSL_CTX_new(meth
7880: 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78  od);.    if (ctx
7890: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
78a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
78b0: 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45  terp, GET_ERR_RE
78c0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
78d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
78e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 73 6c  ;.    }..    ssl
78f0: 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78 29 3b   = SSL_new(ctx);
7900: 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d 20  .    if (ssl == 
7910: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7920: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7930: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7940: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f  (), NULL);..SSL_
7950: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
7960: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7970: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
7980: 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64  Use list and ord
7990: 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73  er as would be s
79a0: 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48  ent in a ClientH
79b0: 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69  ello or all avai
79c0: 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f  lable ciphers */
79d0: 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75 70  .    if (use_sup
79e0: 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20  ported) {..sk = 
79f0: 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74  SSL_get1_support
7a00: 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b  ed_ciphers(ssl);
7a10: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
7a20: 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68  k = SSL_get_ciph
7a30: 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a  ers(ssl);.    }.
7a40: 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e  .    if (sk != N
7a50: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72  ULL) {..if (!ver
7a60: 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 6f 62 6a  bose) {..    obj
7a70: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7a80: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7a90: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7aa0: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7ab0: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7ac0: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7ad0: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7ae0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7af0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7b00: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7b10: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7b20: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7b30: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7b40: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7b50: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7b60: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7b70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7b80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7b90: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7ba0: 72 69 6e 67 4f 62 6a 28 63 70 2c 20 2d 31 29 29  ringObj(cp, -1))
7bb0: 3b 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73  ;..    }...} els
7bc0: 65 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20  e {..    objPtr 
7bd0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
7be0: 62 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66  bj("",0);..    f
7bf0: 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69  or (int i = 0; i
7c00: 20 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52   < sk_SSL_CIPHER
7c10: 5f 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b  _num(sk); i++) {
7c20: 0a 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50  ...const SSL_CIP
7c30: 48 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f  HER *c = sk_SSL_
7c40: 43 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c  CIPHER_value(sk,
7c50: 20 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20   i);...if (c == 
7c60: 4e 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  NULL) continue;.
7c70: 0a 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65  .../* textual de
7c80: 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
7c90: 20 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20   cipher */...if 
7ca0: 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
7cb0: 72 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20  ription(c, buf, 
7cc0: 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20  sizeof(buf)) != 
7cd0: 4e 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63  NULL) {...    Tc
7ce0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7cf0: 6a 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f  jPtr, buf, (Tcl_
7d00: 53 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66  Size) strlen(buf
7d10: 29 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09  ));...} else {..
7d20: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54  .    Tcl_AppendT
7d30: 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e  oObj(objPtr, "UN
7d40: 4b 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09  KNOWN\n", 8);...
7d50: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20  }..    }..}..if 
7d60: 28 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20  (use_supported) 
7d70: 7b 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49  {..    sk_SSL_CI
7d80: 50 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09  PHER_free(sk);..
7d90: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f  }.    }.    SSL_
7da0: 66 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53  free(ssl);.    S
7db0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
7dc0: 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ;..    Tcl_SetOb
7dd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
7de0: 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74  objPtr);.    ret
7df0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a  urn TCL_OK;.}...
7e00: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
7e50: 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d  rotocolsObjCmd -
7e60: 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  - list available
7e70: 20 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a   protocols. *. *
7e80: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
7e90: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
7ea0: 6f 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a  ocess the "tls::
7eb0: 70 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61  protocols" comma
7ec0: 6e 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76  nd. *.to list av
7ed0: 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c  ailable protocol
7ee0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  s.. *. * Results
7ef0: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
7f00: 54 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e  Tcl result list.
7f10: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
7f20: 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a  cts:. *.none. *.
7f30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
7f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7f70: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
7f80: 20 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62   int.ProtocolsOb
7f90: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
7fa0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
7fb0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
7fc0: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
7fd0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
7fe0: 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a   {.    Tcl_Obj *
7ff0: 6f 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69  objPtr;.    (voi
8000: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
8010: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
8020: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
8030: 6f 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63  objc != 1) {..Tc
8040: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8050: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
8060: 22 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  "");..return TCL
8070: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8080: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
8090: 6f 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  or();..    objPt
80a0: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
80b0: 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69  bj(0, NULL);..#i
80c0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
80d0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
80e0: 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e  00000L && !defin
80f0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21  ed(NO_SSL2) && !
8100: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8110: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c  NO_SSL2).    Tcl
8120: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
8130: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
8140: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
8150: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
8160: 5b 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29  [TLS_SSL2], -1))
8170: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8180: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26  fined(NO_SSL3) &
8190: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
81a0: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21  SL_NO_SSL3) && !
81b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
81c0: 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a  NO_SSL3_METHOD).
81d0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
81e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
81f0: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8200: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8210: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33  otocols[TLS_SSL3
8220: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
8230: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
8240: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
8250: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8260: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
8270: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d  PENSSL_NO_TLS1_M
8280: 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c  ETHOD).    Tcl_L
8290: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
82a0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ent(interp, objP
82b0: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
82c0: 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54  gObj(protocols[T
82d0: 4c 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a  LS_TLS1], -1));.
82e0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
82f0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  ned(NO_TLS1_1) &
8300: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8310: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  SL_NO_TLS1_1) &&
8320: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8330: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48  L_NO_TLS1_1_METH
8340: 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  OD).    Tcl_List
8350: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
8360: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
8370: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
8380: 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f  j(protocols[TLS_
8390: 54 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23  TLS1_1], -1));.#
83a0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
83b0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
83c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
83d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  L_NO_TLS1_2) && 
83e0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
83f0: 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f  _NO_TLS1_2_METHO
8400: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8410: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8420: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8430: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8440: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8450: 4c 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_2], -1));.#e
8460: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8470: 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20  d(NO_TLS1_3) && 
8480: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8490: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
84a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
84b0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
84c0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
84d0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
84e0: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c  ols[TLS_TLS1_3],
84f0: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20   -1));.#endif.. 
8500: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
8510: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
8520: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
8530: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
8540: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73  ----. *. * Hands
8590: 68 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  hakeObjCmd --. *
85a0: 0a 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64  . *.This command
85b0: 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
85c0: 66 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68  fy whether the h
85d0: 61 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70  andshake is comp
85e0: 6c 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a  lete. *.or not..
85f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
8600: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
8610: 20 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73   result. 1 means
8620: 20 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c   handshake compl
8630: 65 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e  ete, 0 means pen
8640: 64 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  ding.. *. * Side
8650: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
8660: 20 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74   force SSL negot
8670: 69 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70  iation to take p
8680: 6c 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  lace.. *. *-----
8690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
86d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61  */.static int Ha
86e0: 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c  ndshakeObjCmd(Cl
86f0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8700: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8710: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8720: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
8730: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
8740: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
8750: 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ;        /* The 
8760: 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61  channel to set a
8770: 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20   mode on. */.   
8780: 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72   State *statePtr
8790: 3b 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65  ;        /* clie
87a0: 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
87b0: 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63   socket */.    c
87c0: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74  onst char *errSt
87d0: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  r = NULL;.    in
87e0: 74 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69  t ret = 1;.    i
87f0: 6e 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20  nt err = 0;.    
8800: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
8810: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
8820: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
8830: 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b  if (objc != 2) {
8840: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
8850: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
8860: 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a  jv, "channel");.
8870: 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f  .return(TCL_ERRO
8880: 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  R);.    }..    E
8890: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
88a0: 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  ;..    chan = Tc
88b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
88c0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
88d0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ngFromObj(objv[1
88e0: 5d 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20  ], (Tcl_Size *) 
88f0: 4e 55 4c 4c 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  NULL), NULL);.  
8900: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
8910: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
8920: 29 20 7b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ) {..return(TCL_
8930: 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
8940: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8950: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
8960: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
8970: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
8980: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
8990: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
89a0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
89b0: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
89c0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
89d0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
89e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
89f0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
8a00: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
8a10: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
8a20: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
8a30: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63  nel", NULL);..Tc
8a40: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
8a50: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48  nterp, "TLS", "H
8a60: 41 4e 44 53 48 41 4b 45 22 2c 20 22 43 48 41 4e  ANDSHAKE", "CHAN
8a70: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
8a80: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
8a90: 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52  ..return(TCL_ERR
8aa0: 4f 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  OR);.    }.    s
8ab0: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
8ac0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
8ad0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
8ae0: 61 6e 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  an);..    dprint
8af0: 66 28 22 43 61 6c 6c 69 6e 67 20 54 6c 73 5f 57  f("Calling Tls_W
8b00: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 22 29 3b  aitForConnect");
8b10: 0a 20 20 20 20 72 65 74 20 3d 20 54 6c 73 5f 57  .    ret = Tls_W
8b20: 61 69 74 46 6f 72 43 6f 6e 6e 65 63 74 28 73 74  aitForConnect(st
8b30: 61 74 65 50 74 72 2c 20 26 65 72 72 2c 20 31 29  atePtr, &err, 1)
8b40: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 54  ;.    dprintf("T
8b50: 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65 63  ls_WaitForConnec
8b60: 74 20 72 65 74 75 72 6e 65 64 3a 20 25 69 22 2c  t returned: %i",
8b70: 20 72 65 74 29 3b 0a 0a 20 20 20 20 69 66 20 28   ret);..    if (
8b80: 72 65 74 20 3c 20 30 20 26 26 20 28 28 73 74 61  ret < 0 && ((sta
8b90: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 54  tePtr->flags & T
8ba0: 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 20 26 26  LS_TCL_ASYNC) &&
8bb0: 20 28 65 72 72 20 3d 3d 20 45 41 47 41 49 4e 29   (err == EAGAIN)
8bc0: 29 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 41  )) {..dprintf("A
8bd0: 73 79 6e 63 20 73 65 74 20 61 6e 64 20 65 72 72  sync set and err
8be0: 20 3d 20 45 41 47 41 49 4e 22 29 3b 0a 09 72 65   = EAGAIN");..re
8bf0: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  t = 0;.    } els
8c00: 65 20 69 66 20 28 72 65 74 20 3c 20 30 29 20 7b  e if (ret < 0) {
8c10: 0a 09 6c 6f 6e 67 20 72 65 73 75 6c 74 3b 0a 09  ..long result;..
8c20: 65 72 72 53 74 72 20 3d 20 73 74 61 74 65 50 74  errStr = statePt
8c30: 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52 65 73  r->err;..Tcl_Res
8c40: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
8c50: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28  ;..Tcl_SetErrno(
8c60: 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65 72 72  err);...if (!err
8c70: 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74 72 20  Str || (*errStr 
8c80: 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 65 72  == 0)) {..    er
8c90: 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73 69 78  rStr = Tcl_Posix
8ca0: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 09  Error(interp);..
8cb0: 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  }...Tcl_AppendRe
8cc0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 68 61  sult(interp, "ha
8cd0: 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20  ndshake failed: 
8ce0: 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68 61 72  ", errStr, (char
8cf0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28   *) NULL);..if (
8d00: 28 72 65 73 75 6c 74 20 3d 20 53 53 4c 5f 67 65  (result = SSL_ge
8d10: 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
8d20: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 20  statePtr->ssl)) 
8d30: 21 3d 20 58 35 30 39 5f 56 5f 4f 4b 29 20 7b 0a  != X509_V_OK) {.
8d40: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8d50: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20  esult(interp, " 
8d60: 64 75 65 20 74 6f 20 5c 22 22 2c 20 58 35 30 39  due to \"", X509
8d70: 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
8d80: 6f 72 5f 73 74 72 69 6e 67 28 72 65 73 75 6c 74  or_string(result
8d90: 29 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 2a  ), "\"", (char *
8da0: 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 54 63 6c  ) NULL);..}..Tcl
8db0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
8dc0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48 41  terp, "TLS", "HA
8dd0: 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c 45  NDSHAKE", "FAILE
8de0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
8df0: 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52 65  L);..dprintf("Re
8e00: 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52 4f  turning TCL_ERRO
8e10: 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65  R with handshake
8e20: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65 72   failed: %s", er
8e30: 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28 54  rStr);..return(T
8e40: 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d  CL_ERROR);.    }
8e50: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72 72   else {..if (err
8e60: 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64 70   != 0) {..    dp
8e70: 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65 72  rintf("Got an er
8e80: 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70 6c  ror with a compl
8e90: 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a 20  eted handshake: 
8ea0: 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29 3b  err = %i", err);
8eb0: 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20 20  ..}..ret = 1;.  
8ec0: 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66    }..    dprintf
8ed0: 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f  ("Returning TCL_
8ee0: 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22 25  OK with data \"%
8ef0: 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20 20  i\"", ret);.    
8f00: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
8f10: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
8f20: 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20  IntObj(ret));.  
8f30: 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29    return(TCL_OK)
8f40: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;.}../*. *------
8f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8f90: 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  . * ImportObjCmd
8fa0: 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70   --. *. *.This p
8fb0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8fc0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8fd0: 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e 64  he "ssl" command
8fe0: 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20 63  . *. *.The ssl c
8ff0: 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53 53  ommand pushes SS
9000: 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79 20  L over a (newly 
9010: 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20 73  connected) tcp s
9020: 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73 75  ocket. *. * Resu
9030: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
9040: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
9050: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
9060: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
9070: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
9080: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
9090: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
90e0: 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f 62  tic int.ImportOb
90f0: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20  jCmd(ClientData 
9100: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f  clientData, Tcl_
9110: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9120: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
9130: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
9140: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e   {.    Tcl_Chann
9150: 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68 65  el chan;../* The
9160: 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20   channel to set 
9170: 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20  a mode on. */.  
9180: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
9190: 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
91a0: 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
91b0: 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  et */.    SSL_CT
91c0: 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20 3d  X *ctx.        =
91d0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
91e0: 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20 20  bj *script.     
91f0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54     = NULL;.    T
9200: 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72 64  cl_Obj *password
9210: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9220: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63  .    Tcl_Obj *vc
9230: 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  md.        = NUL
9240: 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  L;.    Tcl_DStri
9250: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
9260: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
9270: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
9280: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
9290: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
92a0: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
92b0: 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63   int idx;.    Tc
92c0: 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20  l_Size len;.    
92d0: 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20 20  int flags..     
92e0: 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49     = TLS_TCL_INI
92f0: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
9300: 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b 09  r..        = 0;.
9310: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
9320: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
9330: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
9340: 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20 20  ar *keyfile.    
9350: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9360: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09 20  char *certfile. 
9370: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9380: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
9390: 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b 0a   *key  .= NULL;.
93a0: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
93b0: 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20 20  _len            
93c0: 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75 6e       = 0;.    un
93d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
93e0: 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t         = NULL
93f0: 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 63  ;.    Tcl_Size c
9400: 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20 20  ert_len         
9410: 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20         = 0;.    
9420: 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20 20  char *ciphers.  
9430: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
9440: 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75    char *ciphersu
9450: 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20 4e  ites.        = N
9460: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
9470: 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  Afile.        = 
9480: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9490: 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20 3d  CAdir..        =
94a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
94b0: 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20 20  *DHparams.      
94c0: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68    = NULL;.    ch
94d0: 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20 20  ar *model..     
94e0: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
94f0: 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09  har *servername.
9500: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 09          = NULL;.
9510: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20  /* hostname for 
9520: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69  Server Name Indi
9530: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 6f  cation */.    co
9540: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
9550: 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  r *session_id = 
9560: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
9570: 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c 3b  j *alpn..= NULL;
9580: 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d 20  .    int ssl2 = 
9590: 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20 20  0, ssl3 = 0;.   
95a0: 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20 74   int tls1 = 1, t
95b0: 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31 5f  ls1_1 = 1, tls1_
95c0: 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d 20  2 = 1, tls1_3 = 
95d0: 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 6f  1;.    int proto
95e0: 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d 31   = 0, level = -1
95f0: 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66 79  ;.    int verify
9600: 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d 20   = 0, require = 
9610: 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c 20  0, request = 1, 
9620: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 3d  post_handshake =
9630: 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63   0;.    (void) c
9640: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
9650: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
9660: 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  );..#if defined(
9670: 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69  NO_TLS1) || defi
9680: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9690: 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d 20  LS1).    tls1 = 
96a0: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
96b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
96c0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
96d0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20  SSL_NO_TLS1_1). 
96e0: 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a 23     tls1_1 = 0;.#
96f0: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
9700: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20  d(NO_TLS1_2) || 
9710: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
9720: 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 74  NO_TLS1_2).    t
9730: 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64 69  ls1_2 = 0;.#endi
9740: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
9750: 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69  _TLS1_3) || defi
9760: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9770: 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_3).    tls1_
9780: 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  3 = 0;.#endif.. 
9790: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
97a0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
97b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
97c0: 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20 3f  objv, "channel ?
97d0: 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65 74  options?");..ret
97e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
97f0: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
9800: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
9810: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9820: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
9830: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
9840: 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54  mObj(objv[1], (T
9850: 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29  cl_Size *) NULL)
9860: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
9870: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
9880: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
9890: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
98a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
98b0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
98c0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
98d0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
98e0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
98f0: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
9900: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78  );..    for (idx
9910: 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63   = 2; idx < objc
9920: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72  ; idx++) {..char
9930: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53   *opt = Tcl_GetS
9940: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
9950: 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53 69 7a  v[idx], (Tcl_Siz
9960: 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20  e *)NULL);...if 
9970: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a  (opt[0] != '-').
9980: 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50  .    break;...OP
9990: 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c  TOBJ("-alpn", al
99a0: 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  pn);..OPTSTR("-c
99b0: 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a 09  adir", CAdir);..
99c0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22  OPTSTR("-cafile"
99d0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 42  , CAfile);..OPTB
99e0: 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72  YTE("-cert", cer
99f0: 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f  t, cert_len);..O
9a00: 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65  PTSTR("-certfile
9a10: 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f  ", certfile);..O
9a20: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c  PTSTR("-cipher",
9a30: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
9a40: 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63  TR("-ciphers", c
9a50: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9a60: 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73 22  ("-ciphersuites"
9a70: 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29 3b  , ciphersuites);
9a80: 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61  ..OPTOBJ("-comma
9a90: 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f  nd", script);..O
9aa0: 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73  PTSTR("-dhparams
9ab0: 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f  ", DHparams);..O
9ac0: 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b  PTBYTE("-key", k
9ad0: 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f  ey, key_len);..O
9ae0: 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22  PTSTR("-keyfile"
9af0: 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54  , keyfile);..OPT
9b00: 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f  STR("-model", mo
9b10: 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  del);..OPTOBJ("-
9b20: 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77  password", passw
9b30: 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ord);..OPTBOOL("
9b40: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22  -post_handshake"
9b50: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
9b60: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
9b70: 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74 29  quest", request)
9b80: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71  ;..OPTBOOL("-req
9b90: 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b  uire", require);
9ba0: 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72  ..OPTINT("-secur
9bb0: 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65  ity_level", leve
9bc0: 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  l);..OPTBOOL("-s
9bd0: 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b  erver", server);
9be0: 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65  ..OPTSTR("-serve
9bf0: 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61  rname", serverna
9c00: 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  me);..OPTSTR("-s
9c10: 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73  ession_id", sess
9c20: 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f  ion_id);..OPTBOO
9c30: 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29  L("-ssl2", ssl2)
9c40: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c  ;..OPTBOOL("-ssl
9c50: 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42  3", ssl3);..OPTB
9c60: 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73  OOL("-tls1", tls
9c70: 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74  1);..OPTBOOL("-t
9c80: 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b  ls1.1", tls1_1);
9c90: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31  ..OPTBOOL("-tls1
9ca0: 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f  .2", tls1_2);..O
9cb0: 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22  PTBOOL("-tls1.3"
9cc0: 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f  , tls1_3);..OPTO
9cd0: 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d  BJ("-validatecom
9ce0: 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f  mand", vcmd);..O
9cf0: 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76  PTOBJ("-vcmd", v
9d00: 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22  cmd);...OPTBAD("
9d10: 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c  option", "-alpn,
9d20: 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65   -cadir, -cafile
9d30: 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69  , -cert, -certfi
9d40: 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69  le, -cipher, -ci
9d50: 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d  phersuites, -com
9d60: 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c  mand, -dhparams,
9d70: 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c   -key, -keyfile,
9d80: 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f   -model, -passwo
9d90: 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68  rd, -post_handsh
9da0: 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d  ake, -request, -
9db0: 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69  require, -securi
9dc0: 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65  ty_level, -serve
9dd0: 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20  r, -servername, 
9de0: 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73  -session_id, -ss
9df0: 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31  l2, -ssl3, -tls1
9e00: 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31  , -tls1.1, -tls1
9e10: 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20  .2, -tls1.3, or 
9e20: 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64  -validatecommand
9e30: 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c  ");...return TCL
9e40: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
9e50: 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09    if (request)..
9e60: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9e70: 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
9e80: 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45   | SSL_VERIFY_PE
9e90: 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75  ER;.    if (requ
9ea0: 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09  est && require).
9eb0: 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45  verify |= SSL_VE
9ec0: 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f  RIFY_FAIL_IF_NO_
9ed0: 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69  PEER_CERT;.    i
9ee0: 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f  f (request && po
9ef0: 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65  st_handshake).ve
9f00: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
9f10: 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
9f20: 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66  E;.    if (verif
9f30: 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20  y == 0)..verify 
9f40: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  = SSL_VERIFY_NON
9f50: 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  E;..    proto |=
9f60: 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f   (ssl2 ? TLS_PRO
9f70: 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20  TO_SSL2 : 0);.  
9f80: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33    proto |= (ssl3
9f90: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c   ? TLS_PROTO_SSL
9fa0: 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  3 : 0);.    prot
9fb0: 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53  o |= (tls1 ? TLS
9fc0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29  _PROTO_TLS1 : 0)
9fd0: 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ;.    proto |= (
9fe0: 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f  tls1_1 ? TLS_PRO
9ff0: 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a  TO_TLS1_1 : 0);.
a000: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a010: 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_2 ? TLS_PROTO
a020: 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20  _TLS1_2 : 0);.  
a030: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a040: 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _3 ? TLS_PROTO_T
a050: 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20  LS1_3 : 0);..   
a060: 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c   /* reset to NUL
a070: 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e  L if blank strin
a080: 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20  g provided */.  
a090: 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a    if (cert && !*
a0a0: 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63  cert)..        c
a0b0: 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ert.        = NU
a0c0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20  LL;.    if (key 
a0d0: 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20  && !*key)..     
a0e0: 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d     key.        =
a0f0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a100: 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72  ertfile && !*cer
a110: 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63  tfile)         c
a120: 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a  ertfile.= NULL;.
a130: 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20      if (keyfile 
a140: 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b  && !*keyfile)..k
a150: 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  eyfile.        =
a160: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63   NULL;.    if (c
a170: 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68  iphers && !*ciph
a180: 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70  ers).        cip
a190: 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e  hers.        = N
a1a0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a1b0: 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63  hersuites && !*c
a1c0: 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70  iphersuites) cip
a1d0: 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e  hersuites    = N
a1e0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66  ULL;.    if (CAf
a1f0: 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29  ile && !*CAfile)
a200: 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09  .        CAfile.
a210: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a220: 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26 26      if (CAdir &&
a230: 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20 20   !*CAdir).      
a240: 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20 20    CAdir.        
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a260: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
a270: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
a280: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
a290: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
a2a0: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
a2b0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
a2c0: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
a2d0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
a2e0: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
a2f0: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
a300: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
a310: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
a320: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
a330: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
a340: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
a350: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
a360: 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79  >vflags.= verify
a370: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a380: 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f  err.= "";..    /
a390: 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70  * allocate scrip
a3a0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72  t */.    if (scr
a3b0: 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ipt) {..(void) T
a3c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
a3d0: 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e  Obj(script, &len
a3e0: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a3f0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61      statePtr->ca
a400: 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b  llback = script;
a410: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
a420: 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
a430: 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20  >callback);..}. 
a440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c     }..    /* all
a450: 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a  ocate password *
a460: 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f  /.    if (passwo
a470: 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  rd) {..(void) Tc
a480: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a490: 62 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65  bj(password, &le
a4a0: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
a4b0: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70  .    statePtr->p
a4c0: 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f  assword = passwo
a4d0: 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  rd;..    Tcl_Inc
a4e0: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a4f0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
a500: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
a510: 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74  allocate validat
a520: 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  e command */.   
a530: 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76   if (vcmd) {..(v
a540: 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69  oid) Tcl_GetStri
a550: 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20  ngFromObj(vcmd, 
a560: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29  &len);..if (len)
a570: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72   {..    statePtr
a580: 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09  ->vcmd = vcmd;..
a590: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
a5a0: 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76  ount(statePtr->v
a5b0: 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  cmd);..}.    }..
a5c0: 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d      if (model !=
a5d0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f   NULL) {..int mo
a5e0: 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20  de;../* Get the 
a5f0: 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20  "model" context 
a600: 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47  */..chan = Tcl_G
a610: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
a620: 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b  , model, &mode);
a630: 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54  ..if (chan == (T
a640: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
a650: 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  ) {..    Tls_Fre
a660: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
a670: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
a680: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
a690: 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75  ../*.. * Make su
a6a0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
a6b0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
a6c0: 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20  nnel.. */..chan 
a6d0: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
a6e0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28  nel(chan);..if (
a6f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79  Tcl_GetChannelTy
a700: 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f  pe(chan) != Tls_
a710: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b  ChannelType()) {
a720: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
a730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
a740: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
a750: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
a760: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
a770: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
a780: 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  nel", NULL);..  
a790: 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f    Tcl_SetErrorCo
a7a0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
a7b0: 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  , "IMPORT", "CHA
a7c0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
a7d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
a7e0: 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28  ;..    Tls_Free(
a7f0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
a800: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a810: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
a820: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
a830: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
a840: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
a850: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
a860: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
a870: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
a880: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
a890: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
a8a0: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
a8b0: 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a 09  (int) key_len,..
a8c0: 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f 6c      (int) cert_l
a8d0: 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69 6c  en, CAdir, CAfil
a8e0: 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  e, ciphers, ciph
a8f0: 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c  ersuites, level,
a900: 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e   DHparams)) == N
a910: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  ULL) {..    Tls_
a920: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
a930: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
a940: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a950: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74  .}.    }..    st
a960: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63 74  atePtr->ctx = ct
a970: 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  x;..    /*.     
a980: 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61 6b  * We need to mak
a990: 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
a9a0: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
a9b0: 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68 65   binary (for the
a9c0: 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74 69  .     * encrypti
a9d0: 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f  on not to get go
a9e0: 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20 2a  ofed up)..     *
a9f0: 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74 6f   We only want to
aa00: 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66 66   adjust the buff
aa10: 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32 20  ering in pre-v2 
aa20: 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65 0a  channels, where.
aa30: 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61 6e       * each chan
aa40: 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63 6b  nel in the stack
aa50: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73 20   maintained its 
aa60: 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20 20  own buffers..   
aa70: 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74    */.    Tcl_DSt
aa80: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
aa90: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
aaa0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  n);.    Tcl_DStr
aab0: 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68  ingInit(&upperCh
aac0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a  annelBlocking);.
aad0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
aae0: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
aaf0: 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54  lEOFChar);.    T
ab00: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
ab10: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
ab20: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
ab30: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ab40: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ab50: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
ab60: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
ab70: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
ab80: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ab90: 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64 69  , chan, "-encodi
aba0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
abb0: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20 20  elEncoding);.   
abc0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_GetChannelO
abd0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
abe0: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  an, "-translatio
abf0: 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  n", &upperChanne
ac00: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
ac10: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ac20: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ac30: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
ac40: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
ac50: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
ac60: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
ac70: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ac80: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
ac90: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
aca0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
acb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
acc0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
acd0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64 70   "true");.    dp
ace0: 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e 67  rintf("Consuming
acf0: 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73 22   Tcl channel %s"
ad00: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
ad10: 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20 20  Name(chan));.   
ad20: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20   statePtr->self 
ad30: 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e  = Tcl_StackChann
ad40: 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f 43  el(interp, Tls_C
ad50: 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28 43  hannelType(), (C
ad60: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65  lientData) state
ad70: 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44 41  Ptr,..(TCL_READA
ad80: 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41 42  BLE | TCL_WRITAB
ad90: 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20  LE), chan);.    
ada0: 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65 64  dprintf("Created
adb0: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20 25   channel named %
adc0: 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  s", Tcl_GetChann
add0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
ade0: 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66 20  >self));.    if 
adf0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20  (statePtr->self 
ae00: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
ae10: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a   NULL) {../*.. *
ae20: 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f 45   No use of Tcl_E
ae30: 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62 65  ventuallyFree be
ae40: 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62 6c  cause no possibl
ae50: 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e 0a  e Tcl_Preserve..
ae60: 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28 28  . */..Tls_Free((
ae70: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
ae80: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
ae90: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
aea0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
aeb0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74  ption(interp, st
aec0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d  atePtr->self, "-
aed0: 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54 63  translation", Tc
aee0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
aef0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
af00: 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20 54  slation));.    T
af10: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
af20: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
af30: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6e  ePtr->self, "-en
af40: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  coding", Tcl_DSt
af50: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
af60: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
af70: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
af80: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
af90: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
afa0: 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c 20  lf, "-eofchar", 
afb0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
afc0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
afd0: 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63 6c  FChar));.    Tcl
afe0: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
aff0: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
b000: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f 63  tr->self, "-bloc
b010: 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69  king", Tcl_DStri
b020: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b030: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b  annelBlocking));
b040: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
b050: 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74 69  SSL Initializati
b060: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73  on.     */.    s
b070: 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53  tatePtr->ssl = S
b080: 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72 2d  SL_new(statePtr-
b090: 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 21  >ctx);.    if (!
b0a0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b  statePtr->ssl) {
b0b0: 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72 79  ../* SSL library
b0c0: 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41   error */..Tcl_A
b0d0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
b0e0: 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f  rp, "couldn't co
b0f0: 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73 73  nstruct ssl sess
b100: 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  ion: ", GET_ERR_
b110: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b120: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b130: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b140: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b150: 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c  IMPORT", "INIT",
b160: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b170: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f   *) NULL);..Tls_
b180: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b190: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e  atePtr);..return
b1a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
b1b0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68 6f  }..    /* Set ho
b1c0: 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20 2a  st server name *
b1d0: 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72  /.    if (server
b1e0: 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74 73  name) {../* Sets
b1f0: 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d 65   the server name
b200: 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e 49   indication (SNI
b210: 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c 6f  ) in ClientHello
b220: 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09 2f   extension */../
b230: 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c 20  * Per RFC 6066, 
b240: 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41 53  hostname is a AS
b250: 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72 69  CII encoded stri
b260: 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20 34  ng, though RFC 4
b270: 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e 20  366 says UTF-8. 
b280: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65 74  */..if (!SSL_set
b290: 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61 6d  _tlsext_host_nam
b2a0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  e(statePtr->ssl,
b2b0: 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26 20   servername) && 
b2c0: 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20 20  require) {..    
b2d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b2e0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53 4e  (interp, "Set SN
b2f0: 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69 6c  I extension fail
b300: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
b310: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
b320: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
b330: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b340: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b350: 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20 22  MPORT", "SNI", "
b360: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
b370: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
b380: 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20  s_Free((char *) 
b390: 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20  statePtr);..    
b3a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b3b0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f  ;..}.../* Set ho
b3c0: 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20  stname for peer 
b3d0: 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74  certificate host
b3e0: 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f  name verificatio
b3f0: 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20  n in clients... 
b400: 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f    Don't use SSL_
b410: 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20  set1_host since 
b420: 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f  it has limitatio
b430: 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c  ns. */..if (!SSL
b440: 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65  _add1_host(state
b450: 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72  Ptr->ssl, server
b460: 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63  name)) {..    Tc
b470: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b480: 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20  nterp, "Set DNS 
b490: 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a  hostname failed:
b4a0: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
b4b0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
b4c0: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b4d0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b4e0: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b4f0: 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c  RT", "HOSTNAME",
b500: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b510: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b520: 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a  Tls_Free((char *
b530: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20  ) statePtr);..  
b540: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b550: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  OR;..}.    }..  
b560: 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73 73    /* Resume sess
b570: 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69 66  ion id */.    if
b580: 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26 20   (session_id && 
b590: 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f 69  strlen(session_i
b5a0: 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53 49  d) <= SSL_MAX_SI
b5b0: 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b 0a  D_CTX_LENGTH) {.
b5c0: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73 73  ./* SSL_set_sess
b5d0: 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21 53  ion() */..if (!S
b5e0: 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31 5f  SL_SESSION_set1_
b5f0: 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f 67  id_context(SSL_g
b600: 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74 65  et_session(state
b610: 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73 69  Ptr->ssl), sessi
b620: 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64  on_id, (unsigned
b630: 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73   int) strlen(ses
b640: 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20  sion_id))) {..  
b650: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b660: 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75  lt(interp, "Resu
b670: 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65  me session faile
b680: 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45  d: ", GET_ERR_RE
b690: 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
b6a0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
b6b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b6c0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
b6d0: 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22  PORT", "SESSION"
b6e0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b6f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b700: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
b710: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
b720: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b730: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b740: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70 70     /* Enable App
b750: 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20 50  lication-Layer P
b760: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
b770: 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61 72  ion. Examples ar
b780: 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68 74  e: http/1.0,..ht
b790: 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20  tp/1.1, h2, h3, 
b7a0: 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33 2c  ftp, imap, pop3,
b7b0: 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78 6d   xmpp-client, xm
b7c0: 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74 2c  pp-server, mqtt,
b7d0: 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20 20   irc, etc. */.  
b7e0: 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09 2f    if (alpn) {../
b7f0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c 20  * Convert a TCL 
b800: 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f 74  list into a prot
b810: 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69 72  ocol-list in wir
b820: 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e 73  e-format */..uns
b830: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
b840: 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e 65  os, *p;..unsigne
b850: 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65 6e  d int protos_len
b860: 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65 20   = 0;..Tcl_Size 
b870: 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b 0a  cnt, i;..int j;.
b880: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 3b  .Tcl_Obj **list;
b890: 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
b8a0: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
b8b0: 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e 74  terp, alpn, &cnt
b8c0: 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c 5f  , &list) != TCL_
b8d0: 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46  OK) {..    Tls_F
b8e0: 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61  ree((char *) sta
b8f0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
b900: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
b910: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
b920: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
b930: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
b940: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
b950: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
b960: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
b970: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
b980: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
b990: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
b9a0: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
b9b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b9c0: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
b9d0: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c  ocol names too l
b9e0: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ong", (char *) N
b9f0: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45  ULL);...Tcl_SetE
ba00: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
ba10: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
ba20: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
ba30: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
ba40: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28  L);...Tls_Free((
ba50: 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74 72  char *) statePtr
ba60: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
ba70: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
ba80: 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d     protos_len +=
ba90: 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a   1 + (int) len;.
baa0: 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68  .}.../* Build th
bab0: 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f  e complete proto
bac0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f  col-list */..pro
bad0: 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72  tos = ckalloc(pr
bae0: 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70  otos_len);../* p
baf0: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f  rotocol-lists co
bb00: 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20 6c  nsist of 8-bit l
bb10: 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c 20  ength-prefixed, 
bb20: 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a  byte strings */.
bb30: 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d  .for (j = 0, p =
bb40: 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74   protos; j < cnt
bb50: 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68  ; j++) {..    ch
bb60: 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65  ar *str = Tcl_Ge
bb70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c  tStringFromObj(l
bb80: 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09  ist[j], &len);..
bb90: 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69      *p++ = (unsi
bba0: 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a  gned char) len;.
bbb0: 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 73  .    memcpy(p, s
bbc0: 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e  tr, (size_t) len
bbd0: 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e  );..    p += len
bbe0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65  ;..}.../* SSL_se
bbf0: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61  t_alpn_protos ma
bc00: 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68  kes a copy of th
bc10: 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  e protocol-list 
bc20: 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69  */../* Note: Thi
bc30: 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76 65  s functions reve
bc40: 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e 20  rses the return 
bc50: 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f 6e  value convention
bc60: 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65 74   */..if (SSL_set
bc70: 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74 61  _alpn_protos(sta
bc80: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f 74  tePtr->ssl, prot
bc90: 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29 29  os, protos_len))
bca0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
bcb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
bcc0: 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74 6f   "Set ALPN proto
bcd0: 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c 20  cols failed: ", 
bce0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
bcf0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
bd00: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
bd10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
bd20: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
bd30: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
bd40: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
bd50: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
bd60: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
bd70: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
bd80: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
bd90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bda0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
bdb0: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
bdc0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
bdd0: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
bde0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
bdf0: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
be00: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
be10: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
be20: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
be30: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
be40: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
be50: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
be60: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
be70: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
be80: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
be90: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
bea0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
beb0: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
bec0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
bed0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
bee0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
bef0: 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 73  back);.    SSL_s
bf00: 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b  et_info_callback
bf10: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
bf20: 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a  InfoCallback);..
bf30: 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20      /* Callback 
bf40: 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70 72  for observing pr
bf50: 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 20  otocol messages 
bf60: 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e 53  */.#ifndef OPENS
bf70: 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45 0a  SL_NO_SSL_TRACE.
bf80: 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c 5f      /* void SSL_
bf90: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
bfa0: 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74  back_arg(statePt
bfb0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
bfc0: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 76  statePtr);.    v
bfd0: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
bfe0: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  msg_callback(sta
bff0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73 73  tePtr->ctx, Mess
c000: 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f  ageCallback); */
c010: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67  .    SSL_set_msg
c020: 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73 74  _callback_arg(st
c030: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76 6f  atePtr->ssl, (vo
c040: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c050: 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f      SSL_set_msg_
c060: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c070: 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65 43  r->ssl, MessageC
c080: 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69 66  allback);.#endif
c090: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  ..    /* Create 
c0a0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f 20  Tcl_Channel BIO 
c0b0: 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20 73  Handler */.    s
c0c0: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09 3d  tatePtr->p_bio.=
c0d0: 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74 61   BIO_new_tcl(sta
c0e0: 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f  tePtr, BIO_NOCLO
c0f0: 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  SE);.    statePt
c100: 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  r->bio.= BIO_new
c110: 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a  (BIO_f_ssl());..
c120: 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29 20      if (server) 
c130: 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61 6c  {../* Server cal
c140: 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43  lbacks */..SSL_C
c150: 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65  TX_set_tlsext_se
c160: 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74 61  rvername_arg(sta
c170: 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69  tePtr->ctx, (voi
c180: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09  d *)statePtr);..
c190: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73 65  SSL_CTX_set_tlse
c1a0: 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63 61  xt_servername_ca
c1b0: 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d  llback(statePtr-
c1c0: 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61 63  >ctx, SNICallbac
c1d0: 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  k);..SSL_CTX_set
c1e0: 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62  _client_hello_cb
c1f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c200: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20 28  HelloCallback, (
c210: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c220: 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d  ;..if (statePtr-
c230: 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 29  >protos != NULL)
c240: 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f   {..    SSL_CTX_
c250: 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 5f  set_alpn_select_
c260: 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  cb(statePtr->ctx
c270: 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20  , ALPNCallback, 
c280: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c290: 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  );.#ifdef USE_NP
c2a0: 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31 5f  N..    if (tls1_
c2b0: 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f 33  2 == 0 && tls1_3
c2c0: 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f 43   == 0) {...SSL_C
c2d0: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c2e0: 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63 62  os_advertised_cb
c2f0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c300: 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  NPNCallback, (vo
c310: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c320: 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09 7d  .    }.#endif..}
c330: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65 72  .../* Enable ser
c340: 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72 74  ver to send cert
c350: 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20 68   request after h
c360: 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31 2e  andshake (TLS 1.
c370: 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41  3 only) */../* A
c380: 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e   write operation
c390: 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63 65   must take place
c3a0: 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66 69   for the Certifi
c3b0: 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f 20  cate Request to 
c3c0: 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20 74  be..   sent to t
c3d0: 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73 20  he client, this 
c3e0: 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74 68  can be done with
c3f0: 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61 6b   SSL_do_handshak
c400: 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65 71  e(). */..if (req
c410: 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e  uest && post_han
c420: 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f 33  dshake && tls1_3
c430: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65 72  ) {..    SSL_ver
c440: 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74 5f  ify_client_post_
c450: 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65 50  handshake(stateP
c460: 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f  tr->ssl);..}.../
c470: 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63 20  * set automatic 
c480: 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e 20  curve selection 
c490: 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64 68  */..SSL_set_ecdh
c4a0: 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d 3e  _auto(statePtr->
c4b0: 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53 65  ssl, 1);.../* Se
c4c0: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
c4d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
c4e0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
c4f0: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
c500: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
c510: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c520: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
c530: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
c540: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c550: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c560: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
c570: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c580: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
c590: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
c5a0: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
c5b0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c5c0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c5d0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c5e0: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
c5f0: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
c600: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
c610: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
c620: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
c630: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
c640: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
c650: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
c660: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
c670: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
c680: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
c690: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
c6a0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
c6b0: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
c6c0: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
c6d0: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
c6e0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
c6f0: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
c700: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
c710: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
c720: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
c730: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
c740: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
c750: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
c760: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
c770: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
c780: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
c790: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53 53  l);.    }.    SS
c7a0: 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50  L_set_bio(stateP
c7b0: 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74  tr->ssl, statePt
c7c0: 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50  r->p_bio, stateP
c7d0: 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20  tr->p_bio);.    
c7e0: 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74  BIO_set_ssl(stat
c7f0: 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65  ePtr->bio, state
c800: 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f  Ptr->ssl, BIO_NO
c810: 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a 0a  CLOSE);..    /*.
c820: 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53 53       * End of SS
c830: 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a 20  L Init.     */. 
c840: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
c850: 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f 47  rning %s", Tcl_G
c860: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
c870: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a  atePtr->self));.
c880: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
c890: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
c8a0: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
c8b0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
c8c0: 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41 54  self), TCL_VOLAT
c8d0: 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  ILE);..    retur
c8e0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
c8f0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
c900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c930: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 69  ------. *. * Uni
c940: 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20  mportObjCmd --. 
c950: 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64  *. *.This proced
c960: 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  ure is invoked t
c970: 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f 70  o remove the top
c980: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69 6c  most channel fil
c990: 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ter.. *. * Resul
c9a0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
c9b0: 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
c9c0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
c9d0: 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79 20  :. *.May modify 
c9e0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
c9f0: 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a 20  an IO channel.. 
ca00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ca40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
ca50: 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74 4f  ic int.UnimportO
ca60: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
ca70: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
ca80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ca90: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
caa0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
cab0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
cac0: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
cad0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
cae0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
caf0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
cb00: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
cb10: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
cb20: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
cb30: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
cb40: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
cb50: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
cb60: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
cb70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
cb80: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43   chan = Tcl_GetC
cb90: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54  hannel(interp, T
cba0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
cbb0: 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20  v[1]), NULL);.  
cbc0: 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54    if (chan == (T
cbd0: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
cbe0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
cbf0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
cc00: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
cc10: 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65  o operate on the
cc20: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
cc30: 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   */.    chan = T
cc40: 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c  cl_GetTopChannel
cc50: 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66 20  (chan);..    if 
cc60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
cc70: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
cc80: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
cc90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
cca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
ccb0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
ccc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
ccd0: 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e  (chan),..."\": n
cce0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
ccf0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  ", NULL);..    T
cd00: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
cd10: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
cd20: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e  UNIMPORT", "CHAN
cd30: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
cd40: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
cd50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
cd60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  OR;.    }..    i
cd70: 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68  f (Tcl_UnstackCh
cd80: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68  annel(interp, ch
cd90: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52  an) == TCL_ERROR
cda0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ) {..return TCL_
cdb0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
cdc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
cdd0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
ce20: 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d 20  . * CTX_Init -- 
ce30: 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c 5f  construct a SSL_
ce40: 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a 0a  CTX instance. *.
ce50: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
ce60: 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20 69   valid SSL_CTX i
ce70: 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e  nstance or NULL.
ce80: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
ce90: 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75 63  cts:. *.construc
cea0: 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ts SSL context (
ceb0: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
cf00: 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54 58  /.static SSL_CTX
cf10: 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61 74   *.CTX_Init(Stat
cf20: 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e 74  e *statePtr, int
cf30: 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20 70   isServer, int p
cf40: 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79 66  roto, char *keyf
cf50: 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74 66  ile, char *certf
cf60: 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e 65  ile,.    unsigne
cf70: 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e 73  d char *key, uns
cf80: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
cf90: 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20 69  , int key_len, i
cfa0: 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68 61  nt cert_len, cha
cfb0: 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63 68  r *CAdir,.    ch
cfc0: 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61 72  ar *CAfile, char
cfd0: 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72 20   *ciphers, char 
cfe0: 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20 69  *ciphersuites, i
cff0: 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20 2a  nt level, char *
d000: 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20 20  DHparams) {.    
d010: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d020: 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 69  rp = statePtr->i
d030: 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f 43  nterp;.    SSL_C
d040: 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a  TX *ctx = NULL;.
d050: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
d060: 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  ds;.    Tcl_DStr
d070: 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e 74  ing ds1;.    int
d080: 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69 6e   off = 0;.    in
d090: 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  t load_private_k
d0a0: 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  ey;.    const SS
d0b0: 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64  L_METHOD *method
d0c0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
d0d0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
d0e0: 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54 63  f (!proto) {..Tc
d0f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d100: 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69 64  nterp, "no valid
d110: 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74   protocol select
d120: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d130: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d140: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
d150: 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e 74   create SSL cont
d160: 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53  ext */.#if OPENS
d170: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
d180: 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30 4c  R >= 0x10100000L
d190: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53   || defined(NO_S
d1a0: 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL2) || defined(
d1b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29  OPENSSL_NO_SSL2)
d1c0: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
d1d0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
d1e0: 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL2)) {..Tcl_
d1f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d200: 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74 6f  erp, "SSL2 proto
d210: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
d220: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
d230: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
d240: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
d250: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  if defined(NO_SS
d260: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
d270: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
d280: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
d290: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
d2a0: 5f 53 53 4c 33 29 29 20 7b 0a 09 54 63 6c 5f 41  _SSL3)) {..Tcl_A
d2b0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d2c0: 72 70 2c 20 22 53 53 4c 33 20 70 72 6f 74 6f 63  rp, "SSL3 protoc
d2d0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
d2e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
d2f0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
d300: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
d310: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
d320: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
d330: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20  ENSSL_NO_TLS1). 
d340: 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70     if (ENABLED(p
d350: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
d360: 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  TLS1)) {..Tcl_Ap
d370: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d380: 70 2c 20 22 54 4c 53 20 31 2e 30 20 70 72 6f 74  p, "TLS 1.0 prot
d390: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d3a0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d3b0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d3c0: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d3d0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d3e0: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
d3f0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d400: 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_1).    if (ENA
d410: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d420: 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20 7b  PROTO_TLS1_1)) {
d430: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d440: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d450: 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.1 protocol not
d460: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d470: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d480: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d490: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
d4a0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
d4b0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
d4c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
d4d0: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
d4e0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
d4f0: 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_2)) {..Tcl_Ap
d500: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
d510: 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f 74  p, "TLS 1.2 prot
d520: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d530: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d540: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d550: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d560: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
d570: 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_3) || define
d580: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d590: 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_3).    if (ENA
d5a0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
d5b0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20 7b  PROTO_TLS1_3)) {
d5c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
d5e0: 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.3 protocol not
d5f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
d600: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d610: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
d620: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28  .#endif.    if (
d630: 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f  proto == 0) {../
d640: 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67 65  * Use full range
d650: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
d660: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
d670: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53 4c  on(ctx, 0);..SSL
d680: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
d690: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
d6a0: 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  0);.    }..    s
d6b0: 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b 0a  witch (proto) {.
d6c0: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
d6d0: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
d6e0: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
d6f0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
d700: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d710: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63  L_NO_SSL2).    c
d720: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  ase TLS_PROTO_SS
d730: 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  L2:..method = is
d740: 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f 73  Server ? SSLv2_s
d750: 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a  erver_method() :
d760: 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d 65   SSLv2_client_me
d770: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
d780: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
d790: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
d7a0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d7b0: 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  _NO_SSL3) && !de
d7c0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
d7d0: 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20  _SSL3_METHOD).  
d7e0: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
d7f0: 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20 3d  _SSL3:..method =
d800: 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76   isServer ? SSLv
d810: 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  3_server_method(
d820: 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e 74  ) : SSLv3_client
d830: 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61  _method();..brea
d840: 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64  k;.#endif.#if !d
d850: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20  efined(NO_TLS1) 
d860: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
d870: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20  SSL_NO_TLS1) && 
d880: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
d890: 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29  _NO_TLS1_METHOD)
d8a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
d8b0: 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68 6f  OTO_TLS1:..metho
d8c0: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
d8d0: 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74 68  LSv1_server_meth
d8e0: 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c 69  od() : TLSv1_cli
d8f0: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
d900: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
d910: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
d920: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
d930: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d940: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
d950: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d960: 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  1_METHOD).    ca
d970: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
d980: 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_1:..method = i
d990: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
d9a0: 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  1_server_method(
d9b0: 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69 65  ) : TLSv1_1_clie
d9c0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d9d0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d9e0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
d9f0: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
da00: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
da10: 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  2) && !defined(O
da20: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32  PENSSL_NO_TLS1_2
da30: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
da40: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
da50: 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73  _2:..method = is
da60: 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 32  Server ? TLSv1_2
da70: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
da80: 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65 6e   : TLSv1_2_clien
da90: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
daa0: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
dab0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
dac0: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
dad0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
dae0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
daf0: 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a  ROTO_TLS1_3:../*
db00: 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69 63   Use the generic
db10: 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e 73   method and cons
db20: 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66 74  traint range aft
db30: 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63 72  er context is cr
db40: 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f 64  eated */..method
db50: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
db60: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
db70: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
db80: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
db90: 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66 61  .#endif.    defa
dba0: 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69 61  ult:../* Negotia
dbb0: 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69 6c  te highest avail
dbc0: 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65 72  able SSL/TLS ver
dbd0: 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64 20  sion */..method 
dbe0: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53  = isServer ? TLS
dbf0: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
dc00: 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65   : TLS_client_me
dc10: 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45 4e  thod();.#if OPEN
dc20: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
dc30: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
dc40: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
dc50: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
dc60: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
dc70: 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  2)..off |= (ENAB
dc80: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
dc90: 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20 30  ROTO_SSL2)   ? 0
dca0: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c   : SSL_OP_NO_SSL
dcb0: 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v2);.#endif.#if 
dcc0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33  !defined(NO_SSL3
dcd0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
dce0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09  ENSSL_NO_SSL3)..
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 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20 53  _SSL3)   ? 0 : S
dd20: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b  SL_OP_NO_SSLv3);
dd30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dd40: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26  ined(NO_TLS1) &&
dd50: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
dd60: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66 20  L_NO_TLS1)..off 
dd70: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
dd80: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dd90: 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1)   ? 0 : SSL_O
dda0: 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65 6e  P_NO_TLSv1);.#en
ddb0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
ddc0: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
ddd0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dde0: 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66 20  NO_TLS1_1)..off 
ddf0: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
de00: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
de10: 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_1) ? 0 : SSL_O
de20: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a 23  P_NO_TLSv1_1);.#
de30: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
de40: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  ed(NO_TLS1_2) &&
de50: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
de60: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f 66  L_NO_TLS1_2)..of
de70: 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72  f |= (ENABLED(pr
de80: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
de90: 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53 4c  LS1_2) ? 0 : SSL
dea0: 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b  _OP_NO_TLSv1_2);
deb0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
dec0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
ded0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
dee0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
def0: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
df00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
df10: 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20 53  _TLS1_3) ? 0 : S
df20: 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33  SL_OP_NO_TLSv1_3
df30: 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61 6b  );.#endif..break
df40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
df50: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
df60: 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43  .    ctx = SSL_C
df70: 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a  TX_new(method);.
df80: 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b 0a      if (!ctx) {.
df90: 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a 20  .return(NULL);. 
dfa0: 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67 65     }..    if (ge
dfb0: 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46 49  tenv(SSLKEYLOGFI
dfc0: 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  LE)) {..SSL_CTX_
dfd0: 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c 62  set_keylog_callb
dfe0: 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67 43  ack(ctx, KeyLogC
dff0: 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d 0a  allback);.    }.
e000: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e010: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
e020: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e030: 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28  TLS1_3).    if (
e040: 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52 4f  proto == TLS_PRO
e050: 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53 53  TO_TLS1_3) {..SS
e060: 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72  L_CTX_set_min_pr
e070: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
e080: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
e090: 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  ;..SSL_CTX_set_m
e0a0: 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e  ax_proto_version
e0b0: 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52  (ctx, TLS1_3_VER
e0c0: 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  SION);.    }.#en
e0d0: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 63  dif..    /* Forc
e0e0: 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74 69  e cipher selecti
e0f0: 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72 76  on order by serv
e100: 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 69  er */.    if (!i
e110: 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c 5f  sServer) {..SSL_
e120: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
e130: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50 48  ctx, SSL_OP_CIPH
e140: 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45 52  ER_SERVER_PREFER
e150: 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23 69  ENCE);.    }..#i
e160: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
e170: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31  N_NUMBER < 0x101
e180: 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e 53  00000L.    OpenS
e190: 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f 72  SL_add_all_algor
e1a0: 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61 64  ithms(); /* Load
e1b0: 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69 67   ciphers and dig
e1c0: 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  ests */.#endif..
e1d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e1e0: 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28 76  app_data(ctx, (v
e1f0: 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f 2a  oid*)interp);./*
e200: 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6e   remember the in
e210: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 20  terpreter */.   
e220: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70 74   SSL_CTX_set_opt
e230: 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f 50  ions(ctx, SSL_OP
e240: 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53 53  _ALL);./* all SS
e250: 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64  L bug workaround
e260: 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58  s */.    SSL_CTX
e270: 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78  _set_options(ctx
e280: 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50  , SSL_OP_NO_COMP
e290: 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69 73  RESSION);./* dis
e2a0: 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e  able compression
e2b0: 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74   even if support
e2c0: 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ed */.    SSL_CT
e2d0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
e2e0: 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69 73  x, off);../* dis
e2f0: 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76 65  able protocol ve
e300: 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f 50  rsions */.#if OP
e310: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
e320: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30 30  MBER < 0x1010100
e330: 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  0L.    SSL_CTX_s
e340: 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53 4c  et_mode(ctx, SSL
e350: 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52 59  _MODE_AUTO_RETRY
e360: 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65 77  );./* handle new
e370: 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20 62   handshakes in b
e380: 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62 79  ackground. On by
e390: 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65 6e   default in Open
e3a0: 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23 65  SSL 1.1.1. */.#e
e3b0: 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54 58  ndif.    SSL_CTX
e3c0: 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65 5f  _sess_set_cache_
e3d0: 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b 0a  size(ctx, 128);.
e3e0: 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65 72  .    /* Set user
e3f0: 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72 73   defined ciphers
e400: 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73 2c  , cipher suites,
e410: 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c 65   and security le
e420: 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28  vel */.    if ((
e430: 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c 29  ciphers != NULL)
e440: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
e450: 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74 78  _cipher_list(ctx
e460: 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09 54  , ciphers)) {..T
e470: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e480: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69 70  interp, "Set cip
e490: 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20  hers failed: No 
e4a0: 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c 20  valid ciphers", 
e4b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e4c0: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
e4d0: 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  x);..return NULL
e4e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
e4f0: 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21 3d  (ciphersuites !=
e500: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
e510: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75 69  TX_set_ciphersui
e520: 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72 73  tes(ctx, ciphers
e530: 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f 41  uites)) {..Tcl_A
e540: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e550: 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 20  rp, "Set cipher 
e560: 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20 4e  suites failed: N
e570: 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22  o valid ciphers"
e580: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e590: 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ;..SSL_CTX_free(
e5a0: 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ctx);..return NU
e5b0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
e5c0: 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Set security l
e5d0: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
e5e0: 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c 65  level > -1 && le
e5f0: 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20 53  vel < 6) {../* S
e600: 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  SL_set_security_
e610: 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43 54  level */..SSL_CT
e620: 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  X_set_security_l
e630: 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c 29  evel(ctx, level)
e640: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
e650: 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61 63  set some callbac
e660: 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ks */.    SSL_CT
e670: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
e680: 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61 73  sswd_cb(ctx, Pas
e690: 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b 0a  swordCallback);.
e6a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
e6b0: 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f 63  default_passwd_c
e6c0: 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c 20  b_userdata(ctx, 
e6d0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
e6e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64 20  );..    /* read 
e6f0: 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61 6e  a Diffie-Hellman
e700: 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c 65   parameters file
e710: 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75 69  , or use the bui
e720: 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69 66  lt-in one */.#if
e730: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
e740: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
e750: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
e760: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e770: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
e780: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
e790: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
e7a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
e7b0: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
e7c0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
e7d0: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
e7e0: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
e7f0: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
e800: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
e810: 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  o;..    Tcl_DStr
e820: 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09 20  ingInit(&ds);.. 
e830: 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65 77     bio = BIO_new
e840: 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72 61  _file(F2N(DHpara
e850: 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b 0a  ms, &ds), "r");.
e860: 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20 7b  .    if (!bio) {
e870: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
e880: 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f 41  ee(&ds);...Tcl_A
e890: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e8a0: 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 66  rp, "Could not f
e8b0: 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65 72  ind DH parameter
e8c0: 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a  s file", (char *
e8d0: 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43  ) NULL);...SSL_C
e8e0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09  TX_free(ctx);...
e8f0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
e900: 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20 50    }...    dh = P
e910: 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70 61  EM_read_bio_DHpa
e920: 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c 20  rams(bio, NULL, 
e930: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20  NULL, NULL);..  
e940: 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b    BIO_free(bio);
e950: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
e960: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
e970: 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54 63   if (!dh) {...Tc
e980: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e990: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
e9a0: 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d 65  t read DH parame
e9b0: 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22 2c  ters from file",
e9c0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e9d0: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
e9e0: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
e9f0: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
ea00: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d 70   SSL_CTX_set_tmp
ea10: 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09 20  _dh(ctx, dh);.. 
ea20: 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b 0a     DH_free(dh);.
ea30: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
ea40: 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f 77  /* Use well know
ea50: 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  n DH parameters 
ea60: 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74 2d  that have built-
ea70: 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f 70  in support in Op
ea80: 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69 66  enSSL */..    if
ea90: 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64   (!SSL_CTX_set_d
eaa0: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29 20  h_auto(ctx, 1)) 
eab0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
eac0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
ead0: 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20 73  uld not enable s
eae0: 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20 47  et DH auto: ", G
eaf0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
eb00: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
eb10: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
eb20: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
eb30: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  ULL;..    }..}. 
eb40: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
eb50: 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72 74   /* set our cert
eb60: 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20 6c  ificate */.    l
eb70: 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20  oad_private_key 
eb80: 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65 72  = 0;.    if (cer
eb90: 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  tfile != NULL) {
eba0: 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b  ..load_private_k
ebb0: 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44 53  ey = 1;...Tcl_DS
ebc0: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
ebd0: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
ebe0: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
ebf0: 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74  le(ctx, F2N(cert
ec00: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
ec10: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
ec20: 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44   0) {..    Tcl_D
ec30: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
ec40: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
ec50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ec60: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
ec70: 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20 22  rtificate file "
ec80: 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22  , certfile, ": "
ec90: 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53  ,...GET_ERR_REAS
eca0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
ecb0: 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43  ULL);..    SSL_C
ecc0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20  TX_free(ctx);.. 
ecd0: 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a     return NULL;.
ece0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .}.    } else if
ecf0: 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29 20   (cert != NULL) 
ed00: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
ed10: 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53 53  key = 1;..if (SS
ed20: 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69 66  L_CTX_use_certif
ed30: 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c 20  icate_ASN1(ctx, 
ed40: 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29 20  cert_len, cert) 
ed50: 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c  <= 0) {..    Tcl
ed60: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
ed70: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
ed80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ed90: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
eda0: 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a  certificate: ",.
edb0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
edc0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
edd0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
ede0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
edf0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
ee00: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63  .    } else {..c
ee10: 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a  ertfile = (char*
ee20: 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c  )X509_get_defaul
ee30: 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a  t_cert_file();..
ee40: 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65  .if (SSL_CTX_use
ee50: 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c  _certificate_fil
ee60: 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c  e(ctx, certfile,
ee70: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
ee80: 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30  M) <= 0) {.#if 0
ee90: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
eea0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
eeb0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
eec0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
eed0: 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c 74  e to use default
eee0: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
eef0: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
ef00: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52  : ",...GET_ERR_R
ef10: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
ef20: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
ef30: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
ef40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
ef50: 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20 20  L;.#endif..}.   
ef60: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f   }..    /* set o
ef70: 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20 2a  ur private key *
ef80: 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f 70  /.    if (load_p
ef90: 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09 69  rivate_key) {..i
efa0: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
efb0: 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55 4c  LL && key == NUL
efc0: 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69 6c  L) {..    keyfil
efd0: 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 7d  e = certfile;..}
efe0: 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 21  ...if (keyfile !
eff0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f  = NULL) {..    /
f000: 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61 74  * get the privat
f010: 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
f020: 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74 69   with this certi
f030: 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 69  ficate */..    i
f040: 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e 55  f (keyfile == NU
f050: 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65 20  LL) {...keyfile 
f060: 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20 20  = certfile;..   
f070: 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53 4c   }...    if (SSL
f080: 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65  _CTX_use_Private
f090: 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32  Key_file(ctx, F2
f0a0: 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29 2c  N(keyfile, &ds),
f0b0: 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45   SSL_FILETYPE_PE
f0c0: 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63 6c  M) <= 0) {...Tcl
f0d0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f0e0: 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68  );.../* flush th
f0f0: 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68 69  e passphrase whi
f100: 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74  ch might be left
f110: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
f120: 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  /...Tcl_SetResul
f130: 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20  t(interp, NULL, 
f140: 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54  TCL_STATIC);...T
f150: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f160: 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20  interp, "unable 
f170: 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65  to set public ke
f180: 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69 6c  y file ", keyfil
f190: 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47 45  e, " ",...    GE
f1a0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
f1b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
f1c0: 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
f1d0: 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  tx);...return NU
f1e0: 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
f1f0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f200: 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 69  &ds);...} else i
f210: 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29 20  f (key != NULL) 
f220: 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f 43  {..    if (SSL_C
f230: 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b 65  TX_use_PrivateKe
f240: 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59 5f  y_ASN1(EVP_PKEY_
f250: 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b 65  RSA, ctx, key,ke
f260: 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09  y_len) <= 0) {..
f270: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
f280: 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73  (&ds);.../* flus
f290: 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65  h the passphrase
f2a0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20   which might be 
f2b0: 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75  left in the resu
f2c0: 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52  lt */...Tcl_SetR
f2d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55  esult(interp, NU
f2e0: 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  LL, TCL_STATIC);
f2f0: 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  ...Tcl_AppendRes
f300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61  ult(interp, "una
f310: 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69  ble to set publi
f320: 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45 52  c key: ", GET_ER
f330: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
f340: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f350: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f360: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f370: 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e 6f  .    }..}../* No
f380: 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  w we know that a
f390: 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68 61   key and cert ha
f3a0: 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61 69  ve been set agai
f3b0: 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c 20  nst.. * the SSL 
f3c0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20 28  context */..if (
f3d0: 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f 70  !SSL_CTX_check_p
f3e0: 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29 29  rivate_key(ctx))
f3f0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
f400: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f410: 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64 6f   "private key do
f420: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65  es not match the
f430: 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75 62   certificate pub
f440: 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20 20  lic key",....   
f450: 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29    (char *) NULL)
f460: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
f470: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
f480: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
f490: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
f4a0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43 41   verification CA
f4b0: 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74  s */.    Tcl_DSt
f4c0: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 20  ringInit(&ds);. 
f4d0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
f4e0: 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f 2a  it(&ds1);.    /*
f4f0: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64 65   There is one de
f500: 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 2c  fault directory,
f510: 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69 6c   one default fil
f520: 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61 75  e, and one defau
f530: 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20 64  lt store...The d
f540: 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69 66  efault CA certif
f550: 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72 79  icates directory
f560: 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73 74   (and default st
f570: 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 20 4f  ore) is in the O
f580: 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64 69  penSSL..certs di
f590: 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e 20  rectory. It can 
f5a0: 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79  be overridden by
f5b0: 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49   the SSL_CERT_DI
f5c0: 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 09  R env var. The..
f5d0: 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69  default CA certi
f5e0: 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 73 20  ficates file is 
f5f0: 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d 20  called cert.pem 
f600: 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 4f  in the default O
f610: 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f 72  penSSL..director
f620: 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76 65  y. It can be ove
f630: 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53  rridden by the S
f640: 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76  SL_CERT_FILE env
f650: 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e 74   var. */../* int
f660: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66   SSL_CTX_set_def
f670: 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72 28  ault_verify_dir(
f680: 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61 6e  SSL_CTX *ctx) an
f690: 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73 65  d int SSL_CTX_se
f6a0: 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66 79  t_default_verify
f6b0: 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a 63  _file(SSL_CTX *c
f6c0: 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  tx) */.    if (!
f6d0: 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
f6e0: 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74  ify_locations(ct
f6f0: 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  x, F2N(CAfile, &
f700: 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c 20  ds), F2N(CAdir, 
f710: 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c 5f  &ds1)) ||..!SSL_
f720: 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
f730: 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
f740: 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c 5f  )) {.#if 0..Tcl_
f750: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f760: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
f770: 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44 6f  ee(&ds1);../* Do
f780: 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63 61  n't currently ca
f790: 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c 73  re if this fails
f7a0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52   */..Tcl_AppendR
f7b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
f7c0: 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69 66  SL default verif
f7d0: 79 20 70 61 74 68 73 3a 20 22 2c 20 47 45 54 5f  y paths: ", GET_
f7e0: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
f7f0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
f800: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f810: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
f820: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
f830: 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75    /* https://sou
f840: 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74  rceforge.net/p/t
f850: 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 20  ls/bugs/57/ */. 
f860: 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20     /* XXX:TODO: 
f870: 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75 70  Let the user sup
f880: 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65 20  ply values here 
f890: 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74  instead of somet
f8a0: 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74 73  hing that exists
f8b0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   on the filesyst
f8c0: 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43 41  em */.    if (CA
f8d0: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
f8e0: 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e  .STACK_OF(X509_N
f8f0: 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
f900: 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
f910: 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
f920: 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69 66  file, &ds));..if
f930: 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e   (certNames != N
f940: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f  ULL) {..    SSL_
f950: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43  CTX_set_client_C
f960: 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74  A_list(ctx, cert
f970: 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20 7d  Names);..}.    }
f980: 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f990: 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20 20  gFree(&ds);.    
f9a0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
f9b0: 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75 72  &ds1);.    retur
f9c0: 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  n ctx;.}.../*. *
f9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f9f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa10: 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73  ---. *. * Status
fa20: 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e  ObjCmd -- return
fa30: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
fa40: 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72 2e   connected peer.
fa50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
fa60: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
fa70: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
fa80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
fa90: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
faa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
fae0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
faf0: 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65  tatusObjCmd(Clie
fb00: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
fb10: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
fb20: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
fb30: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
fb40: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74  objv[]) {.    St
fb50: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
fb60: 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
fb70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
fb80: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
fb90: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
fba0: 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
fbb0: 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
fbc0: 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
fbd0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
fbe0: 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
fbf0: 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
fc00: 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b     int nid, res;
fc10: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
fc20: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
fc30: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
fc40: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
fc50: 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c  2 || objc > 3 ||
fc60: 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21   (objc == 3 && !
fc70: 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
fc80: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ring(objv[1]), "
fc90: 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63  -local"))) {..Tc
fca0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fcb0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
fcc0: 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65  "?-local? channe
fcd0: 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
fce0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
fcf0: 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65     /* Get channe
fd00: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e  l Id */.    chan
fd10: 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
fd20: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
fd30: 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f  bjv[(objc == 2 ?
fd40: 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 6c 5f 53   1 : 2)], (Tcl_S
fd50: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  ize *) NULL);.  
fd60: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
fd70: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
fd80: 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
fd90: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
fda0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
fdb0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
fdc0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
fdd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
fde0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
fdf0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
fe00: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
fe10: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
fe20: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
fe30: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
fe40: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
fe50: 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
fe60: 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
fe70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
fe80: 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
fe90: 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
fea0: 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
feb0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
fec0: 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a  hannel", NULL);.
fed0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
fee0: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
fef0: 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e   "STATUS", "CHAN
ff00: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
ff10: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ff20: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
ff30: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74  OR;.    }.    st
ff40: 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20  atePtr = (State 
ff50: 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  *) Tcl_GetChanne
ff60: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
ff70: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74  an);..    /* Get
ff80: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72   certificate for
ff90: 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f   peer or self */
ffa0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
ffb0: 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53   2) {..peer = SS
ffc0: 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69  L_get_peer_certi
ffd0: 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d  ficate(statePtr-
ffe0: 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73  >ssl);.    } els
fff0: 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f  e {..peer = SSL_
10000 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28  get_certificate(
10010 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10020 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74      }.    /* Get
10030 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74   X509 certificat
10040 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  e info */.    if
10050 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74   (peer) {..objPt
10060 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  r = Tls_NewX509O
10070 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 29  bj(interp, peer)
10080 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32  ;..if (objc == 2
10090 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66 72  ) {..    X509_fr
100a0 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20 70  ee(peer);..    p
100b0 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eer = NULL;..}. 
100c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62 6a     } else {..obj
100d0 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
100e0 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20  tObj(0, NULL);. 
100f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65 65     }..    /* Pee
10100 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c 41  r name */.    LA
10110 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
10120 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72 6e  , objPtr, "peern
10130 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f 70  ame", SSL_get0_p
10140 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74 72  eername(statePtr
10150 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20 20  ->ssl), -1);.   
10160 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
10170 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 62  erp, objPtr, "sb
10180 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63 69  its", SSL_get_ci
10190 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65 50  pher_bits(stateP
101a0 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b  tr->ssl, NULL));
101b0 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d 20  ..    ciphers = 
101c0 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f 63  (char*)SSL_get_c
101d0 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ipher(statePtr->
101e0 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  ssl);.    LAPPEN
101f0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10200 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20  jPtr, "cipher", 
10210 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a 20  ciphers, -1);.. 
10220 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 65     /* Verify the
10230 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74   X509 certificat
10240 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20 74  e presented by t
10250 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20 4c  he peer */.    L
10260 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10270 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69  p, objPtr, "veri
10280 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30 39  fyResult",..X509
10290 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72  _verify_cert_err
102a0 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67 65  or_string(SSL_ge
102b0 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74 28  t_verify_result(
102c0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 2c  statePtr->ssl)),
102d0 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65   -1);..    /* Ve
102e0 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  rify mode */.   
102f0 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74 5f   mode = SSL_get_
10300 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61 74  verify_mode(stat
10310 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
10320 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10330 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09  VERIFY_NONE) {..
10340 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
10350 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
10360 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65 22  ifyMode", "none"
10370 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73  , -1);.    } els
10380 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69  e {..Tcl_Obj *li
10390 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e  stObjPtr = Tcl_N
103a0 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c  ewListObj(0, NUL
103b0 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  L);..if (mode &&
103c0 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
103d0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
103e0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
103f0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
10400 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10410 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d  ingObj("peer", -
10420 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
10430 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
10440 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f  FAIL_IF_NO_PEER_
10450 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c  CERT) {..    Tcl
10460 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10470 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10480 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
10490 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c  wStringObj("fail
104a0 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74   if no peer cert
104b0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
104c0 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
104d0 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29  IFY_CLIENT_ONCE)
104e0 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74   {..    Tcl_List
104f0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
10500 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
10510 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
10520 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e  ngObj("client on
10530 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  ce", -1));..}..i
10540 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
10550 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53  ERIFY_POST_HANDS
10560 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63 6c  HAKE) {..    Tcl
10570 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
10580 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
10590 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
105a0 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74  wStringObj("post
105b0 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29   handshake", -1)
105c0 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f  );..}..LAPPEND_O
105d0 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  BJ(interp, objPt
105e0 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c  r, "verifyMode",
105f0 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20 20   listObjPtr).   
10600 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66   }..    /* Verif
10610 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a  y mode depth */.
10620 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28      LAPPEND_INT(
10630 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
10640 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20 53  "verifyDepth", S
10650 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_get_verify_de
10660 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73 73  pth(statePtr->ss
10670 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70  l));..    /* Rep
10680 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
10690 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
106a0 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65 67  esult of the neg
106b0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  otiation */.    
106c0 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65  SSL_get0_alpn_se
106d0 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72 2d  lected(statePtr-
106e0 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c  >ssl, &proto, &l
106f0 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  en);.    LAPPEND
10700 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10710 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
10720 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c  ar *)proto, (Tcl
10730 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20  _Size) len);.   
10740 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
10750 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
10760 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
10770 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50 74  _version(statePt
10780 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20  r->ssl), -1);.. 
10790 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20     /* Valid for 
107a0 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75 72  non-RSA signatur
107b0 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f  e and TLS 1.3 */
107c0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d  .    if (objc ==
107d0 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   2) {..res = SSL
107e0 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74  _get_peer_signat
107f0 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
10800 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
10810 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20    } else {..res 
10820 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74  = SSL_get_signat
10830 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72  ure_nid(statePtr
10840 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20  ->ssl, &nid);.  
10850 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73    }.    if (!res
10860 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20  ) {nid = 0;}.   
10870 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
10880 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69  erp, objPtr, "si
10890 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f 72  gnatureHashAlgor
108a0 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c  ithm", OBJ_nid2l
108b0 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20  n(nid), -1);..  
108c0 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
108d0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
108e0 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
108f0 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50  _type_nid(stateP
10900 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a  tr->ssl, &nid);.
10910 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65      } else {..re
10920 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e  s = SSL_get_sign
10930 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73  ature_type_nid(s
10940 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e  tatePtr->ssl, &n
10950 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  id);.    }.    i
10960 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20  f (!res) {nid = 
10970 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  0;}.    LAPPEND_
10980 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
10990 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79  tr, "signatureTy
109a0 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28  pe", OBJ_nid2ln(
109b0 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  nid), -1);..    
109c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
109d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
109e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
109f0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a40 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69  -. *. * Connecti
10a50 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20  onInfoObjCmd -- 
10a60 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f  return connectio
10a70 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e  n info from Open
10a80 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  SSL.. *. * Resul
10a90 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66  ts:. *.A list of
10aa0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
10ab0 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .  *. *---------
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
10b00 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65  static int Conne
10b10 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28  ctionInfoObjCmd(
10b20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
10b30 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
10b40 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
10b50 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
10b60 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
10b70 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10b80 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e  an;../* The chan
10b90 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
10ba0 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74  e on */.    Stat
10bb0 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
10bc0 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
10bd0 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
10be0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
10bf0 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20  Ptr, *listPtr;. 
10c00 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73     const SSL *ss
10c10 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c  l;.    const SSL
10c20 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b  _CIPHER *cipher;
10c30 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53  .    const SSL_S
10c40 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b  ESSION *session;
10c50 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d  .    const EVP_M
10c60 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64  D *md;.    (void
10c70 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
10c80 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32     if (objc != 2
10c90 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
10ca0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
10cb0 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22   objv, "channel"
10cc0 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f 45  );..return(TCL_E
10cd0 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  RROR);.    }..  
10ce0 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10cf0 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
10d00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10d10 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28 54  mObj(objv[1], (T
10d20 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29 2c  cl_Size *)NULL),
10d30 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
10d40 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
10d50 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
10d60 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
10d70 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10d80 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
10d90 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
10da0 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
10db0 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
10dc0 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
10dd0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
10de0 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
10df0 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
10e00 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
10e10 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10e20 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
10e30 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
10e40 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
10e50 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
10e60 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
10e70 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45  NULL);..Tcl_SetE
10e80 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
10e90 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43 54   "TLS", "CONNECT
10ea0 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ION", "CHANNEL",
10eb0 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
10ec0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
10ed0 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  urn(TCL_ERROR);.
10ee0 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50 74      }..    objPt
10ef0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
10f00 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20  bj(0, NULL);..  
10f10 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
10f20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61 74  info */.    stat
10f30 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29  ePtr = (State *)
10f40 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
10f50 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
10f60 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61 74  ;.    ssl = stat
10f70 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20 69  ePtr->ssl;.    i
10f80 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20  f (ssl != NULL) 
10f90 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  {../* connection
10fa0 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50 45   state */..LAPPE
10fb0 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10fc0 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c 20  bjPtr, "state", 
10fd0 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e 67  SSL_state_string
10fe0 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29 3b  _long(ssl), -1);
10ff0 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72 65  .../* Get SNI re
11000 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20 6e  quested server n
11010 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ame */..LAPPEND_
11020 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11030 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65 22  tr, "servername"
11040 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  , SSL_get_server
11050 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
11060 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
11070 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ame), -1);.../* 
11080 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a  Get protocol */.
11090 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
110a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72  erp, objPtr, "pr
110b0 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74  otocol", SSL_get
110c0 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20 2d  _version(ssl), -
110d0 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f 74  1);.../* Renegot
110e0 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20 2a  iation allowed *
110f0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
11100 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11110 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 61  "renegotiation_a
11120 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65 74  llowed", SSL_get
11130 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74 69  _secure_renegoti
11140 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28 53  ation_support((S
11150 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09 2f  SL *) ssl));.../
11160 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20 6c  * Get security l
11170 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  evel */..LAPPEND
11180 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
11190 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f 6c  Ptr, "security_l
111a0 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 73  evel", SSL_get_s
111b0 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73 73  ecurity_level(ss
111c0 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  l));.../* Sessio
111d0 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50 45  n info */..LAPPE
111e0 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
111f0 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e  objPtr, "session
11200 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73 65  _reused", SSL_se
11210 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73 6c  ssion_reused(ssl
11220 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72 76  ));.../* Is serv
11230 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  er info */..LAPP
11240 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11250 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65 72   objPtr, "is_ser
11260 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65 72  ver", SSL_is_ser
11270 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  ver(ssl));.../* 
11280 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50 50  Is DTLS */..LAPP
11290 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
112a0 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74 6c   objPtr, "is_dtl
112b0 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73 28  s", SSL_is_dtls(
112c0 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ssl));.    }..  
112d0 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f    /* Cipher info
112e0 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d   */.    cipher =
112f0 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74   SSL_get_current
11300 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20  _cipher(ssl);.  
11310 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d 20    if (cipher != 
11320 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75  NULL) {..char bu
11330 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b  f[BUFSIZ] = {0};
11340 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f  ..int bits, alg_
11350 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65  bits;.../* Ciphe
11360 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
11370 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
11380 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c  bjPtr, "cipher",
11390 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
113a0 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
113b0 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65  );.../* RFC name
113c0 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c   of cipher */..L
113d0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
113e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e  p, objPtr, "stan
113f0 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f  dard_name", SSL_
11400 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f  CIPHER_standard_
11410 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31  name(cipher), -1
11420 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20  );.../* OpenSSL 
11430 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a  name of cipher *
11440 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
11450 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11460 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f  openssl_name", O
11470 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61  PENSSL_cipher_na
11480 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74  me(SSL_CIPHER_st
11490 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68  andard_name(ciph
114a0 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  er)), -1);.../* 
114b0 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74  number of secret
114c0 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20 63   bits used for c
114d0 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d  ipher */..bits =
114e0 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
114f0 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c  bits(cipher, &al
11500 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e  g_bits);..LAPPEN
11510 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
11520 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69  jPtr, "secret_bi
11530 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50  ts", bits);..LAP
11540 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11550 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69   objPtr, "algori
11560 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62  thm_bits", alg_b
11570 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69  its);../* alg_bi
11580 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79  ts is actual key
11590 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49 66   secret bits. If
115a0 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73 65   use bits and se
115b0 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29  cret (algorithm)
115c0 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20   bits differ,.. 
115d0 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68    the rest of th
115e0 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65 64  e bits are fixed
115f0 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74  , i.e. for limit
11600 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65 72  ed export cipher
11610 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f  s (bits < 56) */
11620 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20  .../* Indicates 
11630 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72  which SSL/TLS pr
11640 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66  otocol version f
11650 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68 65  irst defined the
11660 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
11670 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11680 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72  objPtr, "min_ver
11690 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45  sion", SSL_CIPHE
116a0 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69  R_get_version(ci
116b0 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  pher), -1);.../*
116c0 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09   Cipher NID */..
116d0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
116e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
116f0 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  herNID", (char *
11700 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
11710 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65  CIPHER_get_ciphe
11720 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20  r_nid(cipher)), 
11730 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
11740 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11750 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28  , "digestNID", (
11760 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
11770 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
11780 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68  _digest_nid(ciph
11790 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  er)), -1);..LAPP
117a0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
117b0 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68  objPtr, "keyExch
117c0 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20  angeNID", (char 
117d0 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
117e0 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e  _CIPHER_get_kx_n
117f0 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29  id(cipher)), -1)
11800 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
11810 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11820 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49  authenticationNI
11830 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
11840 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
11850 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63  R_get_auth_nid(c
11860 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09  ipher)), -1);...
11870 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68 65  /* message authe
11880 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d  ntication code -
11890 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44 20   Cipher is AEAD 
118a0 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61  (e.g. GCM or Cha
118b0 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20  Cha20/Poly1305) 
118c0 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75  or not */../* Au
118d0 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72  thenticated Encr
118e0 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f  yption with asso
118f0 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45 41  ciated data (AEA
11900 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50  D) check */..LAP
11910 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11920 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
11930 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f  r_is_aead", SSL_
11940 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63  CIPHER_is_aead(c
11950 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69  ipher));.../* Di
11960 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e 67  gest used during
11970 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e   the SSL/TLS han
11980 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e  dshake when usin
11990 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f  g the cipher. */
119a0 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45  ..md = SSL_CIPHE
119b0 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f  R_get_handshake_
119c0 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a  digest(cipher);.
119d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
119e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61  erp, objPtr, "ha
119f0 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c  ndshake_digest",
11a00 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f   (char *)EVP_MD_
11a10 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a  name(md), -1);..
11a20 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d  ./* Get OpenSSL-
11a30 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74  specific ID, not
11a40 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50   IANA ID */..LAP
11a50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
11a60 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
11a70 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
11a80 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69  CIPHER_get_id(ci
11a90 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f  pher));.../* Two
11aa0 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69 6e  -byte ID used in
11ab0 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f   the TLS protoco
11ac0 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63  l of the given c
11ad0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
11ae0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
11af0 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f  jPtr, "protocol_
11b00 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43  id", (int) SSL_C
11b10 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63  IPHER_get_protoc
11b20 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a  ol_id(cipher));.
11b30 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73  ../* Textual des
11b40 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
11b50 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53  cipher */..if (S
11b60 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69  SL_CIPHER_descri
11b70 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75  ption(cipher, bu
11b80 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20  f, sizeof(buf)) 
11b90 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
11ba0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11bb0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73  rp, objPtr, "des
11bc0 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20  cription", buf, 
11bd0 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  -1);..}.    }.. 
11be0 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e     /* Session in
11bf0 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f  fo */.    sessio
11c00 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73  n = SSL_get_sess
11c10 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66  ion(ssl);.    if
11c20 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c   (session != NUL
11c30 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
11c40 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65  gned char *ticke
11c50 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b  t;..size_t len2;
11c60 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75  ..unsigned int u
11c70 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  len;..const unsi
11c80 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69  gned char *sessi
11c90 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09  on_id, *proto;..
11ca0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 75  unsigned char bu
11cb0 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53  ffer[SSL_MAX_MAS
11cc0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b  TER_KEY_LENGTH];
11cd0 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
11ce0 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11cf0 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11d00 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74  f the ALPN negot
11d10 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53  iation */..SSL_S
11d20 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e  ESSION_get0_alpn
11d30 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f  _selected(sessio
11d40 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32  n, &proto, &len2
11d50 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11d60 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11d70 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29  "alpn", (char *)
11d80 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
11d90 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52  e) len2);.../* R
11da0 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74  eport the select
11db0 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61  ed protocol as a
11dc0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e   result of the N
11dd0 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  PN negotiation *
11de0 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
11df0 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f  ..SSL_get0_next_
11e00 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64  proto_negotiated
11e10 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75  (ssl, &proto, &u
11e20 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53  len);..LAPPEND_S
11e30 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11e40 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20  r, "npn", (char 
11e50 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53  *) proto, (Tcl_S
11e60 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64  ize) ulen);.#end
11e70 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c  if.../* Resumabl
11e80 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41  e session */..LA
11e90 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11ea0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75  p, objPtr, "resu
11eb0 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53  mable", SSL_SESS
11ec0 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65  ION_is_resumable
11ed0 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
11ee0 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74   Session start t
11ef0 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e  ime (seconds sin
11f00 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41  ce epoch) */..LA
11f10 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72  PPEND_LONG(inter
11f20 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72  p, objPtr, "star
11f30 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53  t_time", SSL_SES
11f40 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65  SION_get_time(se
11f50 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69  ssion));.../* Ti
11f60 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53  meout value - SS
11f70 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75  L_CTX_get_timeou
11f80 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
11f90 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
11fa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11fb0 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53  "timeout", SSL_S
11fc0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f  ESSION_get_timeo
11fd0 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  ut(session));...
11fe0 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20  /* Session id - 
11ff0 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f  TLSv1.2 and belo
12000 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69  w only */..sessi
12010 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53  on_id = SSL_SESS
12020 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69  ION_get_id(sessi
12030 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
12040 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12050 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12060 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
12070 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29  n_id, (Tcl_Size)
12080 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73   ulen);.../* Ses
12090 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sion context */.
120a0 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53  .session_id = SS
120b0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69  L_SESSION_get0_i
120c0 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f  d_context(sessio
120d0 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  n, &ulen);..LAPP
120e0 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72  END_BARRAY(inter
120f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73  p, objPtr, "sess
12100 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65  ion_context", se
12110 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
12120 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a  ize) ulen);.../*
12130 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20   Session ticket 
12140 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f  - client only */
12150 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65  ..SSL_SESSION_ge
12160 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f  t0_ticket(sessio
12170 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e  n, &ticket, &len
12180 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  2);..LAPPEND_BAR
12190 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
121a0 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63  tr, "session_tic
121b0 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54  ket", ticket, (T
121c0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
121d0 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63  ../* Session tic
121e0 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e  ket lifetime hin
121f0 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a  t (in seconds) *
12200 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
12210 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12220 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f  "lifetime", SSL_
12230 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b  SESSION_get_tick
12240 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74  et_lifetime_hint
12250 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
12260 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74 61   Ticket app data
12270 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
12280 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
12290 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53   0x30000000L..SS
122a0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74  L_SESSION_get0_t
122b0 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53  icket_appdata((S
122c0 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65  SL_SESSION *) se
122d0 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20  ssion, &ticket, 
122e0 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
122f0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
12300 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f  objPtr, "ticket_
12310 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65  app_data", ticke
12320 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
12330 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a  n2);.#endif.../*
12340 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20   Get master key 
12350 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53  */..len2 = SSL_S
12360 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65  ESSION_get_maste
12370 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62  r_key(session, b
12380 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d  uffer, SSL_MAX_M
12390 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
123a0 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52  );..LAPPEND_BARR
123b0 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  AY(interp, objPt
123c0 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c  r, "master_key",
123d0 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69   buffer, (Tcl_Si
123e0 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
123f0 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a  Compression id *
12400 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  /..unsigned int 
12410 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e  id = SSL_SESSION
12420 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64  _get_compress_id
12430 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50  (session);..LAPP
12440 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12450 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
12460 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20  sion_id", id == 
12470 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f  1 ? "zlib" : "no
12480 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a  ne", -1);.    }.
12490 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73  .    /* Compress
124a0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
124b0 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
124c0 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53   {.#ifdef HAVE_S
124d0 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09  SL_COMPRESSION..
124e0 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f  const COMP_METHO
124f0 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a  D *comp, *expn;.
12500 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f  .comp = SSL_get_
12510 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73  current_compress
12520 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20  ion(ssl);..expn 
12530 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
12540 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29  t_expansion(ssl)
12550 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  ;...LAPPEND_STR(
12560 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12570 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63  "compression", c
12580 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67  omp ? SSL_COMP_g
12590 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20  et_name(comp) : 
125a0 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41  "none", -1);..LA
125b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
125c0 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e  , objPtr, "expan
125d0 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53  sion", expn ? SS
125e0 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28  L_COMP_get_name(
125f0 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20  expn) : "none", 
12600 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50  -1);.#else..LAPP
12610 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
12620 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73  objPtr, "compres
12630 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d  sion", "none", -
12640 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
12650 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12660 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e   "expansion", "n
12670 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69  one", -1);.#endi
12680 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  f.    }..    /* 
12690 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20  Server info */. 
126a0 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20     {..long mode 
126b0 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65  = SSL_CTX_get_se
126c0 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65  ssion_cache_mode
126d0 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
126e0 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69  ..char *msg;...i
126f0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
12700 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a  SS_CACHE_OFF) {.
12710 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22  .    msg = "off"
12720 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
12730 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
12740 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20  CHE_CLIENT) {.. 
12750 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74     msg = "client
12760 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12770 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12780 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09  ACHE_SERVER) {..
12790 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65      msg = "serve
127a0 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  r";..} else if (
127b0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
127c0 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20  CACHE_BOTH) {.. 
127d0 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b     msg = "both";
127e0 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
127f0 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b  msg = "unknown";
12800 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  ..}..LAPPEND_STR
12810 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12820 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f   "session_cache_
12830 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b  mode", msg, -1);
12840 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
12850 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a  A List */.    /*
12860 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72   IF not a server
12870 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65  , same as SSL_ge
12880 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e  t0_peer_CA_list.
12890 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65 20   If server same 
128a0 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63  as SSL_CTX_get_c
128b0 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f  lient_CA_list */
128c0 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54  .    listPtr = T
128d0 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
128e0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43   NULL);.    STAC
128f0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20  K_OF(X509_NAME) 
12900 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66  *ca_list;.    if
12910 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c   ((ca_list = SSL
12920 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c  _get_client_CA_l
12930 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c  ist(ssl)) != NUL
12940 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65  L) {..char buffe
12950 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20  r[BUFSIZ];..for 
12960 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
12970 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d  sk_X509_NAME_num
12980 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20  (ca_list); i++) 
12990 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45  {..    X509_NAME
129a0 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39   *name = sk_X509
129b0 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c  _NAME_value(ca_l
129c0 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66  ist, i);..    if
129d0 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39   (name) {...X509
129e0 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61  _NAME_oneline(na
129f0 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53  me, buffer, BUFS
12a00 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f  IZ);...Tcl_ListO
12a10 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
12a20 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c  interp, listPtr,
12a30 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
12a40 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a  j(buffer, -1));.
12a50 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
12a60 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28      LAPPEND_OBJ(
12a70 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12a80 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74  "caList", listPt
12a90 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f  r);.    LAPPEND_
12aa0 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12ab0 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74  tr, "caListCount
12ac0 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f  ", sk_X509_NAME_
12ad0 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a  num(ca_list));..
12ae0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
12af0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
12b00 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
12b10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a   TCL_OK;.}.../*.
12b20 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
12b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b60 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73  -----. *. * Vers
12b70 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74  ionObjCmd -- ret
12b80 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69  urn version stri
12b90 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e  ng from OpenSSL.
12ba0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
12bb0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
12bc0 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
12bd0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
12be0 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
12bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
12c30 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56   */.static int.V
12c40 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69  ersionObjCmd(Cli
12c50 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
12c60 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
12c70 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
12c80 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
12c90 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
12ca0 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a  cl_Obj *objPtr;.
12cb0 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
12cc0 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64  tData;.    (void
12cd0 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69  ) objc;.    (voi
12ce0 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70  d) objv;..    dp
12cf0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
12d00 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
12d10 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
12d20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12d30 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54  TEXT, -1);.    T
12d40 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
12d50 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
12d60 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
12d70 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
12d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12dc0 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43  -. *. * MiscObjC
12dd0 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61  md -- misc comma
12de0 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nds. *. * Result
12df0 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
12e00 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a   Tcl result.. *.
12e10 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
12e20 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  . *.None.. *. *-
12e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12e70 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
12e80 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69  t.MiscObjCmd(Cli
12e90 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
12ea0 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
12eb0 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
12ec0 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
12ed0 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73   objv[]) {.    s
12ee0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
12ef0 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20   *commands [] = 
12f00 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65 71  { "req", "strreq
12f10 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65  ", NULL };.    e
12f20 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f  num command { C_
12f30 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43  REQ, C_STRREQ, C
12f40 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63  _DUMMY };.    Tc
12f50 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20  l_Size cmd;.    
12f60 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63  int isStr;.    c
12f70 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38 34  har buffer[16384
12f80 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  ];.    (void) cl
12f90 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
12fa0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
12fb0 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
12fc0 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  < 2) {..Tcl_Wron
12fd0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
12fe0 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f   1, objv, "subco
12ff0 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a  mmand ?args?");.
13000 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13010 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  R;.    }.    if 
13020 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f  (Tcl_GetIndexFro
13030 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
13040 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20  v[1], commands, 
13050 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63  "command", 0, &c
13060 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  md) != TCL_OK) {
13070 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
13080 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
13090 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
130a0 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28  ;..    isStr = (
130b0 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29  cmd == C_STRREQ)
130c0 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28 65  ;.    switch ((e
130d0 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64  num command) cmd
130e0 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a  ) {..case C_REQ:
130f0 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a  ..case C_STRREQ:
13100 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59   {..    EVP_PKEY
13110 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20   *pkey=NULL;..  
13120 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c    X509 *cert=NUL
13130 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d  L;..    X509_NAM
13140 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20  E *name=NULL;.. 
13150 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73     Tcl_Obj **lis
13160 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a  tv;..    Tcl_Siz
13170 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e  e listc;..    in
13180 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a  t i;...    BIO *
13190 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20  out=NULL;...    
131a0 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f  char *k_C="",*k_
131b0 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b  ST="",*k_L="",*k
131c0 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a  _O="",*k_OU="",*
131d0 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c  k_CN="",*k_Email
131e0 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a  ="";..    char *
131f0 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a  keyout,*pemout,*
13200 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65  str;..    int ke
13210 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64  ysize,serial=0,d
13220 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50  ays=365;..#if OP
13230 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
13240 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30  MBER < 0x3000000
13250 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a  0L..    BIGNUM *
13260 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20  bne = NULL;..   
13270 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c   RSA *rsa = NULL
13280 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50  ;.#else..    EVP
13290 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d  _PKEY_CTX *ctx =
132a0 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09   NULL;.#endif...
132b0 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29      if ((objc<5)
132c0 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a   || (objc>6)) {.
132d0 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72  ..Tcl_WrongNumAr
132e0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
132f0 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79  jv, "keysize key
13300 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69  file certfile ?i
13310 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e  nfo?");...return
13320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
13330 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c   }...    if (Tcl
13340 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
13350 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
13360 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c  &keysize) != TCL
13370 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  _OK) {...return 
13380 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
13390 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63  }..    keyout=Tc
133a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
133b0 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75  [3]);..    pemou
133c0 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  t=Tcl_GetString(
133d0 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69  objv[4]);..    i
133e0 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63  f (isStr) {...Tc
133f0 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
13400 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09  keyout,"",0);...
13410 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
13420 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,pemout,"",0);.
13430 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
13440 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66  (objc>=6) {...if
13450 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
13460 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
13470 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63   objv[5], &listc
13480 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c  , &listv) != TCL
13490 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74  _OK) {...    ret
134a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
134b0 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63  .}....if ((listc
134c0 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20  %2) != 0) {...  
134d0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
134e0 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74  interp,"Informat
134f0 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61  ion list must ha
13500 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f  ve even number o
13510 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c  f arguments",NUL
13520 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e  L);...    return
13530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a   TCL_ERROR;...}.
13540 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69  ..for (i=0; i<li
13550 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20  stc; i+=2) {... 
13560 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74     str=Tcl_GetSt
13570 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a  ring(listv[i]);.
13580 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d 70  ..    if (strcmp
13590 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29  (str,"days")==0)
135a0 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
135b0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
135c0 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64  rp,listv[i+1],&d
135d0 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ays)!=TCL_OK)...
135e0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
135f0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
13600 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
13610 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29  tr,"serial")==0)
13620 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65   {....if (Tcl_Ge
13630 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
13640 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73  rp,listv[i+1],&s
13650 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a  erial)!=TCL_OK).
13660 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
13670 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
13680 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
13690 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a  (str,"C")==0) {.
136a0 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74  ...k_C=Tcl_GetSt
136b0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
136c0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
136d0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53  f (strcmp(str,"S
136e0 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53  T")==0) {....k_S
136f0 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  T=Tcl_GetString(
13700 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
13710 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
13720 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30  rcmp(str,"L")==0
13730 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47  ) {....k_L=Tcl_G
13740 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13750 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13760 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13770 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09  r,"O")==0) {....
13780 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  k_O=Tcl_GetStrin
13790 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
137a0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
137b0 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29  strcmp(str,"OU")
137c0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54  ==0) {....k_OU=T
137d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
137e0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
137f0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
13800 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20  p(str,"CN")==0) 
13810 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65  {....k_CN=Tcl_Ge
13820 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b  tString(listv[i+
13830 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  1]);...    } els
13840 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
13850 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a  ,"Email")==0) {.
13860 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47  ...k_Email=Tcl_G
13870 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13880 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13890 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52  se {....Tcl_SetR
138a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e  esult(interp,"Un
138b0 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22  known parameter"
138c0 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72  ,NULL);....retur
138d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20  n TCL_ERROR;... 
138e0 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a     }...}..    }.
138f0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
13900 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
13910 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62  30000000L..    b
13920 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09  ne = BN_new();..
13930 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65      rsa = RSA_ne
13940 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d  w();..    pkey =
13950 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b   EVP_PKEY_new();
13960 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d  ..    if (bne ==
13970 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20   NULL || rsa == 
13980 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20  NULL || pkey == 
13990 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f  NULL || !BN_set_
139a0 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29  word(bne,RSA_F4)
139b0 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72   ||...!RSA_gener
139c0 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20  ate_key_ex(rsa, 
139d0 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55  keysize, bne, NU
139e0 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  LL) || !EVP_PKEY
139f0 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79  _assign_RSA(pkey
13a00 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f  , rsa)) {...EVP_
13a10 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13a20 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72  .../* RSA_free(r
13a30 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45 56  sa); freed by EV
13a40 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09  P_PKEY_free */..
13a50 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23  .BN_free(bne);.#
13a60 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d  else..    pkey =
13a70 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e   EVP_RSA_gen((un
13a80 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73  signed int) keys
13a90 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d  ize);..    ctx =
13aa0 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
13ab0 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20  w(pkey,NULL);.. 
13ac0 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e     if (pkey == N
13ad0 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55  ULL || ctx == NU
13ae0 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f  LL || !EVP_PKEY_
13af0 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29  keygen_init(ctx)
13b00 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f   ||...!EVP_PKEY_
13b10 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67  CTX_set_rsa_keyg
13b20 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79  en_bits(ctx, key
13b30 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b  size) || !EVP_PK
13b40 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26  EY_keygen(ctx, &
13b50 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50  pkey)) {...EVP_P
13b60 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
13b70 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66  ..EVP_PKEY_CTX_f
13b80 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66  ree(ctx);.#endif
13b90 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  ...Tcl_SetResult
13ba0 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67  (interp,"Error g
13bb0 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61 74  enerating privat
13bc0 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09  e key",NULL);...
13bd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13be0 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
13bf0 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09  ..if (isStr) {..
13c00 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77  .    out=BIO_new
13c10 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09  (BIO_s_mem());..
13c20 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62  .    PEM_write_b
13c30 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75  io_PrivateKey(ou
13c40 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c  t,pkey,NULL,NULL
13c50 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09  ,0,NULL,NULL);..
13c60 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28  .    i=BIO_read(
13c70 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f  out,buffer,sizeo
13c80 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09  f(buffer)-1);...
13c90 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20      i=(i<0) ? 0 
13ca0 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65  : i;...    buffe
13cb0 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20  r[i]='\0';...   
13cc0 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65   Tcl_SetVar(inte
13cd0 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72  rp,keyout,buffer
13ce0 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ,0);...    BIO_f
13cf0 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20  lush(out);...   
13d00 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a   BIO_free(out);.
13d10 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
13d20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f   out=BIO_new(BIO
13d30 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20  _s_file());...  
13d40 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65    BIO_write_file
13d50 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29  name(out,keyout)
13d60 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
13d70 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79  e_bio_PrivateKey
13d80 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e  (out,pkey,NULL,N
13d90 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29  ULL,0,NULL,NULL)
13da0 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77  ;...    /* PEM_w
13db0 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76  rite_bio_RSAPriv
13dc0 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c  ateKey(out, rsa,
13dd0 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20   NULL, NULL, 0, 
13de0 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a  NULL, NULL); */.
13df0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
13e00 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09  ll(out);.. .}...
13e10 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f  .if ((cert=X509_
13e20 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a  new())==NULL) {.
13e30 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ..    Tcl_SetRes
13e40 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f  ult(interp,"Erro
13e50 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72  r generating cer
13e60 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73 74  tificate request
13e70 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45  ",NULL);...    E
13e80 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
13e90 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
13ea0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
13eb0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
13ec0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
13ed0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65  .#endif...    re
13ee0 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
13ef0 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74  ...}....X509_set
13f00 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32 29  _version(cert,2)
13f10 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45 52  ;...ASN1_INTEGER
13f20 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73 65  _set(X509_get_se
13f30 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74 29  rialNumber(cert)
13f40 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30 39  ,serial);...X509
13f50 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
13f60 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28  _getm_notBefore(
13f70 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30 39  cert),0);...X509
13f80 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30 39  _gmtime_adj(X509
13f90 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63  _getm_notAfter(c
13fa0 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30  ert),(long)60*60
13fb0 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35 30  *24*days);...X50
13fc0 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65 72  9_set_pubkey(cer
13fd0 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65  t,pkey);....name
13fe0 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65 63  =X509_get_subjec
13ff0 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09  t_name(cert);...
14000 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
14010 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
14020 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"C", MBSTRING_A
14030 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
14040 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c  ned char *) k_C,
14050 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
14060 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
14070 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
14080 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  ST", MBSTRING_AS
14090 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
140a0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c  ed char *) k_ST,
140b0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
140c0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
140d0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
140e0 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  L", MBSTRING_ASC
140f0 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14100 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d  d char *) k_L, -
14110 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30  1, -1, 0);...X50
14120 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79  9_NAME_add_entry
14130 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22  _by_txt(name,"O"
14140 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
14150 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14160 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c  char *) k_O, -1,
14170 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14180 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14190 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c  y_txt(name,"OU",
141a0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
141b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
141c0 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c  har *) k_OU, -1,
141d0 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
141e0 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
141f0 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c  y_txt(name,"CN",
14200 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
14210 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
14220 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c  har *) k_CN, -1,
14230 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f   -1, 0);...X509_
14240 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62  NAME_add_entry_b
14250 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69  y_txt(name,"Emai
14260 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43  l", MBSTRING_ASC
14270 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  , (const unsigne
14280 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69  d char *) k_Emai
14290 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a  l, -1, -1, 0);..
142a0 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a 65  ..X509_set_subje
142b0 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d  ct_name(cert,nam
142c0 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30 39  e);....if (!X509
142d0 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c  _sign(cert,pkey,
142e0 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20 7b  EVP_sha256())) {
142f0 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65 65  ...    X509_free
14300 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45 56  (cert);...    EV
14310 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
14320 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
14330 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
14340 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20  0x30000000L...  
14350 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a    BN_free(bne);.
14360 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63 6c  #endif...    Tcl
14370 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14380 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e 67  p,"Error signing
14390 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e 55   certificate",NU
143a0 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
143b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
143c0 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  ....if (isStr) {
143d0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
143e0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
143f0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14400 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65  _bio_X509(out,ce
14410 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f  rt);...    i=BIO
14420 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72  _read(out,buffer
14430 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d  ,sizeof(buffer)-
14440 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30  1);...    i=(i<0
14450 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20  ) ? 0 : i;...   
14460 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b   buffer[i]='\0';
14470 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61  ...    Tcl_SetVa
14480 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c  r(interp,pemout,
14490 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20  buffer,0);...   
144a0 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b   BIO_flush(out);
144b0 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28  ...    BIO_free(
144c0 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b  out);...} else {
144d0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
144e0 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29  ew(BIO_s_file())
144f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74  ;...    BIO_writ
14500 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70  e_filename(out,p
14510 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45  emout);...    PE
14520 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30 39  M_write_bio_X509
14530 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20 20  (out,cert);...  
14540 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f    BIO_free_all(o
14550 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ut);...}....X509
14560 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 45  _free(cert);...E
14570 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14580 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14590 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
145a0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 42   0x30000000L...B
145b0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
145c0 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62  dif..    }..}..b
145d0 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
145e0 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  t:..break;.    }
145f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14600 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a  OK;.}.../*******
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f  *************/./
14620 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20 20  * Init          
14630 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a     */./*********
14640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
14650 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14660 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14670 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14690 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
146a0 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Free --. *. *.T
146b0 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c  his procedure cl
146c0 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53  eans up when a S
146d0 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20  SL socket based 
146e0 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c  channel. *.is cl
146f0 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66  osed and its ref
14700 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c  erence count fal
14710 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a  ls below 1. *. *
14720 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e   Results:. *.non
14730 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
14740 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61  ects:. *.Frees a
14750 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a  ll the state. *.
14760 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
14770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147a0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54  -----. */.void.T
147b0 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62 6c  ls_Free(char *bl
147c0 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53 74  ockPtr) {.    St
147d0 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20  ate *statePtr = 
147e0 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74  (State *)blockPt
147f0 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  r;..    dprintf(
14800 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
14810 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65 50  Tls_Clean(stateP
14820 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65 28  tr);.    ckfree(
14830 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f  blockPtr);.}.../
14840 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14880 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
14890 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a  s_Clean --. *. *
148a0 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
148b0 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61  cleans up when a
148c0 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65   SSL socket base
148d0 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20  d channel. *.is 
148e0 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72  closed and its r
148f0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
14900 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20 54  alls below 1.  T
14910 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65  his should. *.be
14920 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e   called synchron
14930 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c 6f  ously by the Clo
14940 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74  seProc, not in t
14950 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79  he. *.Eventually
14960 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20  Free callback.. 
14970 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
14980 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
14990 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
149a0 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
149b0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
149c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
149f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
14a00 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61  id Tls_Clean(Sta
14a10 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a  te *statePtr) {.
14a20 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14a30 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  led");..    /*. 
14a40 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75      * we're assu
14a50 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77  ming here that w
14a60 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65  e're single-thre
14a70 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  aded.     */.   
14a80 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74   if (statePtr->t
14a90 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d  imer != (Tcl_Tim
14aa0 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b  erToken) NULL) {
14ab0 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65  ..Tcl_DeleteTime
14ac0 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74  rHandler(statePt
14ad0 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74  r->timer);..stat
14ae0 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55  ePtr->timer = NU
14af0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
14b00 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
14b10 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73  tos) {..ckfree(s
14b20 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
14b30 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
14b40 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tos = NULL;.    
14b50 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  }.    if (stateP
14b60 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20 54  tr->bio) {../* T
14b70 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53 53  his will call SS
14b80 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67 20  L_shutdown. Bug 
14b90 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72 69  1414045 */..dpri
14ba0 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61 6c  ntf("BIO_free_al
14bb0 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72  l(%p)", statePtr
14bc0 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72 65  ->bio);..BIO_fre
14bd0 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d 3e  e_all(statePtr->
14be0 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  bio);..statePtr-
14bf0 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >bio = NULL;.   
14c00 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14c10 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72  Ptr->ssl) {..dpr
14c20 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28 25  intf("SSL_free(%
14c30 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
14c40 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73  sl);..SSL_free(s
14c50 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09  tatePtr->ssl);..
14c60 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
14c70 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
14c80 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74  if (statePtr->ct
14c90 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72  x) {..SSL_CTX_fr
14ca0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ee(statePtr->ctx
14cb0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74  );..statePtr->ct
14cc0 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  x = NULL;.    }.
14cd0 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
14ce0 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09 54  ->callback) {..T
14cf0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
14d00 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
14d10 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  ck);..statePtr->
14d20 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b  callback = NULL;
14d30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73  .    }.    if (s
14d40 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
14d50 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65  d) {..Tcl_DecrRe
14d60 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d  fCount(statePtr-
14d70 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74 61  >password);..sta
14d80 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
14d90 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  = NULL;.    }.  
14da0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
14db0 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  vcmd) {..Tcl_Dec
14dc0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
14dd0 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61 74  tr->vcmd);..stat
14de0 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c  ePtr->vcmd = NUL
14df0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  L;.    }..    dp
14e00 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67  rintf("Returning
14e10 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c 5f  ");.}...#if TCL_
14e20 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20  MAJOR_VERSION > 
14e30 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45  8.#define MIN_VE
14e40 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73  RSION "9.0".#els
14e50 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45  e.#define MIN_VE
14e60 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64  RSION "8.5".#end
14e70 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  if../*. *-------
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 2d 0a 20 2a 0a  ------------. *.
14ec0 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20   * Tls_Init --. 
14ed0 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20 70  *. *.This is a p
14ee0 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a  ackage initializ
14ef0 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c  ation procedure,
14f00 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64   which is called
14f10 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e 20  . *.by Tcl when 
14f20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73 20  this package is 
14f30 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 61  to be added to a
14f40 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20  n interpreter.. 
14f50 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20 53  *. * Results:  S
14f60 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61 6e  sl configured an
14f70 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20 53  d loaded. *. * S
14f80 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
14f90 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c 20   create the ssl 
14fa0 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61 6c  command, initial
14fb0 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74 0a  ize ssl context.
14fc0 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
14fd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14fe0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14ff0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15000 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c  --------. */.DLL
15010 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49  EXPORT int Tls_I
15020 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
15030 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63 6f  interp) {.    co
15040 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49  nst char tlsTclI
15050 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a  nitScript[] = {.
15060 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63  #include "tls.tc
15070 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20 7d  l.h"..0x00.    }
15080 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
15090 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65  Called");..#ifde
150a0 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
150b0 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74      if (Tcl_Init
150c0 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49  Stubs(interp, MI
150d0 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d  N_VERSION, 0) ==
150e0 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
150f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15100 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
15110 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28  (Tcl_PkgRequire(
15120 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d  interp, "Tcl", M
15130 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
15140 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
15150 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15160 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c   }..    if (TlsL
15170 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43 4c  ibInit(0) != TCL
15180 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  _OK) {..Tcl_Appe
15190 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
151a0 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74   "could not init
151b0 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61  ialize SSL libra
151c0 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ry", (char *) NU
151d0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
151e0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
151f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15200 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15210 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20  "tls::ciphers", 
15220 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28  CiphersObjCmd, (
15230 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
15240 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
15250 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
15260 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
15270 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
15280 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  "tls::connection
15290 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
152a0 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
152b0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
152c0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
152d0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
152e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
152f0 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a  d(interp, "tls::
15300 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64  handshake", Hand
15310 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c  shakeObjCmd, (Cl
15320 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
15330 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15340 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15350 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15360 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15370 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70  ls::import", Imp
15380 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
15390 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
153a0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
153b0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
153c0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
153d0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
153e0 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e 69  ::unimport", Uni
153f0 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c  mportObjCmd, (Cl
15400 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
15410 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
15420 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
15430 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
15440 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
15450 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61  ls::status", Sta
15460 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  tusObjCmd, (Clie
15470 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
15480 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15490 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
154a0 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
154b0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
154c0 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
154d0 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ionObjCmd, (Clie
154e0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
154f0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
15500 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
15510 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
15520 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  and(interp, "tls
15530 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a  ::misc", MiscObj
15540 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
15550 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
15560 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
15570 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
15580 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
15590 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f 74  terp, "tls::prot
155a0 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c  ocols", Protocol
155b0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
155c0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
155d0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
155e0 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66  ) NULL);..    if
155f0 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63 6c   (interp) {..Tcl
15600 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c  _Eval(interp, tl
15610 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 3b  sTclInitScript);
15620 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
15630 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64  rn Tcl_PkgProvid
15640 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47  e(interp, PACKAG
15650 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f  E_NAME, PACKAGE_
15660 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a  VERSION);.}../*.
15670 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
15680 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
156b0 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a  Tls_SafeInit --.
156c0 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *.----------
156d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156f0 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e 64  ------*. *.Stand
15700 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72 65  ard procedure re
15710 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64 27  quired by 'load'
15720 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73  .. *.Initializes
15730 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e 20   this extension 
15740 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65 72  for a safe inter
15750 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d 2d  preter.. *.-----
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 2d 2d 2d 2d 2d  ----------------
15780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a  -----------*. *.
15790 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a   *.Side effects:
157a0 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73 5f  . *..As of 'Tls_
157b0 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73 75  Init'. *. *.Resu
157c0 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64 61  lt:. *..A standa
157d0 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f 64  rd Tcl error cod
157e0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15820 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e   */.DLLEXPORT in
15830 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54  t Tls_SafeInit(T
15840 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
15850 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66  p) {.    dprintf
15860 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20  ("Called");.    
15870 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74 28  return(Tls_Init(
15880 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a 0a  interp));.}../*.
15890 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09  --------*. *. *.
158d0 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a  TlsLibInit --. *
158e0 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *.------------
158f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15910 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61 6c  ----*. *.Initial
15920 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
15930 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
15940 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d  ation. *.-------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15980 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20  .Side effects:. 
15990 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20 53  *..initializes S
159a0 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a  SL library. *. *
159b0 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f 6e  .Result:. *..non
159c0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20  -------------*. 
15a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c  */.static int Tl
15a10 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e 69  sLibInit(int uni
15a20 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20 20  nitialize) {.   
15a30 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74   static int init
15a40 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20 20  ialized = 0;.   
15a50 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54 43   int status = TC
15a60 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e 65  L_OK;.#if define
15a70 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41 44  d(OPENSSL_THREAD
15a80 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54 43  S) && defined(TC
15a90 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20 73  L_THREADS).    s
15aa0 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73 3b  ize_t num_locks;
15ab0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20  .#endif..    if 
15ac0 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b  (uninitialize) {
15ad0 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a  ..if (!initializ
15ae0 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69 6e  ed) {..    dprin
15af0 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e 69  tf("Asked to uni
15b00 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20 77  nitialize, but w
15b10 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69 61  e are not initia
15b20 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20 72  lized");...    r
15b30 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a 09  eturn(TCL_OK);..
15b40 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73 6b  }...dprintf("Ask
15b50 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c 69  ed to uninitiali
15b60 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e  ze");..#if defin
15b70 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
15b80 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
15b90 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63 6c  CL_THREADS)..Tcl
15ba0 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74  _MutexLock(&init
15bb0 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63 6b  _mx);...if (lock
15bc0 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28 6c  s) {..    free(l
15bd0 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63 6b  ocks);..    lock
15be0 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 6c  s = NULL;..    l
15bf0 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a 09  ocksCount = 0;..
15c00 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69 61  }.#endif..initia
15c10 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20  lized = 0;..#if 
15c20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
15c30 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66 69  THREADS) && defi
15c40 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29  ned(TCL_THREADS)
15c50 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63  ..Tcl_MutexUnloc
15c60 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e  k(&init_mx);.#en
15c70 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43 4c  dif...return(TCL
15c80 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _OK);.    }..   
15c90 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65 64   if (initialized
15ca0 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43 61  ) {..dprintf("Ca
15cb0 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67 20  lled, but using 
15cc0 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b 0a  cached value");.
15cd0 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29 3b  .return(status);
15ce0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
15cf0 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
15d00 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15d10 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15d20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15d30 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75 74  ADS).    Tcl_Mut
15d40 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78 29  exLock(&init_mx)
15d50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e 69  ;.#endif.    ini
15d60 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a 23  tialized = 1;..#
15d70 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  if defined(OPENS
15d80 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20 64  SL_THREADS) && d
15d90 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41  efined(TCL_THREA
15da0 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63 6b  DS).    num_lock
15db0 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 73  s = 1;.    locks
15dc0 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e 75  Count = (int) nu
15dd0 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f 63  m_locks;.    loc
15de0 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a 65  ks = malloc(size
15df0 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75 6d  of(*locks) * num
15e00 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65 6d  _locks);.    mem
15e10 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73 69  set(locks, 0, si
15e20 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e  zeof(*locks) * n
15e30 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64 69  um_locks);.#endi
15e40 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61  f..    /* Initia
15e50 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79  lize BOTH libcry
15e60 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20  pto and libssl. 
15e70 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f 69  */.    OPENSSL_i
15e80 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f  nit_ssl(OPENSSL_
15e90 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54  INIT_LOAD_SSL_ST
15ea0 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  RINGS | OPENSSL_
15eb0 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f  INIT_LOAD_CRYPTO
15ec0 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45 4e  _STRINGS..| OPEN
15ed0 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
15ee0 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53  _CIPHERS | OPENS
15ef0 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
15f00 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b 0a  DIGESTS, NULL);.
15f10 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63 6c  .    BIO_new_tcl
15f20 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66 20  (NULL, 0);..#if 
15f30 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  0.    /*.     * 
15f40 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76 65  XXX:TODO: Remove
15f50 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20 72   this code and r
15f60 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20 61  eplace it with a
15f70 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66 6f   check.     * fo
15f80 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70 79  r enough entropy
15f90 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79 20   and do not try 
15fa0 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f 77  to create our ow
15fb0 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62 6c  n.     * terribl
15fc0 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20 2a  e entropy.     *
15fd0 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  /.    /*.     * 
15fe0 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d 20  Seed the random 
15ff0 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
16000 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62 72   in the SSL libr
16010 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69 6e  ary,.     * usin
16020 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20 63  g the do/while c
16030 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73 65  onstruct because
16040 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74 65   of the bug note
16050 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 4f   in the.     * O
16060 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68 74  penSSL FAQ at ht
16070 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73 6c  tp://www.openssl
16080 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61 71  .org/support/faq
16090 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20 20  .html#USER1.    
160a0 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63 72   *.     * The cr
160b0 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c 65  ux of the proble
160c0 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72 69  m is that Solari
160d0 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61 76  s 7 does not hav
160e0 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76 2f  e a.     * /dev/
160f0 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f 75  random or /dev/u
16100 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73 6f  random device so
16110 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68 65   it cannot gathe
16120 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a 20  r enough.     * 
16130 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68 65  entropy from the
16140 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68 65   RAND_seed() whe
16150 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a 65  n TLS initialize
16160 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20 20  s and refuses.  
16170 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74 68     * to go furth
16180 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72 73  er. Earlier vers
16190 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c 20  ions of OpenSSL 
161a0 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61 72  carried on regar
161b0 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a 20  dless..     */. 
161c0 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67 6e     srand((unsign
161d0 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74 69  ed int) time((ti
161e0 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b 0a  me_t *) NULL));.
161f0 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28 69      do {..for (i
16200 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69 2b   = 0; i < 16; i+
16210 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73 65  +) {..    rnd_se
16220 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68 61  ed[i] = 1 + (cha
16230 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e 64  r) (255.0 * rand
16240 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e 30  ()/(RAND_MAX+1.0
16250 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65 65  ));..}..RAND_see
16260 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a 65  d(rnd_seed, size
16270 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a 20  of(rnd_seed));. 
16280 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e 44     } while (RAND
16290 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29 3b  _status() != 1);
162a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
162b0 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52  ined(OPENSSL_THR
162c0 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64  EADS) && defined
162d0 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54  (TCL_THREADS)..T
162e0 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28 26  cl_MutexUnlock(&
162f0 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69 66  init_mx);.#endif
16300 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74 61  ..    return(sta
16310 74 75 73 29 3b 0a 7d 0a                          tus);.}.