Hex Artifact Content

Artifact 76576d8a94373378c6640ab5f39b772fa9d2b43b8cddcb0a8aa1d2b3e0772458:


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 65 72 72 53 74 72 20 3d 20 73 74 61 74 65  ..errStr = state
8c20: 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63 6c 5f 52  Ptr->err;..Tcl_R
8c30: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
8c40: 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e  p);..Tcl_SetErrn
8c50: 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20 28 21 65  o(err);...if (!e
8c60: 72 72 53 74 72 20 7c 7c 20 28 2a 65 72 72 53 74  rrStr || (*errSt
8c70: 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  r == 0)) {..    
8c80: 65 72 72 53 74 72 20 3d 20 54 63 6c 5f 50 6f 73  errStr = Tcl_Pos
8c90: 69 78 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b  ixError(interp);
8ca0: 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70 65 6e 64  ..}...Tcl_Append
8cb0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8cc0: 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64  handshake failed
8cd0: 3a 20 22 2c 20 65 72 72 53 74 72 2c 20 28 63 68  : ", errStr, (ch
8ce0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63  ar *) NULL);..Tc
8cf0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
8d00: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 48  nterp, "TLS", "H
8d10: 41 4e 44 53 48 41 4b 45 22 2c 20 22 46 41 49 4c  ANDSHAKE", "FAIL
8d20: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
8d30: 4c 4c 29 3b 0a 09 64 70 72 69 6e 74 66 28 22 52  LL);..dprintf("R
8d40: 65 74 75 72 6e 69 6e 67 20 54 43 4c 5f 45 52 52  eturning TCL_ERR
8d50: 4f 52 20 77 69 74 68 20 68 61 6e 64 73 68 61 6b  OR with handshak
8d60: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 65  e failed: %s", e
8d70: 72 72 53 74 72 29 3b 0a 09 72 65 74 75 72 6e 28  rrStr);..return(
8d80: 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 20 20 20 20  TCL_ERROR);.    
8d90: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 65 72  } else {..if (er
8da0: 72 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 64  r != 0) {..    d
8db0: 70 72 69 6e 74 66 28 22 47 6f 74 20 61 6e 20 65  printf("Got an e
8dc0: 72 72 6f 72 20 77 69 74 68 20 61 20 63 6f 6d 70  rror with a comp
8dd0: 6c 65 74 65 64 20 68 61 6e 64 73 68 61 6b 65 3a  leted handshake:
8de0: 20 65 72 72 20 3d 20 25 69 22 2c 20 65 72 72 29   err = %i", err)
8df0: 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31 3b 0a 20  ;..}..ret = 1;. 
8e00: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
8e10: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
8e20: 5f 4f 4b 20 77 69 74 68 20 64 61 74 61 20 5c 22  _OK with data \"
8e30: 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a 20 20 20  %i\"", ret);.   
8e40: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
8e50: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
8e60: 77 49 6e 74 4f 62 6a 28 72 65 74 29 29 3b 0a 20  wIntObj(ret));. 
8e70: 20 20 20 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b     return(TCL_OK
8e80: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
8e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8ed0: 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a 43 6d  *. * ImportObjCm
8ee0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
8ef0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
8f00: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  oked to process 
8f10: 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d 61 6e  the "ssl" comman
8f20: 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73 6c 20  d. *. *.The ssl 
8f30: 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73 20 53  command pushes S
8f40: 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77 6c 79  SL over a (newly
8f50: 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63 70 20   connected) tcp 
8f60: 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52 65 73  socket. *. * Res
8f70: 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64  ults:. *.A stand
8f80: 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a  ard Tcl result..
8f90: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
8fa0: 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66  ts:. *.May modif
8fb0: 79 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f  y the behavior o
8fc0: 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e  f an IO channel.
8fd0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
9020: 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72 74 4f  atic int.ImportO
9030: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
9040: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
9050: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9060: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
9070: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
9080: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
9090: 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
90a0: 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
90b0: 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20   a mode on. */. 
90c0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
90d0: 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73  tr;../* client s
90e0: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
90f0: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ket */.    SSL_C
9100: 54 58 20 2a 63 74 78 09 20 20 20 20 20 20 20 20  TX *ctx.        
9110: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
9120: 4f 62 6a 20 2a 73 63 72 69 70 74 09 20 20 20 20  Obj *script.    
9130: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9140: 54 63 6c 5f 4f 62 6a 20 2a 70 61 73 73 77 6f 72  Tcl_Obj *passwor
9150: 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  d.        = NULL
9160: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  ;.    Tcl_Obj *v
9170: 63 6d 64 09 20 20 20 20 20 20 20 20 3d 20 4e 55  cmd.        = NU
9180: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  LL;.    Tcl_DStr
9190: 69 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c  ing upperChannel
91a0: 54 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70  Translation, upp
91b0: 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e  erChannelBlockin
91c0: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
91d0: 6e 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68  ncoding, upperCh
91e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20  annelEOFChar;.  
91f0: 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 20 20 54    int idx;.    T
9200: 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20  cl_Size len;.   
9210: 20 69 6e 74 20 66 6c 61 67 73 09 09 20 20 20 20   int flags..    
9220: 20 20 20 20 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e      = TLS_TCL_IN
9230: 49 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76  IT;.    int serv
9240: 65 72 09 09 20 20 20 20 20 20 20 20 3d 20 30 3b  er..        = 0;
9250: 09 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f  ./* is connectio
9260: 6e 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75  n incoming or ou
9270: 74 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63  tgoing? */.    c
9280: 68 61 72 20 2a 6b 65 79 66 69 6c 65 09 20 20 20  har *keyfile.   
9290: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
92a0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 09   char *certfile.
92b0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
92c0: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
92d0: 72 20 2a 6b 65 79 20 20 09 3d 20 4e 55 4c 4c 3b  r *key  .= NULL;
92e0: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65  .    Tcl_Size ke
92f0: 79 5f 6c 65 6e 20 20 20 20 20 20 20 20 20 20 20  y_len           
9300: 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20 20 75        = 0;.    u
9310: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
9320: 72 74 20 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt         = NUL
9330: 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  L;.    Tcl_Size 
9340: 63 65 72 74 5f 6c 65 6e 20 20 20 20 20 20 20 20  cert_len        
9350: 20 20 20 20 20 20 20 20 3d 20 30 3b 0a 20 20 20          = 0;.   
9360: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 09 20   char *ciphers. 
9370: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
9380: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 73     char *ciphers
9390: 75 69 74 65 73 09 20 20 20 20 20 20 20 20 3d 20  uites.        = 
93a0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
93b0: 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d  CAfile.        =
93c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
93d0: 2a 43 41 64 69 72 09 09 20 20 20 20 20 20 20 20  *CAdir..        
93e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
93f0: 20 2a 44 48 70 61 72 61 6d 73 09 20 20 20 20 20   *DHparams.     
9400: 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63     = NULL;.    c
9410: 68 61 72 20 2a 6d 6f 64 65 6c 09 09 20 20 20 20  har *model..    
9420: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
9430: 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d 65  char *servername
9440: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
9450: 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72  ./* hostname for
9460: 20 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64   Server Name Ind
9470: 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63  ication */.    c
9480: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
9490: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 20 3d  ar *session_id =
94a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
94b0: 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c 4c  bj *alpn..= NULL
94c0: 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20 3d  ;.    int ssl2 =
94d0: 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20 20   0, ssl3 = 0;.  
94e0: 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c 20    int tls1 = 1, 
94f0: 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73 31  tls1_1 = 1, tls1
9500: 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20 3d  _2 = 1, tls1_3 =
9510: 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74   1;.    int prot
9520: 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20 2d  o = 0, level = -
9530: 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69 66  1;.    int verif
9540: 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20 3d  y = 0, require =
9550: 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31 2c   0, request = 1,
9560: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
9570: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
9580: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
9590: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
95a0: 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  ");..#if defined
95b0: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
95c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
95d0: 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20 3d  TLS1).    tls1 =
95e0: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
95f0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
9600: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
9610: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
9620: 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b 0a      tls1_1 = 0;.
9630: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
9640: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
9650: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
9660: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20  _NO_TLS1_2).    
9670: 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e 64  tls1_2 = 0;.#end
9680: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
9690: 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66  O_TLS1_3) || def
96a0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
96b0: 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73 31  TLS1_3).    tls1
96c0: 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  _3 = 0;.#endif..
96d0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32      if (objc < 2
96e0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
96f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
9700: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 20   objv, "channel 
9710: 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72 65  ?options?");..re
9720: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9730: 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63      }..    ERR_c
9740: 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20  lear_error();.. 
9750: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
9760: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
9770: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
9780: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28  omObj(objv[1], (
9790: 54 63 6c 5f 53 69 7a 65 20 2a 29 20 4e 55 4c 4c  Tcl_Size *) NULL
97a0: 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66  ), NULL);.    if
97b0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43   (chan == (Tcl_C
97c0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a  hannel) NULL) {.
97d0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
97e0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
97f0: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
9800: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
9810: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
9820: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
9830: 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
9840: 6e 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64  n);..    for (id
9850: 78 20 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a  x = 2; idx < obj
9860: 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61  c; idx++) {..cha
9870: 72 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74  r *opt = Tcl_Get
9880: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
9890: 6a 76 5b 69 64 78 5d 2c 20 28 54 63 6c 5f 53 69  jv[idx], (Tcl_Si
98a0: 7a 65 20 2a 29 4e 55 4c 4c 29 3b 0a 0a 09 69 66  ze *)NULL);...if
98b0: 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29   (opt[0] != '-')
98c0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f  ..    break;...O
98d0: 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61  PTOBJ("-alpn", a
98e0: 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  lpn);..OPTSTR("-
98f0: 63 61 64 69 72 22 2c 20 43 41 64 69 72 29 3b 0a  cadir", CAdir);.
9900: 09 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65  .OPTSTR("-cafile
9910: 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54  ", CAfile);..OPT
9920: 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63 65  BYTE("-cert", ce
9930: 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09  rt, cert_len);..
9940: 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69 6c  OPTSTR("-certfil
9950: 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a 09  e", certfile);..
9960: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 22  OPTSTR("-cipher"
9970: 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54  , ciphers);..OPT
9980: 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c 20  STR("-ciphers", 
9990: 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54  ciphers);..OPTST
99a0: 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65 73  R("-ciphersuites
99b0: 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29  ", ciphersuites)
99c0: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d  ;..OPTOBJ("-comm
99d0: 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a 09  and", script);..
99e0: 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61 6d  OPTSTR("-dhparam
99f0: 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a 09  s", DHparams);..
9a00: 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c 20  OPTBYTE("-key", 
9a10: 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09  key, key_len);..
9a20: 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c 65  OPTSTR("-keyfile
9a30: 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50  ", keyfile);..OP
9a40: 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d  TSTR("-model", m
9a50: 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22  odel);..OPTOBJ("
9a60: 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73 73  -password", pass
9a70: 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  word);..OPTBOOL(
9a80: 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  "-post_handshake
9a90: 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ", post_handshak
9aa0: 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  e);..OPTBOOL("-r
9ab0: 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73 74  equest", request
9ac0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65  );..OPTBOOL("-re
9ad0: 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65 29  quire", require)
9ae0: 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63 75  ;..OPTINT("-secu
9af0: 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76  rity_level", lev
9b00: 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  el);..OPTBOOL("-
9b10: 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72 29  server", server)
9b20: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72 76  ;..OPTSTR("-serv
9b30: 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72 6e  ername", servern
9b40: 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ame);..OPTSTR("-
9b50: 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73  session_id", ses
9b60: 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f  sion_id);..OPTBO
9b70: 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32  OL("-ssl2", ssl2
9b80: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73  );..OPTBOOL("-ss
9b90: 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54  l3", ssl3);..OPT
9ba0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c  BOOL("-tls1", tl
9bb0: 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  s1);..OPTBOOL("-
9bc0: 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29  tls1.1", tls1_1)
9bd0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9be0: 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09  1.2", tls1_2);..
9bf0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33  OPTBOOL("-tls1.3
9c00: 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54  ", tls1_3);..OPT
9c10: 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63 6f  OBJ("-validateco
9c20: 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09  mmand", vcmd);..
9c30: 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20  OPTOBJ("-vcmd", 
9c40: 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28  vcmd);...OPTBAD(
9c50: 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e  "option", "-alpn
9c60: 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69 6c  , -cadir, -cafil
9c70: 65 2c 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66  e, -cert, -certf
9c80: 69 6c 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63  ile, -cipher, -c
9c90: 69 70 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f  iphersuites, -co
9ca0: 6d 6d 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73  mmand, -dhparams
9cb0: 2c 20 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65  , -key, -keyfile
9cc0: 2c 20 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77  , -model, -passw
9cd0: 6f 72 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73  ord, -post_hands
9ce0: 68 61 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20  hake, -request, 
9cf0: 2d 72 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72  -require, -secur
9d00: 69 74 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76  ity_level, -serv
9d10: 65 72 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c  er, -servername,
9d20: 20 2d 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73   -session_id, -s
9d30: 73 6c 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73  sl2, -ssl3, -tls
9d40: 31 2c 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73  1, -tls1.1, -tls
9d50: 31 2e 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72  1.2, -tls1.3, or
9d60: 20 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e   -validatecomman
9d70: 64 22 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43  d");...return TC
9d80: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
9d90: 20 20 20 69 66 20 28 72 65 71 75 65 73 74 29 09     if (request).
9da0: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
9db0: 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43  ERIFY_CLIENT_ONC
9dc0: 45 20 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50  E | SSL_VERIFY_P
9dd0: 45 45 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71  EER;.    if (req
9de0: 75 65 73 74 20 26 26 20 72 65 71 75 69 72 65 29  uest && require)
9df0: 09 76 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56  .verify |= SSL_V
9e00: 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
9e10: 5f 50 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20  _PEER_CERT;.    
9e20: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
9e30: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76  ost_handshake).v
9e40: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
9e50: 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41  IFY_POST_HANDSHA
9e60: 4b 45 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69  KE;.    if (veri
9e70: 66 79 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79  fy == 0)..verify
9e80: 20 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f   = SSL_VERIFY_NO
9e90: 4e 45 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c  NE;..    proto |
9ea0: 3d 20 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52  = (ssl2 ? TLS_PR
9eb0: 4f 54 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20  OTO_SSL2 : 0);. 
9ec0: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c     proto |= (ssl
9ed0: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  3 ? TLS_PROTO_SS
9ee0: 4c 33 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f  L3 : 0);.    pro
9ef0: 74 6f 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c  to |= (tls1 ? TL
9f00: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30  S_PROTO_TLS1 : 0
9f10: 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  );.    proto |= 
9f20: 28 74 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52  (tls1_1 ? TLS_PR
9f30: 4f 54 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b  OTO_TLS1_1 : 0);
9f40: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
9f50: 6c 73 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_2 ? TLS_PROT
9f60: 4f 5f 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20  O_TLS1_2 : 0);. 
9f70: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
9f80: 31 5f 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_3 ? TLS_PROTO_
9f90: 54 4c 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20  TLS1_3 : 0);..  
9fa0: 20 20 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55    /* reset to NU
9fb0: 4c 4c 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69  LL if blank stri
9fc0: 6e 67 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20  ng provided */. 
9fd0: 20 20 20 69 66 20 28 63 65 72 74 20 26 26 20 21     if (cert && !
9fe0: 2a 63 65 72 74 29 09 09 20 20 20 20 20 20 20 20  *cert)..        
9ff0: 63 65 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e  cert.        = N
a000: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79  ULL;.    if (key
a010: 20 26 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20   && !*key)..    
a020: 20 20 20 20 6b 65 79 09 20 20 20 20 20 20 20 20      key.        
a030: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a040: 63 65 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65  certfile && !*ce
a050: 72 74 66 69 6c 65 29 20 20 20 20 20 20 20 20 20  rtfile)         
a060: 63 65 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b  certfile.= NULL;
a070: 0a 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
a080: 20 26 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09   && !*keyfile)..
a090: 6b 65 79 66 69 6c 65 09 20 20 20 20 20 20 20 20  keyfile.        
a0a0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a0b0: 63 69 70 68 65 72 73 20 26 26 20 21 2a 63 69 70  ciphers && !*cip
a0c0: 68 65 72 73 29 09 20 20 20 20 20 20 20 20 63 69  hers).        ci
a0d0: 70 68 65 72 73 09 20 20 20 20 20 20 20 20 3d 20  phers.        = 
a0e0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
a0f0: 70 68 65 72 73 75 69 74 65 73 20 26 26 20 21 2a  phersuites && !*
a100: 63 69 70 68 65 72 73 75 69 74 65 73 29 20 63 69  ciphersuites) ci
a110: 70 68 65 72 73 75 69 74 65 73 20 20 20 20 3d 20  phersuites    = 
a120: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41  NULL;.    if (CA
a130: 66 69 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65  file && !*CAfile
a140: 29 09 20 20 20 20 20 20 20 20 43 41 66 69 6c 65  ).        CAfile
a150: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a160: 0a 20 20 20 20 69 66 20 28 43 41 64 69 72 20 26  .    if (CAdir &
a170: 26 20 21 2a 43 41 64 69 72 29 09 20 20 20 20 20  & !*CAdir).     
a180: 20 20 20 43 41 64 69 72 09 20 20 20 20 20 20 20     CAdir.       
a190: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a1a0: 28 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44  (DHparams && !*D
a1b0: 48 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20  Hparams).       
a1c0: 20 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20   DHparams       
a1d0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a   = NULL;..    /*
a1e0: 20 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a   new SSL state *
a1f0: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09  /.    statePtr..
a200: 3d 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c  = (State *) ckal
a210: 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73  loc((unsigned) s
a220: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20  izeof(State));. 
a230: 20 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50     memset(stateP
a240: 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74  tr, 0, sizeof(St
a250: 61 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74  ate));..    stat
a260: 65 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c  ePtr->flags.= fl
a270: 61 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74  ags;.    statePt
a280: 72 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65  r->interp.= inte
a290: 72 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  rp;.    statePtr
a2a0: 2d 3e 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66  ->vflags.= verif
a2b0: 79 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  y;.    statePtr-
a2c0: 3e 65 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20  >err.= "";..    
a2d0: 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69  /* allocate scri
a2e0: 70 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63  pt */.    if (sc
a2f0: 72 69 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20  ript) {..(void) 
a300: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
a310: 6d 4f 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65  mObj(script, &le
a320: 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a  n);..if (len) {.
a330: 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
a340: 61 6c 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74  allback = script
a350: 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ;..    Tcl_IncrR
a360: 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
a370: 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a  ->callback);..}.
a380: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c      }..    /* al
a390: 6c 6f 63 61 74 65 20 70 61 73 73 77 6f 72 64 20  locate password 
a3a0: 2a 2f 0a 20 20 20 20 69 66 20 28 70 61 73 73 77  */.    if (passw
a3b0: 6f 72 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54  ord) {..(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 70 61 73 73 77 6f 72 64 2c 20 26 6c  Obj(password, &l
a3e0: 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b  en);..if (len) {
a3f0: 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ..    statePtr->
a400: 70 61 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77  password = passw
a410: 6f 72 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e  ord;..    Tcl_In
a420: 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
a430: 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a  Ptr->password);.
a440: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
a450: 20 61 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61   allocate valida
a460: 74 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  te command */.  
a470: 20 20 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28    if (vcmd) {..(
a480: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a490: 69 6e 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c  ingFromObj(vcmd,
a4a0: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a4b0: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a4c0: 72 2d 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a  r->vcmd = vcmd;.
a4d0: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a4e0: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a4f0: 76 63 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  vcmd);..}.    }.
a500: 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21  .    if (model !
a510: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d  = NULL) {..int m
a520: 6f 64 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65  ode;../* Get the
a530: 20 22 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74   "model" context
a540: 20 2a 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f   */..chan = Tcl_
a550: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
a560: 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29  p, model, &mode)
a570: 3b 0a 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28  ;..if (chan == (
a580: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
a590: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
a5a0: 65 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74  ee((char *) stat
a5b0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a5c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a5d0: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
a5e0: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
a5f0: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
a600: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
a610: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a620: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
a630: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
a640: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
a650: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
a660: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a670: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a680: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
a690: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
a6a0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
a6b0: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
a6c0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20  nnel", NULL);.. 
a6d0: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
a6e0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
a6f0: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48  ", "IMPORT", "CH
a700: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
a710: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
a720: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
a730: 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50  ((char *) stateP
a740: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
a750: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09   TCL_ERROR;..}..
a760: 63 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29  ctx = ((State *)
a770: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
a780: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29  stanceData(chan)
a790: 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c  )->ctx;.    } el
a7a0: 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d  se {..if ((ctx =
a7b0: 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50   CTX_Init(stateP
a7c0: 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74  tr, server, prot
a7d0: 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74  o, keyfile, cert
a7e0: 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c  file, key, cert,
a7f0: 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 0a   (int) key_len,.
a800: 09 20 20 20 20 28 69 6e 74 29 20 63 65 72 74 5f  .    (int) cert_
a810: 6c 65 6e 2c 20 43 41 64 69 72 2c 20 43 41 66 69  len, CAdir, CAfi
a820: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70  le, ciphers, cip
a830: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c  hersuites, level
a840: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20  , DHparams)) == 
a850: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
a860: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
a870: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
a880: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a890: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ..}.    }..    s
a8a0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63  tatePtr->ctx = c
a8b0: 74 78 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  tx;..    /*.    
a8c0: 20 2a 20 57 65 20 6e 65 65 64 20 74 6f 20 6d 61   * We need to ma
a8d0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
a8e0: 20 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69   channel works i
a8f0: 6e 20 62 69 6e 61 72 79 20 28 66 6f 72 20 74 68  n binary (for th
a900: 65 0a 20 20 20 20 20 2a 20 65 6e 63 72 79 70 74  e.     * encrypt
a910: 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65 74 20 67  ion not to get g
a920: 6f 6f 66 65 64 20 75 70 29 2e 0a 20 20 20 20 20  oofed up)..     
a930: 2a 20 57 65 20 6f 6e 6c 79 20 77 61 6e 74 20 74  * We only want t
a940: 6f 20 61 64 6a 75 73 74 20 74 68 65 20 62 75 66  o adjust the buf
a950: 66 65 72 69 6e 67 20 69 6e 20 70 72 65 2d 76 32  fering in pre-v2
a960: 20 63 68 61 6e 6e 65 6c 73 2c 20 77 68 65 72 65   channels, where
a970: 0a 20 20 20 20 20 2a 20 65 61 63 68 20 63 68 61  .     * each cha
a980: 6e 6e 65 6c 20 69 6e 20 74 68 65 20 73 74 61 63  nnel in the stac
a990: 6b 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 74 73  k maintained its
a9a0: 20 6f 77 6e 20 62 75 66 66 65 72 73 2e 0a 20 20   own buffers..  
a9b0: 20 20 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53     */.    Tcl_DS
a9c0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
a9d0: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
a9e0: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
a9f0: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
aa00: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b  hannelBlocking);
aa10: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
aa20: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
aa30: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
aa40: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
aa50: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
aa60: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
aa70: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
aa80: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
aa90: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65  -eofchar", &uppe
aaa0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
aab0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
aac0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
aad0: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f 64  p, chan, "-encod
aae0: 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ing", &upperChan
aaf0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20 20  nelEncoding);.  
ab00: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
ab10: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
ab20: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
ab30: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
ab40: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
ab50: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
ab60: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
ab70: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
ab80: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
ab90: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
aba0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
abb0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
abc0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
abd0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20  ", "binary");.  
abe0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
abf0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
ac00: 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  han, "-blocking"
ac10: 2c 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 64  , "true");.    d
ac20: 70 72 69 6e 74 66 28 22 43 6f 6e 73 75 6d 69 6e  printf("Consumin
ac30: 67 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 25 73  g Tcl channel %s
ac40: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
ac50: 6c 4e 61 6d 65 28 63 68 61 6e 29 29 3b 0a 20 20  lName(chan));.  
ac60: 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66    statePtr->self
ac70: 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e   = Tcl_StackChan
ac80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 6c 73 5f  nel(interp, Tls_
ac90: 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 2c 20 28  ChannelType(), (
aca0: 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74  ClientData) stat
acb0: 65 50 74 72 2c 0a 09 28 54 43 4c 5f 52 45 41 44  ePtr,..(TCL_READ
acc0: 41 42 4c 45 20 7c 20 54 43 4c 5f 57 52 49 54 41  ABLE | TCL_WRITA
acd0: 42 4c 45 29 2c 20 63 68 61 6e 29 3b 0a 20 20 20  BLE), chan);.   
ace0: 20 64 70 72 69 6e 74 66 28 22 43 72 65 61 74 65   dprintf("Create
acf0: 64 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 64 20  d channel named 
ad00: 25 73 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  %s", Tcl_GetChan
ad10: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
ad20: 2d 3e 73 65 6c 66 29 29 3b 0a 20 20 20 20 69 66  ->self));.    if
ad30: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66   (statePtr->self
ad40: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
ad50: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20  ) NULL) {../*.. 
ad60: 2a 20 4e 6f 20 75 73 65 20 6f 66 20 54 63 6c 5f  * No use of Tcl_
ad70: 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 62  EventuallyFree b
ad80: 65 63 61 75 73 65 20 6e 6f 20 70 6f 73 73 69 62  ecause no possib
ad90: 6c 65 20 54 63 6c 5f 50 72 65 73 65 72 76 65 2e  le Tcl_Preserve.
ada0: 0a 09 20 2a 2f 0a 09 54 6c 73 5f 46 72 65 65 28  .. */..Tls_Free(
adb0: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
adc0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  r);..return TCL_
add0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
ade0: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
adf0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
ae00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
ae10: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 54  -translation", T
ae20: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
ae30: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
ae40: 6e 73 6c 61 74 69 6f 6e 29 29 3b 0a 20 20 20 20  nslation));.    
ae50: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
ae60: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61  tion(interp, sta
ae70: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65  tePtr->self, "-e
ae80: 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53  ncoding", Tcl_DS
ae90: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
aea0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
aeb0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
aec0: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aed0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
aee0: 65 6c 66 2c 20 22 2d 65 6f 66 63 68 61 72 22 2c  elf, "-eofchar",
aef0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
af00: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
af10: 4f 46 43 68 61 72 29 29 3b 0a 20 20 20 20 54 63  OFChar));.    Tc
af20: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
af30: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
af40: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 62 6c 6f  Ptr->self, "-blo
af50: 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  cking", Tcl_DStr
af60: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
af70: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 29  hannelBlocking))
af80: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
af90: 20 53 53 4c 20 49 6e 69 74 69 61 6c 69 7a 61 74   SSL Initializat
afa0: 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ion.     */.    
afb0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20  statePtr->ssl = 
afc0: 53 53 4c 5f 6e 65 77 28 73 74 61 74 65 50 74 72  SSL_new(statePtr
afd0: 2d 3e 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28  ->ctx);.    if (
afe0: 21 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  !statePtr->ssl) 
aff0: 7b 0a 09 2f 2a 20 53 53 4c 20 6c 69 62 72 61 72  {../* SSL librar
b000: 79 20 65 72 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f  y error */..Tcl_
b010: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
b020: 65 72 70 2c 20 22 63 6f 75 6c 64 6e 27 74 20 63  erp, "couldn't c
b030: 6f 6e 73 74 72 75 63 74 20 73 73 6c 20 73 65 73  onstruct ssl ses
b040: 73 69 6f 6e 3a 20 22 2c 20 47 45 54 5f 45 52 52  sion: ", GET_ERR
b050: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b060: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b070: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b080: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b090: 22 49 4d 50 4f 52 54 22 2c 20 22 49 4e 49 54 22  "IMPORT", "INIT"
b0a0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b0b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73  r *) NULL);..Tls
b0c0: 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73  _Free((char *) s
b0d0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
b0e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b0f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68   }..    /* Set h
b100: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ost server name 
b110: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  */.    if (serve
b120: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74  rname) {../* Set
b130: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  s the server nam
b140: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
b150: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c  I) in ClientHell
b160: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09  o extension */..
b170: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c  /* Per RFC 6066,
b180: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41   hostname is a A
b190: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72  SCII encoded str
b1a0: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20  ing, though RFC 
b1b0: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e  4366 says UTF-8.
b1c0: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65   */..if (!SSL_se
b1d0: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61  t_tlsext_host_na
b1e0: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
b1f0: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26  , servername) &&
b200: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20   require) {..   
b210: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b220: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53  t(interp, "Set S
b230: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  NI extension fai
b240: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b250: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b260: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b270: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b280: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b290: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
b2a0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b2b0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b2c0: 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  ls_Free((char *)
b2d0: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
b2e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b2f0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68  R;..}.../* Set h
b300: 6f 73 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72  ostname for peer
b310: 20 63 65 72 74 69 66 69 63 61 74 65 20 68 6f 73   certificate hos
b320: 74 6e 61 6d 65 20 76 65 72 69 66 69 63 61 74 69  tname verificati
b330: 6f 6e 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09  on in clients...
b340: 20 20 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c     Don't use SSL
b350: 5f 73 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65  _set1_host since
b360: 20 69 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69   it has limitati
b370: 6f 6e 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53  ons. */..if (!SS
b380: 4c 5f 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74  L_add1_host(stat
b390: 65 50 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65  ePtr->ssl, serve
b3a0: 72 6e 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54  rname)) {..    T
b3b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
b3c0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53  interp, "Set DNS
b3d0: 20 68 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64   hostname failed
b3e0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b3f0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b400: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b410: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b420: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b430: 4f 52 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22  ORT", "HOSTNAME"
b440: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b450: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b460: 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72 20   Tls_Free((char 
b470: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
b480: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b490: 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ROR;..}.    }.. 
b4a0: 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73 65 73     /* Resume ses
b4b0: 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20 20 69  sion id */.    i
b4c0: 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20 26 26  f (session_id &&
b4d0: 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f 6e 5f   strlen(session_
b4e0: 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58 5f 53  id) <= SSL_MAX_S
b4f0: 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29 20 7b  ID_CTX_LENGTH) {
b500: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 73  ../* SSL_set_ses
b510: 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20 28 21  sion() */..if (!
b520: 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65 74 31  SSL_SESSION_set1
b530: 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53 4c 5f  _id_context(SSL_
b540: 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74 61 74  get_session(stat
b550: 65 50 74 72 2d 3e 73 73 6c 29 2c 20 73 65 73 73  ePtr->ssl), sess
b560: 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65  ion_id, (unsigne
b570: 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65  d int) strlen(se
b580: 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20  ssion_id))) {.. 
b590: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b5a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73  ult(interp, "Res
b5b0: 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c  ume session fail
b5c0: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
b5d0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
b5e0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
b5f0: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
b600: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
b610: 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e  MPORT", "SESSION
b620: 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68  ", "FAILED", (ch
b630: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
b640: 20 20 54 6c 73 5f 46 72 65 65 28 28 63 68 61 72    Tls_Free((char
b650: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b660: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b670: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  RROR;..}.    }..
b680: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 41 70      /* Enable Ap
b690: 70 6c 69 63 61 74 69 6f 6e 2d 4c 61 79 65 72 20  plication-Layer 
b6a0: 50 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61  Protocol Negotia
b6b0: 74 69 6f 6e 2e 20 45 78 61 6d 70 6c 65 73 20 61  tion. Examples a
b6c0: 72 65 3a 20 68 74 74 70 2f 31 2e 30 2c 0a 09 68  re: http/1.0,..h
b6d0: 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68 33 2c  ttp/1.1, h2, h3,
b6e0: 20 66 74 70 2c 20 69 6d 61 70 2c 20 70 6f 70 33   ftp, imap, pop3
b6f0: 2c 20 78 6d 70 70 2d 63 6c 69 65 6e 74 2c 20 78  , xmpp-client, x
b700: 6d 70 70 2d 73 65 72 76 65 72 2c 20 6d 71 74 74  mpp-server, mqtt
b710: 2c 20 69 72 63 2c 20 65 74 63 2e 20 2a 2f 0a 20  , irc, etc. */. 
b720: 20 20 20 69 66 20 28 61 6c 70 6e 29 20 7b 0a 09     if (alpn) {..
b730: 2f 2a 20 43 6f 6e 76 65 72 74 20 61 20 54 43 4c  /* Convert a TCL
b740: 20 6c 69 73 74 20 69 6e 74 6f 20 61 20 70 72 6f   list into a pro
b750: 74 6f 63 6f 6c 2d 6c 69 73 74 20 69 6e 20 77 69  tocol-list in wi
b760: 72 65 2d 66 6f 72 6d 61 74 20 2a 2f 0a 09 75 6e  re-format */..un
b770: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
b780: 74 6f 73 2c 20 2a 70 3b 0a 09 75 6e 73 69 67 6e  tos, *p;..unsign
b790: 65 64 20 69 6e 74 20 70 72 6f 74 6f 73 5f 6c 65  ed int protos_le
b7a0: 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 53 69 7a 65  n = 0;..Tcl_Size
b7b0: 20 63 6e 74 2c 20 69 3b 0a 09 69 6e 74 20 6a 3b   cnt, i;..int j;
b7c0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74  ..Tcl_Obj **list
b7d0: 3b 0a 0a 09 69 66 20 28 54 63 6c 5f 4c 69 73 74  ;...if (Tcl_List
b7e0: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
b7f0: 6e 74 65 72 70 2c 20 61 6c 70 6e 2c 20 26 63 6e  nterp, alpn, &cn
b800: 74 2c 20 26 6c 69 73 74 29 20 21 3d 20 54 43 4c  t, &list) != TCL
b810: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f  _OK) {..    Tls_
b820: 46 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 74  Free((char *) st
b830: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
b840: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b850: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
b860: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
b870: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72  uired for the pr
b880: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
b890: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
b8a0: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
b8b0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
b8c0: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26  omObj(list[i], &
b8d0: 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c  len);..    if (l
b8e0: 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63  en > 255) {...Tc
b8f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
b900: 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f  nterp, "ALPN pro
b910: 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20  tocol names too 
b920: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20  long", (char *) 
b930: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74  NULL);...Tcl_Set
b940: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b950: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b960: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
b970: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b980: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
b990: 28 63 68 61 72 20 2a 29 20 73 74 61 74 65 50 74  (char *) statePt
b9a0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  r);...return TCL
b9b0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
b9c0: 20 20 20 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b      protos_len +
b9d0: 3d 20 31 20 2b 20 28 69 6e 74 29 20 6c 65 6e 3b  = 1 + (int) len;
b9e0: 0a 09 7d 0a 0a 09 2f 2a 20 42 75 69 6c 64 20 74  ..}.../* Build t
b9f0: 68 65 20 63 6f 6d 70 6c 65 74 65 20 70 72 6f 74  he complete prot
ba00: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 70 72  ocol-list */..pr
ba10: 6f 74 6f 73 20 3d 20 63 6b 61 6c 6c 6f 63 28 70  otos = ckalloc(p
ba20: 72 6f 74 6f 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20  rotos_len);../* 
ba30: 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 73 20 63  protocol-lists c
ba40: 6f 6e 73 69 73 74 20 6f 66 20 38 2d 62 69 74 20  onsist of 8-bit 
ba50: 6c 65 6e 67 74 68 2d 70 72 65 66 69 78 65 64 2c  length-prefixed,
ba60: 20 62 79 74 65 20 73 74 72 69 6e 67 73 20 2a 2f   byte strings */
ba70: 0a 09 66 6f 72 20 28 6a 20 3d 20 30 2c 20 70 20  ..for (j = 0, p 
ba80: 3d 20 70 72 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e  = protos; j < cn
ba90: 74 3b 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20 63  t; j++) {..    c
baa0: 68 61 72 20 2a 73 74 72 20 3d 20 54 63 6c 5f 47  har *str = Tcl_G
bab0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
bac0: 6c 69 73 74 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a  list[j], &len);.
bad0: 09 20 20 20 20 2a 70 2b 2b 20 3d 20 28 75 6e 73  .    *p++ = (uns
bae0: 69 67 6e 65 64 20 63 68 61 72 29 20 6c 65 6e 3b  igned char) len;
baf0: 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 70 2c 20  ..    memcpy(p, 
bb00: 73 74 72 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65  str, (size_t) le
bb10: 6e 29 3b 0a 09 20 20 20 20 70 20 2b 3d 20 6c 65  n);..    p += le
bb20: 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73  n;..}.../* SSL_s
bb30: 65 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d  et_alpn_protos m
bb40: 61 6b 65 73 20 61 20 63 6f 70 79 20 6f 66 20 74  akes a copy of t
bb50: 68 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  he protocol-list
bb60: 20 2a 2f 0a 09 2f 2a 20 4e 6f 74 65 3a 20 54 68   */../* Note: Th
bb70: 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 76  is functions rev
bb80: 65 72 73 65 73 20 74 68 65 20 72 65 74 75 72 6e  erses the return
bb90: 20 76 61 6c 75 65 20 63 6f 6e 76 65 6e 74 69 6f   value conventio
bba0: 6e 20 2a 2f 0a 09 69 66 20 28 53 53 4c 5f 73 65  n */..if (SSL_se
bbb0: 74 5f 61 6c 70 6e 5f 70 72 6f 74 6f 73 28 73 74  t_alpn_protos(st
bbc0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 70 72 6f  atePtr->ssl, pro
bbd0: 74 6f 73 2c 20 70 72 6f 74 6f 73 5f 6c 65 6e 29  tos, protos_len)
bbe0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
bbf0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
bc00: 2c 20 22 53 65 74 20 41 4c 50 4e 20 70 72 6f 74  , "Set ALPN prot
bc10: 6f 63 6f 6c 73 20 66 61 69 6c 65 64 3a 20 22 2c  ocols failed: ",
bc20: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
bc30: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
bc40: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
bc50: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
bc60: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
bc70: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
bc80: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
bc90: 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65  L);..    Tls_Fre
bca0: 65 28 28 63 68 61 72 20 2a 29 20 73 74 61 74 65  e((char *) state
bcb0: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65  Ptr);..    ckfre
bcc0: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20  e(protos);..    
bcd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bce0: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20  ;..}.../* Store 
bcf0: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a  protocols list *
bd00: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  /..statePtr->pro
bd10: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73  tos = protos;..s
bd20: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
bd30: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e  len = protos_len
bd40: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
bd50: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
bd60: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50   = NULL;..stateP
bd70: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
bd80: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
bd90: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c  *.     * SSL Cal
bda0: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20  lbacks.     */. 
bdb0: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64     SSL_set_app_d
bdc0: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ata(statePtr->ss
bdd0: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  l, (void *)state
bde0: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62  Ptr);./* point b
bdf0: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20  ack to us */.   
be00: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28   SSL_set_verify(
be10: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76  statePtr->ssl, v
be20: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c  erify, VerifyCal
be30: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f  lback);.    SSL_
be40: 73 65 74 5f 69 6e 66 6f 5f 63 61 6c 6c 62 61 63  set_info_callbac
be50: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  k(statePtr->ssl,
be60: 20 49 6e 66 6f 43 61 6c 6c 62 61 63 6b 29 3b 0a   InfoCallback);.
be70: 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  .    /* Callback
be80: 20 66 6f 72 20 6f 62 73 65 72 76 69 6e 67 20 70   for observing p
be90: 72 6f 74 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73  rotocol messages
bea0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45 4e   */.#ifndef OPEN
beb0: 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43 45  SSL_NO_SSL_TRACE
bec0: 0a 20 20 20 20 2f 2a 20 76 6f 69 64 20 53 53 4c  .    /* void SSL
bed0: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c  _CTX_set_msg_cal
bee0: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50  lback_arg(stateP
bef0: 74 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a  tr->ctx, (void *
bf00: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  )statePtr);.    
bf10: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74  void SSL_CTX_set
bf20: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28 73 74  _msg_callback(st
bf30: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 4d 65 73  atePtr->ctx, Mes
bf40: 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b 20 2a  sageCallback); *
bf50: 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73  /.    SSL_set_ms
bf60: 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28 73  g_callback_arg(s
bf70: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 28 76  tatePtr->ssl, (v
bf80: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
bf90: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 6d 73 67  .    SSL_set_msg
bfa0: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
bfb0: 74 72 2d 3e 73 73 6c 2c 20 4d 65 73 73 61 67 65  tr->ssl, Message
bfc0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 23 65 6e 64 69  Callback);.#endi
bfd0: 66 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  f..    /* Create
bfe0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 42 49 4f   Tcl_Channel BIO
bff0: 20 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 20 20   Handler */.    
c000: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 09  statePtr->p_bio.
c010: 3d 20 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 73 74  = BIO_new_tcl(st
c020: 61 74 65 50 74 72 2c 20 42 49 4f 5f 4e 4f 43 4c  atePtr, BIO_NOCL
c030: 4f 53 45 29 3b 0a 20 20 20 20 73 74 61 74 65 50  OSE);.    stateP
c040: 74 72 2d 3e 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  tr->bio.= BIO_ne
c050: 77 28 42 49 4f 5f 66 5f 73 73 6c 28 29 29 3b 0a  w(BIO_f_ssl());.
c060: 0a 20 20 20 20 69 66 20 28 73 65 72 76 65 72 29  .    if (server)
c070: 20 7b 0a 09 2f 2a 20 53 65 72 76 65 72 20 63 61   {../* Server ca
c080: 6c 6c 62 61 63 6b 73 20 2a 2f 0a 09 53 53 4c 5f  llbacks */..SSL_
c090: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73  CTX_set_tlsext_s
c0a0: 65 72 76 65 72 6e 61 6d 65 5f 61 72 67 28 73 74  ervername_arg(st
c0b0: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28 76 6f  atePtr->ctx, (vo
c0c0: 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a  id *)statePtr);.
c0d0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c 73  .SSL_CTX_set_tls
c0e0: 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f 63  ext_servername_c
c0f0: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
c100: 2d 3e 63 74 78 2c 20 53 4e 49 43 61 6c 6c 62 61  ->ctx, SNICallba
c110: 63 6b 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  ck);..SSL_CTX_se
c120: 74 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c 6f 5f 63  t_client_hello_c
c130: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c140: 20 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 2c 20   HelloCallback, 
c150: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c160: 29 3b 0a 09 69 66 20 28 73 74 61 74 65 50 74 72  );..if (statePtr
c170: 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c  ->protos != NULL
c180: 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ) {..    SSL_CTX
c190: 5f 73 65 74 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  _set_alpn_select
c1a0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c1b0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c1c0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c1d0: 72 29 3b 0a 23 69 66 64 65 66 20 55 53 45 5f 4e  r);.#ifdef USE_N
c1e0: 50 4e 0a 09 20 20 20 20 69 66 20 28 74 6c 73 31  PN..    if (tls1
c1f0: 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31 5f  _2 == 0 && tls1_
c200: 33 20 3d 3d 20 30 29 20 7b 0a 09 09 53 53 4c 5f  3 == 0) {...SSL_
c210: 43 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f  CTX_set_next_pro
c220: 74 6f 73 5f 61 64 76 65 72 74 69 73 65 64 5f 63  tos_advertised_c
c230: 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  b(statePtr->ctx,
c240: 20 4e 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76   NPNCallback, (v
c250: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
c260: 0a 09 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 09  ..    }.#endif..
c270: 7d 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 73 65  }.../* Enable se
c280: 72 76 65 72 20 74 6f 20 73 65 6e 64 20 63 65 72  rver to send cer
c290: 74 20 72 65 71 75 65 73 74 20 61 66 74 65 72 20  t request after 
c2a0: 68 61 6e 64 73 68 61 6b 65 20 28 54 4c 53 20 31  handshake (TLS 1
c2b0: 2e 33 20 6f 6e 6c 79 29 20 2a 2f 0a 09 2f 2a 20  .3 only) */../* 
c2c0: 41 20 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f  A write operatio
c2d0: 6e 20 6d 75 73 74 20 74 61 6b 65 20 70 6c 61 63  n must take plac
c2e0: 65 20 66 6f 72 20 74 68 65 20 43 65 72 74 69 66  e for the Certif
c2f0: 69 63 61 74 65 20 52 65 71 75 65 73 74 20 74 6f  icate Request to
c300: 20 62 65 0a 09 20 20 20 73 65 6e 74 20 74 6f 20   be..   sent to 
c310: 74 68 65 20 63 6c 69 65 6e 74 2c 20 74 68 69 73  the client, this
c320: 20 63 61 6e 20 62 65 20 64 6f 6e 65 20 77 69 74   can be done wit
c330: 68 20 53 53 4c 5f 64 6f 5f 68 61 6e 64 73 68 61  h SSL_do_handsha
c340: 6b 65 28 29 2e 20 2a 2f 0a 09 69 66 20 28 72 65  ke(). */..if (re
c350: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
c360: 6e 64 73 68 61 6b 65 20 26 26 20 74 6c 73 31 5f  ndshake && tls1_
c370: 33 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 76 65  3) {..    SSL_ve
c380: 72 69 66 79 5f 63 6c 69 65 6e 74 5f 70 6f 73 74  rify_client_post
c390: 5f 68 61 6e 64 73 68 61 6b 65 28 73 74 61 74 65  _handshake(state
c3a0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 7d 0a 0a 09  Ptr->ssl);..}...
c3b0: 2f 2a 20 73 65 74 20 61 75 74 6f 6d 61 74 69 63  /* set automatic
c3c0: 20 63 75 72 76 65 20 73 65 6c 65 63 74 69 6f 6e   curve selection
c3d0: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 65 63 64   */..SSL_set_ecd
c3e0: 68 5f 61 75 74 6f 28 73 74 61 74 65 50 74 72 2d  h_auto(statePtr-
c3f0: 3e 73 73 6c 2c 20 31 29 3b 0a 0a 09 2f 2a 20 53  >ssl, 1);.../* S
c400: 65 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a  et server mode *
c410: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /..statePtr->fla
c420: 67 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45  gs |= TLS_TCL_SE
c430: 52 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61  RVER;..SSL_set_a
c440: 63 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74  ccept_state(stat
c450: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
c460: 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69  } else {../* Cli
c470: 65 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ent callbacks */
c480: 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a  .#ifdef USE_NPN.
c490: 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70  .if (statePtr->p
c4a0: 72 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26  rotos != NULL &&
c4b0: 20 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20   tls1_2 == 0 && 
c4c0: 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09  tls1_3 == 0) {..
c4d0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c4e0: 6e 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63  next_proto_selec
c4f0: 74 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63  t_cb(statePtr->c
c500: 74 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  tx, ALPNCallback
c510: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c520: 74 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a  tr);..}.#endif..
c530: 09 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68  ./* Session cach
c540: 69 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f  ing */..SSL_CTX_
c550: 73 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68  set_session_cach
c560: 65 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d  e_mode(statePtr-
c570: 3e 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43  >ctx, SSL_SESS_C
c580: 41 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53  ACHE_CLIENT | SS
c590: 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f  L_SESS_CACHE_NO_
c5a0: 49 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b  INTERNAL_STORE);
c5b0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73  ..SSL_CTX_sess_s
c5c0: 65 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50  et_new_cb(stateP
c5d0: 74 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e  tr->ctx, Session
c5e0: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20  Callback);.../* 
c5f0: 45 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64  Enable post hand
c600: 73 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61  shake Authentica
c610: 74 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20  tion extension. 
c620: 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f  TLS 1.3 only, no
c630: 74 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66  t http/2. */..if
c640: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
c650: 74 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09  t_handshake) {..
c660: 20 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74      SSL_set_post
c670: 5f 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28  _handshake_auth(
c680: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31  statePtr->ssl, 1
c690: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63  );..}.../* Set c
c6a0: 6c 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53  lient mode */..S
c6b0: 53 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73  SL_set_connect_s
c6c0: 74 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73  tate(statePtr->s
c6d0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 53  sl);.    }.    S
c6e0: 53 4c 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65  SL_set_bio(state
c6f0: 50 74 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50  Ptr->ssl, stateP
c700: 74 72 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65  tr->p_bio, state
c710: 50 74 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20  Ptr->p_bio);.   
c720: 20 42 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61   BIO_set_ssl(sta
c730: 74 65 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74  tePtr->bio, stat
c740: 65 50 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e  ePtr->ssl, BIO_N
c750: 4f 43 4c 4f 53 45 29 3b 0a 0a 20 20 20 20 2f 2a  OCLOSE);..    /*
c760: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53  .     * End of S
c770: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a  SL Init.     */.
c780: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
c790: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f  urning %s", Tcl_
c7a0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
c7b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
c7c0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
c7d0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
c7e0: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
c7f0: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
c800: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41  >self), TCL_VOLA
c810: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75  TILE);..    retu
c820: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
c830: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
c840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c870: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e  -------. *. * Un
c880: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  importObjCmd --.
c890: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
c8a0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
c8b0: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f  to remove the to
c8c0: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69  pmost channel fi
c8d0: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  lter.. *. * Resu
c8e0: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
c8f0: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
c900: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
c910: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
c920: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
c930: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
c940: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
c950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c980: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
c990: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74  tic int.Unimport
c9a0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
c9b0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
c9c0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c9d0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
c9e0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
c9f0: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
ca00: 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54  nnel chan;../* T
ca10: 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65  he channel to se
ca20: 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a  t a mode on. */.
ca30: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
ca40: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
ca50: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
ca60: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
ca70: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
ca80: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
ca90: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
caa0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
cab0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
cac0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
cad0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
cae0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
caf0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
cb00: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
cb10: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
cb20: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
cb30: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cb40: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
cb50: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
cb60: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
cb70: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
cb80: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
cb90: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 69 66  l(chan);..    if
cba0: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
cbb0: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
cbc0: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
cbd0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
cbe0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
cbf0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
cc00: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
cc10: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
cc20: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
cc30: 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  l", NULL);..    
cc40: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
cc50: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
cc60: 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  "UNIMPORT", "CHA
cc70: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
cc80: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
cc90: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
cca0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
ccb0: 69 66 20 28 54 63 6c 5f 55 6e 73 74 61 63 6b 43  if (Tcl_UnstackC
ccc0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63  hannel(interp, c
ccd0: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f  han) == TCL_ERRO
cce0: 52 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  R) {..return TCL
ccf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
cd00: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
cd10: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cd60: 2a 0a 20 2a 20 43 54 58 5f 49 6e 69 74 20 2d 2d  *. * CTX_Init --
cd70: 20 63 6f 6e 73 74 72 75 63 74 20 61 20 53 53 4c   construct a SSL
cd80: 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 0a 20 2a  _CTX instance. *
cd90: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
cda0: 41 20 76 61 6c 69 64 20 53 53 4c 5f 43 54 58 20  A valid SSL_CTX 
cdb0: 69 6e 73 74 61 6e 63 65 20 6f 72 20 4e 55 4c 4c  instance or NULL
cdc0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
cdd0: 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74 72 75  ects:. *.constru
cde0: 63 74 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  cts SSL context 
cdf0: 28 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  (CTX). *. *-----
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 2d 2d 2d  ----------------
ce20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ce30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
ce40: 2a 2f 0a 73 74 61 74 69 63 20 53 53 4c 5f 43 54  */.static SSL_CT
ce50: 58 20 2a 0a 43 54 58 5f 49 6e 69 74 28 53 74 61  X *.CTX_Init(Sta
ce60: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 69 6e  te *statePtr, in
ce70: 74 20 69 73 53 65 72 76 65 72 2c 20 69 6e 74 20  t isServer, int 
ce80: 70 72 6f 74 6f 2c 20 63 68 61 72 20 2a 6b 65 79  proto, char *key
ce90: 66 69 6c 65 2c 20 63 68 61 72 20 2a 63 65 72 74  file, char *cert
cea0: 66 69 6c 65 2c 0a 20 20 20 20 75 6e 73 69 67 6e  file,.    unsign
ceb0: 65 64 20 63 68 61 72 20 2a 6b 65 79 2c 20 75 6e  ed char *key, un
cec0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72  signed char *cer
ced0: 74 2c 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 2c 20  t, int key_len, 
cee0: 69 6e 74 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68  int cert_len, ch
cef0: 61 72 20 2a 43 41 64 69 72 2c 0a 20 20 20 20 63  ar *CAdir,.    c
cf00: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61  har *CAfile, cha
cf10: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
cf20: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
cf30: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
cf40: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
cf50: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cf60: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
cf70: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
cf80: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
cf90: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
cfa0: 20 64 73 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74   ds;.    Tcl_DSt
cfb0: 72 69 6e 67 20 64 73 31 3b 0a 20 20 20 20 69 6e  ring ds1;.    in
cfc0: 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 69  t off = 0;.    i
cfd0: 6e 74 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  nt load_private_
cfe0: 6b 65 79 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  key;.    const S
cff0: 53 4c 5f 4d 45 54 48 4f 44 20 2a 6d 65 74 68 6f  SL_METHOD *metho
d000: 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  d;..    dprintf(
d010: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
d020: 69 66 20 28 21 70 72 6f 74 6f 29 20 7b 0a 09 54  if (!proto) {..T
d030: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
d040: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 76 61 6c 69  interp, "no vali
d050: 64 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63  d protocol selec
d060: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
d070: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d080: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  LL;.    }..    /
d090: 2a 20 63 72 65 61 74 65 20 53 53 4c 20 63 6f 6e  * create SSL con
d0a0: 74 65 78 74 20 2a 2f 0a 23 69 66 20 4f 50 45 4e  text */.#if OPEN
d0b0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
d0c0: 45 52 20 3e 3d 20 30 78 31 30 31 30 30 30 30 30  ER >= 0x10100000
d0d0: 4c 20 7c 7c 20 64 65 66 69 6e 65 64 28 4e 4f 5f  L || defined(NO_
d0e0: 53 53 4c 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  SSL2) || defined
d0f0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
d100: 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45  ).    if (ENABLE
d110: 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f  D(proto, TLS_PRO
d120: 54 4f 5f 53 53 4c 32 29 29 20 7b 0a 09 54 63 6c  TO_SSL2)) {..Tcl
d130: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
d140: 74 65 72 70 2c 20 22 53 53 4c 32 20 70 72 6f 74  terp, "SSL2 prot
d150: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
d160: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
d170: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
d180: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
d190: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
d1a0: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
d1b0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
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 33 29 29 20 7b 0a 09 54 63 6c 5f  O_SSL3)) {..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 33 20 70 72 6f 74 6f  erp, "SSL3 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 54 4c  if defined(NO_TL
d260: 53 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  S1) || defined(O
d270: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a  PENSSL_NO_TLS1).
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 54 4c 53 31 29 29 20 7b 0a 09 54 63 6c 5f 41  _TLS1)) {..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 54 4c 53 20 31 2e 30 20 70 72 6f  rp, "TLS 1.0 pro
d2d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d2e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
d2f0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d300: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d310: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d320: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
d330: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d340: 53 31 5f 31 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_1).    if (EN
d350: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d360: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 29 20  _PROTO_TLS1_1)) 
d370: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d380: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
d390: 20 31 2e 31 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.1 protocol no
d3a0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d3b0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
d3c0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d3d0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
d3e0: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
d3f0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
d400: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20  SL_NO_TLS1_2).  
d410: 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72    if (ENABLED(pr
d420: 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  oto, TLS_PROTO_T
d430: 4c 53 31 5f 32 29 29 20 7b 0a 09 54 63 6c 5f 41  LS1_2)) {..Tcl_A
d440: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
d450: 72 70 2c 20 22 54 4c 53 20 31 2e 32 20 70 72 6f  rp, "TLS 1.2 pro
d460: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
d470: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
d480: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55  ULL);..return NU
d490: 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  LL;.    }.#endif
d4a0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
d4b0: 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65 66 69 6e  TLS1_3) || defin
d4c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
d4d0: 53 31 5f 33 29 0a 20 20 20 20 69 66 20 28 45 4e  S1_3).    if (EN
d4e0: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
d4f0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 29 20  _PROTO_TLS1_3)) 
d500: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
d510: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ult(interp, "TLS
d520: 20 31 2e 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f   1.3 protocol no
d530: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
d540: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
d550: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
d560: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
d570: 28 70 72 6f 74 6f 20 3d 3d 20 30 29 20 7b 0a 09  (proto == 0) {..
d580: 2f 2a 20 55 73 65 20 66 75 6c 6c 20 72 61 6e 67  /* Use full rang
d590: 65 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65  e */..SSL_CTX_se
d5a0: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
d5b0: 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 09 53 53  ion(ctx, 0);..SS
d5c0: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
d5d0: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
d5e0: 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   0);.    }..    
d5f0: 73 77 69 74 63 68 20 28 70 72 6f 74 6f 29 20 7b  switch (proto) {
d600: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
d610: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
d620: 31 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65  10100000L && !de
d630: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26  fined(NO_SSL2) &
d640: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
d650: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
d660: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  case TLS_PROTO_S
d670: 53 4c 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  SL2:..method = i
d680: 73 53 65 72 76 65 72 20 3f 20 53 53 4c 76 32 5f  sServer ? SSLv2_
d690: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
d6a0: 3a 20 53 53 4c 76 32 5f 63 6c 69 65 6e 74 5f 6d  : SSLv2_client_m
d6b0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
d6c0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
d6d0: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
d6e0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d6f0: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
d700: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
d710: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
d720: 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54     case TLS_PROT
d730: 4f 5f 53 53 4c 33 3a 0a 09 6d 65 74 68 6f 64 20  O_SSL3:..method 
d740: 3d 20 69 73 53 65 72 76 65 72 20 3f 20 53 53 4c  = isServer ? SSL
d750: 76 33 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  v3_server_method
d760: 28 29 20 3a 20 53 53 4c 76 33 5f 63 6c 69 65 6e  () : SSLv3_clien
d770: 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65  t_method();..bre
d780: 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ak;.#endif.#if !
d790: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
d7a0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
d7b0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26  NSSL_NO_TLS1) &&
d7c0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
d7d0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44  L_NO_TLS1_METHOD
d7e0: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
d7f0: 52 4f 54 4f 5f 54 4c 53 31 3a 0a 09 6d 65 74 68  ROTO_TLS1:..meth
d800: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
d810: 54 4c 53 76 31 5f 73 65 72 76 65 72 5f 6d 65 74  TLSv1_server_met
d820: 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f 63 6c  hod() : TLSv1_cl
d830: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
d840: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
d850: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
d860: 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65  S1_1) && !define
d870: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
d880: 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_1) && !defined
d890: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d8a0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63  _1_METHOD).    c
d8b0: 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  ase TLS_PROTO_TL
d8c0: 53 31 5f 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  S1_1:..method = 
d8d0: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
d8e0: 5f 31 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  _1_server_method
d8f0: 28 29 20 3a 20 54 4c 53 76 31 5f 31 5f 63 6c 69  () : TLSv1_1_cli
d900: 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62  ent_method();..b
d910: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66  reak;.#endif.#if
d920: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
d930: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
d940: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
d950: 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _2) && !defined(
d960: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
d970: 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  2_METHOD).    ca
d980: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
d990: 31 5f 32 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  1_2:..method = i
d9a0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
d9b0: 32 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  2_server_method(
d9c0: 29 20 3a 20 54 4c 53 76 31 5f 32 5f 63 6c 69 65  ) : TLSv1_2_clie
d9d0: 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72  nt_method();..br
d9e0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  eak;.#endif.#if 
d9f0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
da00: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
da10: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
da20: 33 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  3).    case TLS_
da30: 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 3a 0a 09 2f  PROTO_TLS1_3:../
da40: 2a 20 55 73 65 20 74 68 65 20 67 65 6e 65 72 69  * Use the generi
da50: 63 20 6d 65 74 68 6f 64 20 61 6e 64 20 63 6f 6e  c method and con
da60: 73 74 72 61 69 6e 74 20 72 61 6e 67 65 20 61 66  straint range af
da70: 74 65 72 20 63 6f 6e 74 65 78 74 20 69 73 20 63  ter context is c
da80: 72 65 61 74 65 64 20 2a 2f 0a 09 6d 65 74 68 6f  reated */..metho
da90: 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54  d = isServer ? T
daa0: 4c 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64  LS_server_method
dab0: 28 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f  () : TLS_client_
dac0: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
dad0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 64 65 66  ;.#endif.    def
dae0: 61 75 6c 74 3a 0a 09 2f 2a 20 4e 65 67 6f 74 69  ault:../* Negoti
daf0: 61 74 65 20 68 69 67 68 65 73 74 20 61 76 61 69  ate highest avai
db00: 6c 61 62 6c 65 20 53 53 4c 2f 54 4c 53 20 76 65  lable SSL/TLS ve
db10: 72 73 69 6f 6e 20 2a 2f 0a 09 6d 65 74 68 6f 64  rsion */..method
db20: 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20 54 4c   = isServer ? TL
db30: 53 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28  S_server_method(
db40: 29 20 3a 20 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d  ) : TLS_client_m
db50: 65 74 68 6f 64 28 29 3b 0a 23 69 66 20 4f 50 45  ethod();.#if OPE
db60: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
db70: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
db80: 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f  L && !defined(NO
db90: 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e  _SSL2) && !defin
dba0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
dbb0: 4c 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  L2)..off |= (ENA
dbc0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
dbd0: 50 52 4f 54 4f 5f 53 53 4c 32 29 20 20 20 3f 20  PROTO_SSL2)   ? 
dbe0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53  0 : SSL_OP_NO_SS
dbf0: 4c 76 32 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  Lv2);.#endif.#if
dc00: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c   !defined(NO_SSL
dc10: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
dc20: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a  PENSSL_NO_SSL3).
dc30: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
dc40: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
dc50: 4f 5f 53 53 4c 33 29 20 20 20 3f 20 30 20 3a 20  O_SSL3)   ? 0 : 
dc60: 53 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 33 29  SSL_OP_NO_SSLv3)
dc70: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
dc80: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
dc90: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dca0: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 09 6f 66 66  SL_NO_TLS1)..off
dcb0: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
dcc0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
dcd0: 53 31 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f  S1)   ? 0 : SSL_
dce0: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 29 3b 0a 23 65  OP_NO_TLSv1);.#e
dcf0: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
dd00: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
dd10: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
dd20: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 09 6f 66 66  _NO_TLS1_1)..off
dd30: 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   |= (ENABLED(pro
dd40: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
dd50: 53 31 5f 31 29 20 3f 20 30 20 3a 20 53 53 4c 5f  S1_1) ? 0 : SSL_
dd60: 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 31 29 3b 0a  OP_NO_TLSv1_1);.
dd70: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
dd80: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
dd90: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
dda0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 09 6f  SL_NO_TLS1_2)..o
ddb0: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
ddc0: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
ddd0: 54 4c 53 31 5f 32 29 20 3f 20 30 20 3a 20 53 53  TLS1_2) ? 0 : SS
dde0: 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f 32 29  L_OP_NO_TLSv1_2)
ddf0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
de00: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
de10: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
de20: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
de30: 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44  .off |= (ENABLED
de40: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
de50: 4f 5f 54 4c 53 31 5f 33 29 20 3f 20 30 20 3a 20  O_TLS1_3) ? 0 : 
de60: 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76 31 5f  SSL_OP_NO_TLSv1_
de70: 33 29 3b 0a 23 65 6e 64 69 66 0a 09 62 72 65 61  3);.#endif..brea
de80: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52  k;.    }..    ER
de90: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
dea0: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
deb0: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b  CTX_new(method);
dec0: 0a 20 20 20 20 69 66 20 28 21 63 74 78 29 20 7b  .    if (!ctx) {
ded0: 0a 09 72 65 74 75 72 6e 28 4e 55 4c 4c 29 3b 0a  ..return(NULL);.
dee0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 67      }..    if (g
def0: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
df00: 49 4c 45 29 29 20 7b 0a 09 53 53 4c 5f 43 54 58  ILE)) {..SSL_CTX
df10: 5f 73 65 74 5f 6b 65 79 6c 6f 67 5f 63 61 6c 6c  _set_keylog_call
df20: 62 61 63 6b 28 63 74 78 2c 20 4b 65 79 4c 6f 67  back(ctx, KeyLog
df30: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 7d  Callback);.    }
df40: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  ..#if !defined(N
df50: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
df60: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
df70: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 69 66 20  _TLS1_3).    if 
df80: 28 70 72 6f 74 6f 20 3d 3d 20 54 4c 53 5f 50 52  (proto == TLS_PR
df90: 4f 54 4f 5f 54 4c 53 31 5f 33 29 20 7b 0a 09 53  OTO_TLS1_3) {..S
dfa0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70  SL_CTX_set_min_p
dfb0: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
dfc0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
dfd0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
dfe0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
dff0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
e000: 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a 23 65  RSION);.    }.#e
e010: 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 46 6f 72  ndif..    /* For
e020: 63 65 20 63 69 70 68 65 72 20 73 65 6c 65 63 74  ce cipher select
e030: 69 6f 6e 20 6f 72 64 65 72 20 62 79 20 73 65 72  ion order by ser
e040: 76 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 21  ver */.    if (!
e050: 69 73 53 65 72 76 65 72 29 20 7b 0a 09 53 53 4c  isServer) {..SSL
e060: 5f 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73  _CTX_set_options
e070: 28 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 43 49 50  (ctx, SSL_OP_CIP
e080: 48 45 52 5f 53 45 52 56 45 52 5f 50 52 45 46 45  HER_SERVER_PREFE
e090: 52 45 4e 43 45 29 3b 0a 20 20 20 20 7d 0a 0a 23  RENCE);.    }..#
e0a0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
e0b0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
e0c0: 31 30 30 30 30 30 4c 0a 20 20 20 20 4f 70 65 6e  100000L.    Open
e0d0: 53 53 4c 5f 61 64 64 5f 61 6c 6c 5f 61 6c 67 6f  SSL_add_all_algo
e0e0: 72 69 74 68 6d 73 28 29 3b 20 2f 2a 20 4c 6f 61  rithms(); /* Loa
e0f0: 64 20 63 69 70 68 65 72 73 20 61 6e 64 20 64 69  d ciphers and di
e100: 67 65 73 74 73 20 2a 2f 0a 23 65 6e 64 69 66 0a  gests */.#endif.
e110: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e120: 5f 61 70 70 5f 64 61 74 61 28 63 74 78 2c 20 28  _app_data(ctx, (
e130: 76 6f 69 64 2a 29 69 6e 74 65 72 70 29 3b 09 2f  void*)interp);./
e140: 2a 20 72 65 6d 65 6d 62 65 72 20 74 68 65 20 69  * remember the i
e150: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20  nterpreter */.  
e160: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70    SSL_CTX_set_op
e170: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
e180: 50 5f 41 4c 4c 29 3b 09 2f 2a 20 61 6c 6c 20 53  P_ALL);./* all S
e190: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
e1a0: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
e1b0: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
e1c0: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
e1d0: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 64 69  PRESSION);./* di
e1e0: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
e1f0: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
e200: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
e210: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
e220: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 64 69  tx, off);../* di
e230: 73 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 20 76  sable protocol v
e240: 65 72 73 69 6f 6e 73 20 2a 2f 0a 23 69 66 20 4f  ersions */.#if O
e250: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e260: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31 30  UMBER < 0x101010
e270: 30 30 4c 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  00L.    SSL_CTX_
e280: 73 65 74 5f 6d 6f 64 65 28 63 74 78 2c 20 53 53  set_mode(ctx, SS
e290: 4c 5f 4d 4f 44 45 5f 41 55 54 4f 5f 52 45 54 52  L_MODE_AUTO_RETR
e2a0: 59 29 3b 09 2f 2a 20 68 61 6e 64 6c 65 20 6e 65  Y);./* handle ne
e2b0: 77 20 68 61 6e 64 73 68 61 6b 65 73 20 69 6e 20  w handshakes in 
e2c0: 62 61 63 6b 67 72 6f 75 6e 64 2e 20 4f 6e 20 62  background. On b
e2d0: 79 20 64 65 66 61 75 6c 74 20 69 6e 20 4f 70 65  y default in Ope
e2e0: 6e 53 53 4c 20 31 2e 31 2e 31 2e 20 2a 2f 0a 23  nSSL 1.1.1. */.#
e2f0: 65 6e 64 69 66 0a 20 20 20 20 53 53 4c 5f 43 54  endif.    SSL_CT
e300: 58 5f 73 65 73 73 5f 73 65 74 5f 63 61 63 68 65  X_sess_set_cache
e310: 5f 73 69 7a 65 28 63 74 78 2c 20 31 32 38 29 3b  _size(ctx, 128);
e320: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 73 65  ..    /* Set use
e330: 72 20 64 65 66 69 6e 65 64 20 63 69 70 68 65 72  r defined cipher
e340: 73 2c 20 63 69 70 68 65 72 20 73 75 69 74 65 73  s, cipher suites
e350: 2c 20 61 6e 64 20 73 65 63 75 72 69 74 79 20 6c  , and security l
e360: 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28  evel */.    if (
e370: 28 63 69 70 68 65 72 73 20 21 3d 20 4e 55 4c 4c  (ciphers != NULL
e380: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
e390: 74 5f 63 69 70 68 65 72 5f 6c 69 73 74 28 63 74  t_cipher_list(ct
e3a0: 78 2c 20 63 69 70 68 65 72 73 29 29 20 7b 0a 09  x, ciphers)) {..
e3b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e3c0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63 69  (interp, "Set ci
e3d0: 70 68 65 72 73 20 66 61 69 6c 65 64 3a 20 4e 6f  phers failed: No
e3e0: 20 76 61 6c 69 64 20 63 69 70 68 65 72 73 22 2c   valid ciphers",
e3f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
e400: 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63  ..SSL_CTX_free(c
e410: 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  tx);..return NUL
e420: 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20  L;.    }.    if 
e430: 28 28 63 69 70 68 65 72 73 75 69 74 65 73 20 21  ((ciphersuites !
e440: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
e450: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 73 75  CTX_set_ciphersu
e460: 69 74 65 73 28 63 74 78 2c 20 63 69 70 68 65 72  ites(ctx, cipher
e470: 73 75 69 74 65 73 29 29 20 7b 0a 09 54 63 6c 5f  suites)) {..Tcl_
e480: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e490: 65 72 70 2c 20 22 53 65 74 20 63 69 70 68 65 72  erp, "Set cipher
e4a0: 20 73 75 69 74 65 73 20 66 61 69 6c 65 64 3a 20   suites failed: 
e4b0: 4e 6f 20 76 61 6c 69 64 20 63 69 70 68 65 72 73  No valid ciphers
e4c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
e4d0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
e4e0: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
e4f0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e500: 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74 79 20  /* Set security 
e510: 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20  level */.    if 
e520: 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26 20 6c  (level > -1 && l
e530: 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f 2a 20  evel < 6) {../* 
e540: 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69 74 79  SSL_set_security
e550: 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c 5f 43  _level */..SSL_C
e560: 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74 79 5f  TX_set_security_
e570: 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76 65 6c  level(ctx, level
e580: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
e590: 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c 62 61   set some callba
e5a0: 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  cks */.    SSL_C
e5b0: 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70  TX_set_default_p
e5c0: 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20 50 61  asswd_cb(ctx, Pa
e5d0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 29 3b  sswordCallback);
e5e0: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
e5f0: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
e600: 63 62 5f 75 73 65 72 64 61 74 61 28 63 74 78 2c  cb_userdata(ctx,
e610: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
e620: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 61 64  r);..    /* read
e630: 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c 6d 61   a Diffie-Hellma
e640: 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  n parameters fil
e650: 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20 62 75  e, or use the bu
e660: 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a 23 69  ilt-in one */.#i
e670: 66 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  fdef OPENSSL_NO_
e680: 44 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72  DH.    if (DHpar
e690: 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ams != NULL) {..
e6a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e6b0: 28 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72  (interp, "DH par
e6c0: 61 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e  ameter support n
e6d0: 6f 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28  ot available", (
e6e0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
e6f0: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
e700: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
e710: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
e720: 20 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20   {..DH* dh;..if 
e730: 28 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c  (DHparams != NUL
e740: 4c 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62  L) {..    BIO *b
e750: 69 6f 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  io;..    Tcl_DSt
e760: 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 09  ringInit(&ds);..
e770: 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f 6e 65      bio = BIO_ne
e780: 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70 61 72  w_file(F2N(DHpar
e790: 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22 29 3b  ams, &ds), "r");
e7a0: 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f 29 20  ..    if (!bio) 
e7b0: 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  {...Tcl_DStringF
e7c0: 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63 6c 5f  ree(&ds);...Tcl_
e7d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
e7e0: 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20  erp, "Could not 
e7f0: 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65 74 65  find DH paramete
e800: 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61 72 20  rs file", (char 
e810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f  *) NULL);...SSL_
e820: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
e830: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20  .return NULL;.. 
e840: 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20 3d 20     }...    dh = 
e850: 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44 48 70  PEM_read_bio_DHp
e860: 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c 4c 2c  arams(bio, NULL,
e870: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 09 20   NULL, NULL);.. 
e880: 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69 6f 29     BIO_free(bio)
e890: 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  ;..    Tcl_DStri
e8a0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
e8b0: 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09 09 54    if (!dh) {...T
e8c0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
e8d0: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
e8e0: 6f 74 20 72 65 61 64 20 44 48 20 70 61 72 61 6d  ot read DH param
e8f0: 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c 65 22  eters from file"
e900: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
e910: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
e920: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
e930: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
e940: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6d    SSL_CTX_set_tm
e950: 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b 0a 09  p_dh(ctx, dh);..
e960: 20 20 20 20 44 48 5f 66 72 65 65 28 64 68 29 3b      DH_free(dh);
e970: 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ...} else {..   
e980: 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b 6e 6f   /* Use well kno
e990: 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65 72 73  wn DH parameters
e9a0: 20 74 68 61 74 20 68 61 76 65 20 62 75 69 6c 74   that have built
e9b0: 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e 20 4f  -in support in O
e9c0: 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20 20 69  penSSL */..    i
e9d0: 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f  f (!SSL_CTX_set_
e9e0: 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 29  dh_auto(ctx, 1))
e9f0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52   {...Tcl_AppendR
ea00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43  esult(interp, "C
ea10: 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c 65 20  ould not enable 
ea20: 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22 2c 20  set DH auto: ", 
ea30: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
ea40: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
ea50: 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  ;...SSL_CTX_free
ea60: 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20  (ctx);...return 
ea70: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  NULL;..    }..}.
ea80: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
ea90: 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63 65 72    /* set our cer
eaa0: 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20 20 20  tificate */.    
eab0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
eac0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 63 65   = 0;.    if (ce
ead0: 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  rtfile != NULL) 
eae0: 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f  {..load_private_
eaf0: 6b 65 79 20 3d 20 31 3b 0a 0a 09 54 63 6c 5f 44  key = 1;...Tcl_D
eb00: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b  StringInit(&ds);
eb10: 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75  ...if (SSL_CTX_u
eb20: 73 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66  se_certificate_f
eb30: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63 65 72  ile(ctx, F2N(cer
eb40: 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c  tfile, &ds), SSL
eb50: 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c  _FILETYPE_PEM) <
eb60: 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  = 0) {..    Tcl_
eb70: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
eb80: 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ;..    Tcl_Appen
eb90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
eba0: 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63  "unable to set c
ebb0: 65 72 74 69 66 69 63 61 74 65 20 66 69 6c 65 20  ertificate file 
ebc0: 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22 3a 20  ", certfile, ": 
ebd0: 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41  ",...GET_ERR_REA
ebe0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
ebf0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
ec00: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
ec10: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
ec20: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ..}.    } else i
ec30: 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c 4c 29  f (cert != NULL)
ec40: 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74 65   {..load_private
ec50: 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20 28 53  _key = 1;..if (S
ec60: 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72 74 69  SL_CTX_use_certi
ec70: 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74 78 2c  ficate_ASN1(ctx,
ec80: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29   cert_len, cert)
ec90: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
eca0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
ecb0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
ecc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ecd0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
ece0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
ecf0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
ed00: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ed10: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
ed20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
ed30: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
ed40: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
ed50: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
ed60: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
ed70: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
ed80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
ed90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
eda0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
edb0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
edc0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
edd0: 30 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  0..    Tcl_DStri
ede0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20  ngFree(&ds);..  
edf0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ee00: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
ee10: 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61 75 6c  le to use defaul
ee20: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69  t certificate fi
ee30: 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20  le ", certfile, 
ee40: 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  ": ",...GET_ERR_
ee50: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
ee60: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
ee70: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
ee80: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
ee90: 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a 20 20  LL;.#endif..}.  
eea0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
eeb0: 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65 79 20  our private key 
eec0: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61 64 5f  */.    if (load_
eed0: 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b 0a 09  private_key) {..
eee0: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
eef0: 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20 4e 55  ULL && key == NU
ef00: 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79 66 69  LL) {..    keyfi
ef10: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
ef20: 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20  }...if (keyfile 
ef30: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
ef40: 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69 76 61  /* get the priva
ef50: 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  te key associate
ef60: 64 20 77 69 74 68 20 74 68 69 73 20 63 65 72 74  d with this cert
ef70: 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20  ificate */..    
ef80: 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d 20 4e  if (keyfile == N
ef90: 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69 6c 65  ULL) {...keyfile
efa0: 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09 20 20   = certfile;..  
efb0: 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 53 53    }...    if (SS
efc0: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
efd0: 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c 20 46  eKey_file(ctx, F
efe0: 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64 73 29  2N(keyfile, &ds)
eff0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
f000: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09 54 63  EM) <= 0) {...Tc
f010: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f020: 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74  s);.../* flush t
f030: 68 65 20 70 61 73 73 70 68 72 61 73 65 20 77 68  he passphrase wh
f040: 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c 65 66  ich might be lef
f050: 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  t in the result 
f060: 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  */...Tcl_SetResu
f070: 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c  lt(interp, NULL,
f080: 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09   TCL_STATIC);...
f090: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
f0a0: 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65  (interp, "unable
f0b0: 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63 20 6b   to set public k
f0c0: 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79 66 69  ey file ", keyfi
f0d0: 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20 20 47  le, " ",...    G
f0e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f0f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f100: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
f110: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
f120: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ULL;..    }..   
f130: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f140: 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73 65 20  (&ds);...} else 
f150: 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c 4c 29  if (key != NULL)
f160: 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53 4c 5f   {..    if (SSL_
f170: 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74 65 4b  CTX_use_PrivateK
f180: 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b 45 59  ey_ASN1(EVP_PKEY
f190: 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79 2c 6b  _RSA, ctx, key,k
f1a0: 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b 0a  ey_len) <= 0) {.
f1b0: 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f1c0: 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75  e(&ds);.../* flu
f1d0: 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61 73  sh the passphras
f1e0: 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65  e which might be
f1f0: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65 73   left in the res
f200: 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74  ult */...Tcl_Set
f210: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e  Result(interp, N
f220: 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  ULL, TCL_STATIC)
f230: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;...Tcl_AppendRe
f240: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f250: 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c  able to set publ
f260: 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f 45  ic key: ", GET_E
f270: 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68  RR_REASON(), (ch
f280: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53  ar *) NULL);...S
f290: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f2a0: 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
f2b0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20 4e  ..    }..}../* N
f2c0: 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  ow we know that 
f2d0: 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20 68  a key and cert h
f2e0: 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67 61  ave been set aga
f2f0: 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53 4c  inst.. * the SSL
f300: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66 20   context */..if 
f310: 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b 5f  (!SSL_CTX_check_
f320: 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78 29  private_key(ctx)
f330: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
f340: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f350: 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20 64  , "private key d
f360: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
f370: 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70 75  e certificate pu
f380: 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20 20  blic key",....  
f390: 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c     (char *) NULL
f3a0: 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f  );..    SSL_CTX_
f3b0: 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20  free(ctx);..    
f3c0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a  return NULL;..}.
f3d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
f3e0: 74 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 43  t verification C
f3f0: 41 73 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  As */.    Tcl_DS
f400: 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a  tringInit(&ds);.
f410: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
f420: 6e 69 74 28 26 64 73 31 29 3b 0a 20 20 20 20 2f  nit(&ds1);.    /
f430: 2a 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 64  * There is one d
f440: 65 66 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79  efault directory
f450: 2c 20 6f 6e 65 20 64 65 66 61 75 6c 74 20 66 69  , one default fi
f460: 6c 65 2c 20 61 6e 64 20 6f 6e 65 20 64 65 66 61  le, and one defa
f470: 75 6c 74 20 73 74 6f 72 65 2e 0a 09 54 68 65 20  ult store...The 
f480: 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69  default CA certi
f490: 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72  ficates director
f4a0: 79 20 28 61 6e 64 20 64 65 66 61 75 6c 74 20 73  y (and default s
f4b0: 74 6f 72 65 29 20 69 73 20 69 6e 20 74 68 65 20  tore) is in the 
f4c0: 4f 70 65 6e 53 53 4c 0a 09 63 65 72 74 73 20 64  OpenSSL..certs d
f4d0: 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 61 6e  irectory. It can
f4e0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
f4f0: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44  y the SSL_CERT_D
f500: 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a  IR env var. The.
f510: 09 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74  .default CA cert
f520: 69 66 69 63 61 74 65 73 20 66 69 6c 65 20 69 73  ificates file is
f530: 20 63 61 6c 6c 65 64 20 63 65 72 74 2e 70 65 6d   called cert.pem
f540: 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20   in the default 
f550: 4f 70 65 6e 53 53 4c 0a 09 64 69 72 65 63 74 6f  OpenSSL..directo
f560: 72 79 2e 20 49 74 20 63 61 6e 20 62 65 20 6f 76  ry. It can be ov
f570: 65 72 72 69 64 64 65 6e 20 62 79 20 74 68 65 20  erridden by the 
f580: 53 53 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e  SSL_CERT_FILE en
f590: 76 20 76 61 72 2e 20 2a 2f 0a 09 2f 2a 20 69 6e  v var. */../* in
f5a0: 74 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65  t SSL_CTX_set_de
f5b0: 66 61 75 6c 74 5f 76 65 72 69 66 79 5f 64 69 72  fault_verify_dir
f5c0: 28 53 53 4c 5f 43 54 58 20 2a 63 74 78 29 20 61  (SSL_CTX *ctx) a
f5d0: 6e 64 20 69 6e 74 20 53 53 4c 5f 43 54 58 5f 73  nd int SSL_CTX_s
f5e0: 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72 69 66  et_default_verif
f5f0: 79 5f 66 69 6c 65 28 53 53 4c 5f 43 54 58 20 2a  y_file(SSL_CTX *
f600: 63 74 78 29 20 2a 2f 0a 20 20 20 20 69 66 20 28  ctx) */.    if (
f610: 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65  !SSL_CTX_load_ve
f620: 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63  rify_locations(c
f630: 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20  tx, F2N(CAfile, 
f640: 26 64 73 29 2c 20 46 32 4e 28 43 41 64 69 72 2c  &ds), F2N(CAdir,
f650: 20 26 64 73 31 29 29 20 7c 7c 0a 09 21 53 53 4c   &ds1)) ||..!SSL
f660: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
f670: 5f 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74  _verify_paths(ct
f680: 78 29 29 20 7b 0a 23 69 66 20 30 0a 09 54 63 6c  x)) {.#if 0..Tcl
f690: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
f6a0: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
f6b0: 72 65 65 28 26 64 73 31 29 3b 0a 09 2f 2a 20 44  ree(&ds1);../* D
f6c0: 6f 6e 27 74 20 63 75 72 72 65 6e 74 6c 79 20 63  on't currently c
f6d0: 61 72 65 20 69 66 20 74 68 69 73 20 66 61 69 6c  are if this fail
f6e0: 73 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64  s */..Tcl_Append
f6f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f700: 53 53 4c 20 64 65 66 61 75 6c 74 20 76 65 72 69  SSL default veri
f710: 66 79 20 70 61 74 68 73 3a 20 22 2c 20 47 45 54  fy paths: ", GET
f720: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f730: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f740: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
f750: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  );..return NULL;
f760: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20  .#endif.    }.. 
f770: 20 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f     /* https://so
f780: 75 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f  urceforge.net/p/
f790: 74 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a  tls/bugs/57/ */.
f7a0: 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a      /* XXX:TODO:
f7b0: 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75   Let the user su
f7c0: 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65  pply values here
f7d0: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65   instead of some
f7e0: 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74  thing that exist
f7f0: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73  s on the filesys
f800: 74 65 6d 20 2a 2f 0a 20 20 20 20 69 66 20 28 43  tem */.    if (C
f810: 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b  Afile != NULL) {
f820: 0a 09 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f  ..STACK_OF(X509_
f830: 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73  NAME) *certNames
f840: 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65   = SSL_load_clie
f850: 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43  nt_CA_file(F2N(C
f860: 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 69  Afile, &ds));..i
f870: 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
f880: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53 53 4c  NULL) {..    SSL
f890: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
f8a0: 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
f8b0: 74 4e 61 6d 65 73 29 3b 0a 09 7d 0a 20 20 20 20  tNames);..}.    
f8c0: 7d 0a 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
f8d0: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 20 20 20  ngFree(&ds);.   
f8e0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f8f0: 28 26 64 73 31 29 3b 0a 20 20 20 20 72 65 74 75  (&ds1);.    retu
f900: 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn ctx;.}.../*. 
f910: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
f920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f950: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74 75  ----. *. * Statu
f960: 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  sObjCmd -- retur
f970: 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  n certificate fo
f980: 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65 72  r connected peer
f990: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
f9a0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
f9b0: 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
f9c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
f9d0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fa20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
fa30: 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69  StatusObjCmd(Cli
fa40: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
fa50: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
fa60: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
fa70: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
fa80: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53   objv[]) {.    S
fa90: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a  tate *statePtr;.
faa0: 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a      X509 *peer;.
fab0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
fac0: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61  Ptr;.    Tcl_Cha
fad0: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63  nnel chan;.    c
fae0: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65  har *channelName
faf0: 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20  , *ciphers;.    
fb00: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f  int mode;.    co
fb10: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
fb20: 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e  r *proto;.    un
fb30: 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a  signed int len;.
fb40: 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73      int nid, res
fb50: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
fb60: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
fb70: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
fb80: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c  ..    if (objc <
fb90: 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c   2 || objc > 3 |
fba0: 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20  | (objc == 3 && 
fbb0: 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53  !strcmp(Tcl_GetS
fbc0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fbd0: 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54  "-local"))) {..T
fbe0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
fbf0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
fc00: 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e   "?-local? chann
fc10: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
fc20: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
fc30: 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e      /* Get chann
fc40: 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61  el Id */.    cha
fc50: 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  nnelName = Tcl_G
fc60: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
fc70: 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20  objv[(objc == 2 
fc80: 3f 20 31 20 3a 20 32 29 5d 2c 20 28 54 63 6c 5f  ? 1 : 2)], (Tcl_
fc90: 53 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Size *) NULL);. 
fca0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
fcb0: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
fcc0: 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d   channelName, &m
fcd0: 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ode);.    if (ch
fce0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
fcf0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
fd00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
fd10: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
fd20: 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
fd30: 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
fd40: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
fd50: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
fd60: 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
fd70: 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
fd80: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
fd90: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
fda0: 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
fdb0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fdc0: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
fdd0: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
fde0: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
fdf0: 09 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20  ."\": not a TLS 
fe00: 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b  channel", NULL);
fe10: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
fe20: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
fe30: 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41  , "STATUS", "CHA
fe40: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
fe50: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
fe60: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
fe70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
fe80: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
fe90: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
fea0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
feb0: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  han);..    /* Ge
fec0: 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
fed0: 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a  r peer or self *
fee0: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
fef0: 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53  = 2) {..peer = S
ff00: 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74  SL_get_peer_cert
ff10: 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
ff20: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
ff30: 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  se {..peer = SSL
ff40: 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65  _get_certificate
ff50: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
ff60: 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65  .    }.    /* Ge
ff70: 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  t X509 certifica
ff80: 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  te info */.    i
ff90: 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
ffa0: 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
ffb0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
ffc0: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20  );..if (objc == 
ffd0: 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 66  2) {..    X509_f
ffe0: 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20 20  ree(peer);..    
fff0: 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a  peer = NULL;..}.
10000 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 62      } else {..ob
10010 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
10020 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
10030 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 65      }..    /* Pe
10040 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 4c  er name */.    L
10050 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
10060 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65 72  p, objPtr, "peer
10070 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30 5f  name", SSL_get0_
10080 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50 74  peername(statePt
10090 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20 20  r->ssl), -1);.  
100a0 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e    LAPPEND_INT(in
100b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
100c0 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f 63  bits", SSL_get_c
100d0 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74 65  ipher_bits(state
100e0 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29 29  Ptr->ssl, NULL))
100f0 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20 3d  ;..    ciphers =
10100 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74 5f   (char*)SSL_get_
10110 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72 2d  cipher(statePtr-
10120 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50 45  >ssl);.    LAPPE
10130 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
10140 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c  bjPtr, "cipher",
10150 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a 0a   ciphers, -1);..
10160 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
10170 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  e X509 certifica
10180 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79 20  te presented by 
10190 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20 20  the peer */.    
101a0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
101b0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
101c0 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35 30  ifyResult",..X50
101d0 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65 72  9_verify_cert_er
101e0 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f 67  ror_string(SSL_g
101f0 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c 74  et_verify_result
10200 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
10210 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
10220 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20 20  erify mode */.  
10230 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65 74    mode = SSL_get
10240 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74 61  _verify_mode(sta
10250 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
10260 20 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c   if (mode && SSL
10270 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a  _VERIFY_NONE) {.
10280 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
10290 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
102a0 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65  rifyMode", "none
102b0 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c  ", -1);.    } el
102c0 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c  se {..Tcl_Obj *l
102d0 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  istObjPtr = Tcl_
102e0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
102f0 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26  LL);..if (mode &
10300 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  & SSL_VERIFY_PEE
10310 52 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  R) {..    Tcl_Li
10320 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
10330 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
10340 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
10350 72 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20  ringObj("peer", 
10360 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f  -1));..}..if (mo
10370 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59  de && SSL_VERIFY
10380 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
10390 5f 43 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63  _CERT) {..    Tc
103a0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
103b0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
103c0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
103d0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69  ewStringObj("fai
103e0 6c 20 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72  l if no peer cer
103f0 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66  t", -1));..}..if
10400 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
10410 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45  RIFY_CLIENT_ONCE
10420 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
10430 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
10440 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
10450 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
10460 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f  ingObj("client o
10470 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  nce", -1));..}..
10480 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f  if (mode && SSL_
10490 56 45 52 49 46 59 5f 50 4f 53 54 5f 48 41 4e 44  VERIFY_POST_HAND
104a0 53 48 41 4b 45 29 20 7b 0a 09 20 20 20 20 54 63  SHAKE) {..    Tc
104b0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
104c0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
104d0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
104e0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 6f 73  ewStringObj("pos
104f0 74 20 68 61 6e 64 73 68 61 6b 65 22 2c 20 2d 31  t handshake", -1
10500 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f  ));..}..LAPPEND_
10510 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OBJ(interp, objP
10520 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22  tr, "verifyMode"
10530 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29 0a 20 20  , listObjPtr).  
10540 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69    }..    /* Veri
10550 66 79 20 6d 6f 64 65 20 64 65 70 74 68 20 2a 2f  fy mode depth */
10560 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
10570 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
10580 20 22 76 65 72 69 66 79 44 65 70 74 68 22 2c 20   "verifyDepth", 
10590 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 64  SSL_get_verify_d
105a0 65 70 74 68 28 73 74 61 74 65 50 74 72 2d 3e 73  epth(statePtr->s
105b0 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  sl));..    /* Re
105c0 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65  port the selecte
105d0 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20  d protocol as a 
105e0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6e 65  result of the ne
105f0 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  gotiation */.   
10600 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73   SSL_get0_alpn_s
10610 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
10620 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
10630 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
10640 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
10650 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
10660 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63  har *)proto, (Tc
10670 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b 0a 20 20  l_Size) len);.  
10680 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
10690 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
106a0 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
106b0 74 5f 76 65 72 73 69 6f 6e 28 73 74 61 74 65 50  t_version(stateP
106c0 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a  tr->ssl), -1);..
106d0 20 20 20 20 2f 2a 20 56 61 6c 69 64 20 66 6f 72      /* Valid for
106e0 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e 61 74 75   non-RSA signatu
106f0 72 65 20 61 6e 64 20 54 4c 53 20 31 2e 33 20 2a  re and TLS 1.3 *
10700 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
10710 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
10720 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
10730 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
10740 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10750 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
10760 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
10770 74 75 72 65 5f 6e 69 64 28 73 74 61 74 65 50 74  ture_nid(statePt
10780 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
10790 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65     }.    if (!re
107a0 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20  s) {nid = 0;}.  
107b0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
107c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
107d0 69 67 6e 61 74 75 72 65 48 61 73 68 41 6c 67 6f  ignatureHashAlgo
107e0 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32  rithm", OBJ_nid2
107f0 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20  ln(nid), -1);.. 
10800 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
10810 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  ) {..res = SSL_g
10820 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72  et_peer_signatur
10830 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
10840 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
10850 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
10860 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67  es = SSL_get_sig
10870 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
10880 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
10890 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nid);.    }.    
108a0 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d  if (!res) {nid =
108b0 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44   0;}.    LAPPEND
108c0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
108d0 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54  Ptr, "signatureT
108e0 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  ype", OBJ_nid2ln
108f0 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  (nid), -1);..   
10900 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10910 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
10920 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10930 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
10940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10960 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10970 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10980 2d 2d 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74  --. *. * Connect
10990 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d  ionInfoObjCmd --
109a0 20 72 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69   return connecti
109b0 6f 6e 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65  on info from Ope
109c0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
109d0 6c 74 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f  lts:. *.A list o
109e0 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  f connection inf
109f0 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  o.  *. *--------
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 0a 20 2a 2f 0a  -----------. */.
10a40 0a 73 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e  .static int Conn
10a50 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64  ectionInfoObjCmd
10a60 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
10a70 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
10a80 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
10a90 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
10aa0 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
10ab0 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63     Tcl_Channel c
10ac0 68 61 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61  han;../* The cha
10ad0 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f  nnel to set a mo
10ae0 64 65 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61  de on */.    Sta
10af0 74 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f  te *statePtr;../
10b00 2a 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66  * client state f
10b10 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f  or ssl socket */
10b20 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
10b30 6a 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  jPtr, *listPtr;.
10b40 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73      const SSL *s
10b50 73 6c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53  sl;.    const SS
10b60 4c 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72  L_CIPHER *cipher
10b70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
10b80 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
10b90 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
10ba0 4d 44 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69  MD *md;.    (voi
10bb0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
10bc0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
10bd0 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
10be0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
10bf0 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
10c00 22 29 3b 0a 09 72 65 74 75 72 6e 28 54 43 4c 5f  ");..return(TCL_
10c10 45 52 52 4f 52 29 3b 0a 20 20 20 20 7d 0a 0a 20  ERROR);.    }.. 
10c20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
10c30 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
10c40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
10c50 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 28  omObj(objv[1], (
10c60 54 63 6c 5f 53 69 7a 65 20 2a 29 4e 55 4c 4c 29  Tcl_Size *)NULL)
10c70 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
10c80 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
10c90 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
10ca0 72 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52  return(TCL_ERROR
10cb0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10cc0 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
10cd0 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
10ce0 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  most channel */.
10cf0 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
10d00 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61  etTopChannel(cha
10d10 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  n);.    if (Tcl_
10d20 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63  GetChannelType(c
10d30 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e  han) != Tls_Chan
10d40 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63  nelType()) {..Tc
10d50 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10d60 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
10d70 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
10d80 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
10d90 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74  ),..    "\": not
10da0 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
10db0 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74   NULL);..Tcl_Set
10dc0 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
10dd0 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e 4e 45 43  , "TLS", "CONNEC
10de0 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e 45 4c 22  TION", "CHANNEL"
10df0 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
10e00 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
10e10 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29 3b  turn(TCL_ERROR);
10e20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62 6a 50  .    }..    objP
10e30 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74  tr = Tcl_NewList
10e40 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 20  Obj(0, NULL);.. 
10e50 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
10e60 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 74 61   info */.    sta
10e70 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
10e80 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49  )Tcl_GetChannelI
10e90 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
10ea0 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73 74 61  );.    ssl = sta
10eb0 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20 20 20  tePtr->ssl;.    
10ec0 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29  if (ssl != NULL)
10ed0 20 7b 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f   {../* connectio
10ee0 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50  n state */..LAPP
10ef0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
10f00 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c  objPtr, "state",
10f10 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
10f20 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
10f30 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
10f40 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
10f50 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
10f60 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
10f70 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  Ptr, "servername
10f80 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  ", SSL_get_serve
10f90 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
10fa0 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
10fb0 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  name), -1);.../*
10fc0 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f   Get protocol */
10fd0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
10fe0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
10ff0 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67 65  rotocol", SSL_ge
11000 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c 20  t_version(ssl), 
11010 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67 6f  -1);.../* Renego
11020 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64 20  tiation allowed 
11030 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
11040 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11050 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f   "renegotiation_
11060 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67 65  allowed", SSL_ge
11070 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f 74  t_secure_renegot
11080 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28 28  iation_support((
11090 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a 09  SSL *) ssl));...
110a0 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79 20  /* Get security 
110b0 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  level */..LAPPEN
110c0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
110d0 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79 5f  jPtr, "security_
110e0 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74 5f  level", SSL_get_
110f0 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28 73  security_level(s
11100 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  sl));.../* Sessi
11110 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50 50  on info */..LAPP
11120 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11130 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
11140 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f 73  n_reused", SSL_s
11150 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73 73  ession_reused(ss
11160 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65 72  l));.../* Is ser
11170 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ver info */..LAP
11180 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
11190 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73 65  , objPtr, "is_se
111a0 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73 65  rver", SSL_is_se
111b0 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  rver(ssl));.../*
111c0 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41 50   Is DTLS */..LAP
111d0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
111e0 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64 74  , objPtr, "is_dt
111f0 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c 73  ls", SSL_is_dtls
11200 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  (ssl));.    }.. 
11210 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e 66     /* Cipher inf
11220 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72 20  o */.    cipher 
11230 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e  = SSL_get_curren
11240 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a 20  t_cipher(ssl);. 
11250 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21 3d     if (cipher !=
11260 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62   NULL) {..char b
11270 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d  uf[BUFSIZ] = {0}
11280 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c 67  ;..int bits, alg
11290 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68  _bits;.../* Ciph
112a0 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50  er name */..LAPP
112b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
112c0 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
112d0 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  , SSL_CIPHER_get
112e0 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
112f0 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d  1);.../* RFC nam
11300 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a 09  e of cipher */..
11310 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11320 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
11330 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c  ndard_name", SSL
11340 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72 64  _CIPHER_standard
11350 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20 2d  _name(cipher), -
11360 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c  1);.../* OpenSSL
11370 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
11380 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
11390 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
113a0 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20  "openssl_name", 
113b0 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e  OPENSSL_cipher_n
113c0 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f 73  ame(SSL_CIPHER_s
113d0 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69 70  tandard_name(cip
113e0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
113f0 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72 65   number of secre
11400 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72 20  t bits used for 
11410 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73 20  cipher */..bits 
11420 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  = SSL_CIPHER_get
11430 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26 61  _bits(cipher, &a
11440 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  lg_bits);..LAPPE
11450 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11460 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f 62  bjPtr, "secret_b
11470 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41  its", bits);..LA
11480 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
11490 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72  , objPtr, "algor
114a0 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f  ithm_bits", alg_
114b0 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62  bits);../* alg_b
114c0 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b 65  its is actual ke
114d0 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20 49  y secret bits. I
114e0 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20 73  f use bits and s
114f0 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68 6d  ecret (algorithm
11500 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a 09  ) bits differ,..
11510 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20 74     the rest of t
11520 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78 65  he bits are fixe
11530 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69  d, i.e. for limi
11540 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68 65  ted export ciphe
11550 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20 2a  rs (bits < 56) *
11560 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65 73  /.../* Indicates
11570 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20 70   which SSL/TLS p
11580 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20  rotocol version 
11590 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74 68  first defined th
115a0 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  e cipher */..LAP
115b0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
115c0 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65   objPtr, "min_ve
115d0 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48  rsion", SSL_CIPH
115e0 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 63  ER_get_version(c
115f0 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f  ipher), -1);.../
11600 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a  * Cipher NID */.
11610 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11620 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69  erp, objPtr, "ci
11630 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72 20  pherNID", (char 
11640 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c  *)OBJ_nid2ln(SSL
11650 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70 68  _CIPHER_get_ciph
11660 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c  er_nid(cipher)),
11670 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
11680 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11690 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c 20  r, "digestNID", 
116a0 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32  (char *)OBJ_nid2
116b0 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ln(SSL_CIPHER_ge
116c0 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69 70  t_digest_nid(cip
116d0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50  her)), -1);..LAP
116e0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
116f0 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78 63   objPtr, "keyExc
11700 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61 72  hangeNID", (char
11710 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
11720 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f  L_CIPHER_get_kx_
11730 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
11740 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
11750 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11760 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e  "authenticationN
11770 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a  ID", (char *)OBJ
11780 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48  _nid2ln(SSL_CIPH
11790 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64 28  ER_get_auth_nid(
117a0 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a  cipher)), -1);..
117b0 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74 68  ./* message auth
117c0 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65 20  entication code 
117d0 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41 44  - Cipher is AEAD
117e0 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68   (e.g. GCM or Ch
117f0 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35 29  aCha20/Poly1305)
11800 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41   or not */../* A
11810 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e 63  uthenticated Enc
11820 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73 73  ryption with ass
11830 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41 45  ociated data (AE
11840 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41  AD) check */..LA
11850 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
11860 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
11870 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53 4c  er_is_aead", SSL
11880 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64 28  _CIPHER_is_aead(
11890 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44  cipher));.../* D
118a0 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69 6e  igest used durin
118b0 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68 61  g the SSL/TLS ha
118c0 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73 69  ndshake when usi
118d0 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20 2a  ng the cipher. *
118e0 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48  /..md = SSL_CIPH
118f0 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b 65  ER_get_handshake
11900 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29 3b  _digest(cipher);
11910 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
11920 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68  terp, objPtr, "h
11930 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74 22  andshake_digest"
11940 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d 44  , (char *)EVP_MD
11950 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a  _name(md), -1);.
11960 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c  ../* Get OpenSSL
11970 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f  -specific ID, no
11980 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41  t IANA ID */..LA
11990 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70  PPEND_INT(interp
119a0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
119b0 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  r_id", (int) SSL
119c0 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28 63  _CIPHER_get_id(c
119d0 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77  ipher));.../* Tw
119e0 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20 69  o-byte ID used i
119f0 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f 63  n the TLS protoc
11a00 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ol of the given 
11a10 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45  cipher */..LAPPE
11a20 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
11a30 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c  bjPtr, "protocol
11a40 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f  _id", (int) SSL_
11a50 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f  CIPHER_get_proto
11a60 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29 3b  col_id(cipher));
11a70 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64 65  .../* Textual de
11a80 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
11a90 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20 28   cipher */..if (
11aa0 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
11ab0 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20 62  iption(cipher, b
11ac0 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29 29  uf, sizeof(buf))
11ad0 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
11ae0 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11af0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65  erp, objPtr, "de
11b00 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c  scription", buf,
11b10 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a   -1);..}.    }..
11b20 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69      /* Session i
11b30 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73 69  nfo */.    sessi
11b40 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73  on = SSL_get_ses
11b50 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69  sion(ssl);.    i
11b60 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55  f (session != NU
11b70 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
11b80 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63 6b  igned char *tick
11b90 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32  et;..size_t len2
11ba0 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
11bb0 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73  ulen;..const uns
11bc0 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73  igned char *sess
11bd0 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a  ion_id, *proto;.
11be0 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62  .unsigned char b
11bf0 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41  uffer[SSL_MAX_MA
11c00 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d  STER_KEY_LENGTH]
11c10 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68  ;.../* Report th
11c20 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f  e selected proto
11c30 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20  col as a result 
11c40 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f  of the ALPN nego
11c50 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  tiation */..SSL_
11c60 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70  SESSION_get0_alp
11c70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73 69  n_selected(sessi
11c80 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e  on, &proto, &len
11c90 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  2);..LAPPEND_STR
11ca0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11cb0 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
11cc0 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  ) proto, (Tcl_Si
11cd0 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20  ze) len2);.../* 
11ce0 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65 63  Report the selec
11cf0 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20  ted protocol as 
11d00 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  a result of the 
11d10 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  NPN negotiation 
11d20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50  */.#ifdef USE_NP
11d30 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74  N..SSL_get0_next
11d40 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65  _proto_negotiate
11d50 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  d(ssl, &proto, &
11d60 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
11d70 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11d80 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61 72  tr, "npn", (char
11d90 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f   *) proto, (Tcl_
11da0 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e  Size) ulen);.#en
11db0 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62  dif.../* Resumab
11dc0 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c  le session */..L
11dd0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
11de0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65 73  rp, objPtr, "res
11df0 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53  umable", SSL_SES
11e00 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c  SION_is_resumabl
11e10 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  e(session));.../
11e20 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74 20  * Session start 
11e30 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73 69  time (seconds si
11e40 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c  nce epoch) */..L
11e50 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65  APPEND_LONG(inte
11e60 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61  rp, objPtr, "sta
11e70 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  rt_time", SSL_SE
11e80 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73  SSION_get_time(s
11e90 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
11ea0 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20 53  imeout value - S
11eb0 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f  SL_CTX_get_timeo
11ec0 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  ut (in seconds) 
11ed0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
11ee0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11ef0 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f   "timeout", SSL_
11f00 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65  SESSION_get_time
11f10 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a  out(session));..
11f20 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2d  ./* Session id -
11f30 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65 6c   TLSv1.2 and bel
11f40 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73  ow only */..sess
11f50 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
11f60 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
11f70 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
11f80 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
11f90 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
11fa0 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69  ssion_id", sessi
11fb0 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65  on_id, (Tcl_Size
11fc0 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65  ) ulen);.../* Se
11fd0 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f  ssion context */
11fe0 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53  ..session_id = S
11ff0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
12000 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73 69  id_context(sessi
12010 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  on, &ulen);..LAP
12020 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65  PEND_BARRAY(inte
12030 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12040 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73  sion_context", s
12050 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
12060 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
12070 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65 74  * Session ticket
12080 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a   - client only *
12090 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  /..SSL_SESSION_g
120a0 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73 69  et0_ticket(sessi
120b0 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c 65  on, &ticket, &le
120c0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  n2);..LAPPEND_BA
120d0 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
120e0 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69  Ptr, "session_ti
120f0 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20 28  cket", ticket, (
12100 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b  Tcl_Size) len2);
12110 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
12120 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68 69  cket lifetime hi
12130 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29 20  nt (in seconds) 
12140 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47  */..LAPPEND_LONG
12150 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12160 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53 4c   "lifetime", SSL
12170 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63  _SESSION_get_tic
12180 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e  ket_lifetime_hin
12190 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f  t(session));.../
121a0 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61 74  * Ticket app dat
121b0 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c  a */.#if OPENSSL
121c0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
121d0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 53  < 0x30000000L..S
121e0 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f  SL_SESSION_get0_
121f0 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28 28  ticket_appdata((
12200 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73  SSL_SESSION *) s
12210 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
12220 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
12230 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
12240 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65 74   objPtr, "ticket
12250 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63 6b  _app_data", tick
12260 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c  et, (Tcl_Size) l
12270 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f  en2);.#endif.../
12280 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65 79  * Get master key
12290 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f   */..len2 = SSL_
122a0 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74  SESSION_get_mast
122b0 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20  er_key(session, 
122c0 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f  buffer, SSL_MAX_
122d0 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54  MASTER_KEY_LENGT
122e0 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52  H);..LAPPEND_BAR
122f0 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  RAY(interp, objP
12300 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79 22  tr, "master_key"
12310 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f 53  , buffer, (Tcl_S
12320 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
12330 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64 20   Compression id 
12340 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  */..unsigned int
12350 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f   id = SSL_SESSIO
12360 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69  N_get_compress_i
12370 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50  d(session);..LAP
12380 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12390 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
123a0 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d  ssion_id", id ==
123b0 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e   1 ? "zlib" : "n
123c0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
123d0 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73  ..    /* Compres
123e0 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  sion info */.   
123f0 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c   if (ssl != NULL
12400 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45 5f  ) {.#ifdef HAVE_
12410 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a  SSL_COMPRESSION.
12420 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48  .const COMP_METH
12430 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b  OD *comp, *expn;
12440 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74  ..comp = SSL_get
12450 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73  _current_compres
12460 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e  sion(ssl);..expn
12470 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
12480 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c  nt_expansion(ssl
12490 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  );...LAPPEND_STR
124a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
124b0 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20   "compression", 
124c0 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f  comp ? SSL_COMP_
124d0 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a  get_name(comp) :
124e0 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c   "none", -1);..L
124f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12500 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70 61  p, objPtr, "expa
12510 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53  nsion", expn ? S
12520 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65  SL_COMP_get_name
12530 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c  (expn) : "none",
12540 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50   -1);.#else..LAP
12550 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12560 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65   objPtr, "compre
12570 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20  ssion", "none", 
12580 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  -1);..LAPPEND_ST
12590 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
125a0 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22  , "expansion", "
125b0 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64  none", -1);.#end
125c0 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  if.    }..    /*
125d0 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a   Server info */.
125e0 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65      {..long mode
125f0 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73   = SSL_CTX_get_s
12600 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64  ession_cache_mod
12610 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29  e(statePtr->ctx)
12620 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09  ;..char *msg;...
12630 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
12640 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b  ESS_CACHE_OFF) {
12650 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66 66  ..    msg = "off
12660 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d  ";..} else if (m
12670 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43  ode & SSL_SESS_C
12680 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09  ACHE_CLIENT) {..
12690 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e      msg = "clien
126a0 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  t";..} else if (
126b0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
126c0 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b 0a  CACHE_SERVER) {.
126d0 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72 76  .    msg = "serv
126e0 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  er";..} else if 
126f0 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
12700 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09  _CACHE_BOTH) {..
12710 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68 22      msg = "both"
12720 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
12730 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22   msg = "unknown"
12740 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54  ;..}..LAPPEND_ST
12750 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12760 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  , "session_cache
12770 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29  _mode", msg, -1)
12780 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12790 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f  CA List */.    /
127a0 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76 65  * IF not a serve
127b0 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f 67  r, same as SSL_g
127c0 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74  et0_peer_CA_list
127d0 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d 65  . If server same
127e0 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f   as SSL_CTX_get_
127f0 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a  client_CA_list *
12800 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d 20  /.    listPtr = 
12810 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
12820 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41  , NULL);.    STA
12830 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29  CK_OF(X509_NAME)
12840 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69   *ca_list;.    i
12850 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53 53  f ((ca_list = SS
12860 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  L_get_client_CA_
12870 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e 55  list(ssl)) != NU
12880 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 66  LL) {..char buff
12890 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72  er[BUFSIZ];..for
128a0 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
128b0 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
128c0 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29  m(ca_list); i++)
128d0 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d   {..    X509_NAM
128e0 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30  E *name = sk_X50
128f0 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f  9_NAME_value(ca_
12900 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20 69  list, i);..    i
12910 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30  f (name) {...X50
12920 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e  9_NAME_oneline(n
12930 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55 46  ame, buffer, BUF
12940 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74  SIZ);...Tcl_List
12950 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
12960 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72  (interp, listPtr
12970 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
12980 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29 3b  bj(buffer, -1));
12990 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
129a0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a  .    LAPPEND_OBJ
129b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
129c0 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74 50   "caList", listP
129d0 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44  tr);.    LAPPEND
129e0 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _INT(interp, obj
129f0 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e  Ptr, "caListCoun
12a00 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45  t", sk_X509_NAME
12a10 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a  _num(ca_list));.
12a20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
12a30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62  esult(interp, ob
12a40 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72  jPtr);.    retur
12a50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
12a60 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
12a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12aa0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72  ------. *. * Ver
12ab0 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  sionObjCmd -- re
12ac0 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74 72  turn version str
12ad0 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c  ing from OpenSSL
12ae0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
12af0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
12b00 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
12b10 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
12b20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12b70 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
12b80 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c  VersionObjCmd(Cl
12b90 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
12ba0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
12bb0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
12bc0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
12bd0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
12be0 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
12bf0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
12c00 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f 69  ntData;.    (voi
12c10 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f  d) objc;.    (vo
12c20 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64  id) objv;..    d
12c30 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
12c40 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
12c50 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
12c60 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e  (OPENSSL_VERSION
12c70 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20  _TEXT, -1);.    
12c80 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
12c90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
12ca0 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
12cb0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
12cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12d00 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a  --. *. * MiscObj
12d10 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d  Cmd -- misc comm
12d20 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ands. *. * Resul
12d30 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
12d40 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a  d Tcl result.. *
12d50 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
12d60 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a  :. *.None.. *. *
12d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  ---. */.static i
12dc0 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c  nt.MiscObjCmd(Cl
12dd0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
12de0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
12df0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
12e00 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
12e10 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
12e20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
12e30 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d  r *commands [] =
12e40 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72 65   { "req", "strre
12e50 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20  q", NULL };.    
12e60 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43  enum command { C
12e70 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c 20  _REQ, C_STRREQ, 
12e80 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54  C_DUMMY };.    T
12e90 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20  cl_Size cmd;.   
12ea0 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20 20   int isStr;.    
12eb0 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33 38  char buffer[1638
12ec0 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  4];.    (void) c
12ed0 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
12ee0 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
12ef0 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
12f00 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f   < 2) {..Tcl_Wro
12f10 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
12f20 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63  , 1, objv, "subc
12f30 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b  ommand ?args?");
12f40 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
12f50 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
12f60 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72   (Tcl_GetIndexFr
12f70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12f80 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c  jv[1], commands,
12f90 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26   "command", 0, &
12fa0 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  cmd) != TCL_OK) 
12fb0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
12fc0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
12fd0 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
12fe0 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d 20  );..    isStr = 
12ff0 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45 51  (cmd == C_STRREQ
13000 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28 28  );.    switch ((
13010 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d  enum command) cm
13020 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45 51  d) {..case C_REQ
13030 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45 51  :..case C_STRREQ
13040 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b 45  : {..    EVP_PKE
13050 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20  Y *pkey=NULL;.. 
13060 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e 55     X509 *cert=NU
13070 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  LL;..    X509_NA
13080 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09  ME *name=NULL;..
13090 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69      Tcl_Obj **li
130a0 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69  stv;..    Tcl_Si
130b0 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20 69  ze listc;..    i
130c0 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20  nt i;...    BIO 
130d0 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20  *out=NULL;...   
130e0 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b   char *k_C="",*k
130f0 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a  _ST="",*k_L="",*
13100 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c  k_O="",*k_OU="",
13110 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69  *k_CN="",*k_Emai
13120 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72 20  l="";..    char 
13130 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c  *keyout,*pemout,
13140 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b  *str;..    int k
13150 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c  eysize,serial=0,
13160 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f  days=365;..#if O
13170 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
13180 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
13190 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d 20  00L..    BIGNUM 
131a0 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20  *bne = NULL;..  
131b0 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c    RSA *rsa = NUL
131c0 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45 56  L;.#else..    EV
131d0 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78 20  P_PKEY_CTX *ctx 
131e0 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a  = NULL;.#endif..
131f0 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c 35  .    if ((objc<5
13200 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b  ) || (objc>6)) {
13210 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  ...Tcl_WrongNumA
13220 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
13230 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65  bjv, "keysize ke
13240 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20 3f  yfile certfile ?
13250 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72  info?");...retur
13260 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
13270 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54 63    }...    if (Tc
13280 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
13290 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
132a0 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54 43   &keysize) != TC
132b0 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e  L_OK) {...return
132c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20   TCL_ERROR;..   
132d0 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d 54   }..    keyout=T
132e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
132f0 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f  v[3]);..    pemo
13300 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
13310 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20  (objv[4]);..    
13320 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 54  if (isStr) {...T
13330 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
13340 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09  ,keyout,"",0);..
13350 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65  .Tcl_SetVar(inte
13360 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b  rp,pemout,"",0);
13370 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
13380 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69   (objc>=6) {...i
13390 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65  f (Tcl_ListObjGe
133a0 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70  tElements(interp
133b0 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74  , objv[5], &list
133c0 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54 43  c, &listv) != TC
133d0 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72 65  L_OK) {...    re
133e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
133f0 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73 74  ..}....if ((list
13400 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09 20  c%2) != 0) {... 
13410 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
13420 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61  (interp,"Informa
13430 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 68  tion list must h
13440 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72 20  ave even number 
13450 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55  of arguments",NU
13460 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75 72  LL);...    retur
13470 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
13480 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c  ...for (i=0; i<l
13490 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09  istc; i+=2) {...
134a0 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74 53      str=Tcl_GetS
134b0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b  tring(listv[i]);
134c0 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63 6d  ...    if (strcm
134d0 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d 30  p(str,"days")==0
134e0 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
134f0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13500 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13510 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09  days)!=TCL_OK)..
13520 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
13530 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20  _ERROR;...    } 
13540 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
13550 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30  str,"serial")==0
13560 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f 47  ) {....if (Tcl_G
13570 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
13580 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26  erp,listv[i+1],&
13590 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29  serial)!=TCL_OK)
135a0 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ....    return T
135b0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20  CL_ERROR;...    
135c0 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
135d0 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b  p(str,"C")==0) {
135e0 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53  ....k_C=Tcl_GetS
135f0 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
13600 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
13610 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
13620 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  ST")==0) {....k_
13630 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ST=Tcl_GetString
13640 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09  (listv[i+1]);...
13650 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
13660 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d  trcmp(str,"L")==
13670 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f  0) {....k_L=Tcl_
13680 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
13690 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
136a0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
136b0 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"O")==0) {...
136c0 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_O=Tcl_GetStri
136d0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
136e0 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
136f0 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55 22  (strcmp(str,"OU"
13700 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d  )==0) {....k_OU=
13710 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
13720 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
13730 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
13740 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29  mp(str,"CN")==0)
13750 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47   {....k_CN=Tcl_G
13760 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69  etString(listv[i
13770 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c  +1]);...    } el
13780 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74  se if (strcmp(st
13790 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b  r,"Email")==0) {
137a0 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f  ....k_Email=Tcl_
137b0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
137c0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
137d0 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74  lse {....Tcl_Set
137e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 55  Result(interp,"U
137f0 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65 72  nknown parameter
13800 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75  ",NULL);....retu
13810 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
13820 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d      }...}..    }
13830 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ..#if OPENSSL_VE
13840 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
13850 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20 20  x30000000L..    
13860 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a  bne = BN_new();.
13870 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f 6e  .    rsa = RSA_n
13880 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79 20  ew();..    pkey 
13890 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29  = EVP_PKEY_new()
138a0 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20 3d  ;..    if (bne =
138b0 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d  = NULL || rsa ==
138c0 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d   NULL || pkey ==
138d0 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74   NULL || !BN_set
138e0 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46 34  _word(bne,RSA_F4
138f0 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65  ) ||...!RSA_gene
13900 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c  rate_key_ex(rsa,
13910 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e   keysize, bne, N
13920 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45  ULL) || !EVP_PKE
13930 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b 65  Y_assign_RSA(pke
13940 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56 50  y, rsa)) {...EVP
13950 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
13960 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65 28  ;.../* RSA_free(
13970 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20 45  rsa); freed by E
13980 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a  VP_PKEY_free */.
13990 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a  ..BN_free(bne);.
139a0 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79 20  #else..    pkey 
139b0 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28 75  = EVP_RSA_gen((u
139c0 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65 79  nsigned int) key
139d0 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78 20  size);..    ctx 
139e0 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e  = EVP_PKEY_CTX_n
139f0 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09  ew(pkey,NULL);..
13a00 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20      if (pkey == 
13a10 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e  NULL || ctx == N
13a20 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ULL || !EVP_PKEY
13a30 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74 78  _keygen_init(ctx
13a40 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59  ) ||...!EVP_PKEY
13a50 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79  _CTX_set_rsa_key
13a60 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b 65  gen_bits(ctx, ke
13a70 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50  ysize) || !EVP_P
13a80 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20  KEY_keygen(ctx, 
13a90 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50 5f  &pkey)) {...EVP_
13aa0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
13ab0 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f  ...EVP_PKEY_CTX_
13ac0 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64 69  free(ctx);.#endi
13ad0 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c  f...Tcl_SetResul
13ae0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
13af0 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76 61  generating priva
13b00 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09  te key",NULL);..
13b10 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
13b20 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b  R;..    } else {
13b30 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a  ...if (isStr) {.
13b40 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
13b50 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a  w(BIO_s_mem());.
13b60 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
13b70 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
13b80 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
13b90 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
13ba0 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61 64  ..    i=BIO_read
13bb0 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a 65  (out,buffer,size
13bc0 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a 09  of(buffer)-1);..
13bd0 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20 30  .    i=(i<0) ? 0
13be0 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66 66   : i;...    buff
13bf0 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20  er[i]='\0';...  
13c00 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
13c10 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65  erp,keyout,buffe
13c20 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  r,0);...    BIO_
13c30 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20 20  flush(out);...  
13c40 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b    BIO_free(out);
13c50 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
13c60 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49    out=BIO_new(BI
13c70 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20  O_s_file());... 
13c80 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c     BIO_write_fil
13c90 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74  ename(out,keyout
13ca0 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69  );...    PEM_wri
13cb0 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65  te_bio_PrivateKe
13cc0 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c  y(out,pkey,NULL,
13cd0 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c  NULL,0,NULL,NULL
13ce0 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f  );...    /* PEM_
13cf0 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72 69  write_bio_RSAPri
13d00 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73 61  vateKey(out, rsa
13d10 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c  , NULL, NULL, 0,
13d20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f   NULL, NULL); */
13d30 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f  ...    BIO_free_
13d40 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a  all(out);.. .}..
13d50 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30 39  ..if ((cert=X509
13d60 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b  _new())==NULL) {
13d70 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
13d80 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72  sult(interp,"Err
13d90 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63 65  or generating ce
13da0 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65 73  rtificate reques
13db0 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20  t",NULL);...    
13dc0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
13dd0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
13de0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
13df0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
13e00 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29      BN_free(bne)
13e10 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 72  ;.#endif...    r
13e20 65 74 75 72 6e 28 54 43 4c 5f 45 52 52 4f 52 29  eturn(TCL_ERROR)
13e30 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
13e40 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
13e50 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
13e60 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
13e70 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
13e80 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
13e90 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
13ea0 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
13eb0 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
13ec0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
13ed0 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
13ee0 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
13ef0 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35  0*24*days);...X5
13f00 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65  09_set_pubkey(ce
13f10 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d  rt,pkey);....nam
13f20 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
13f30 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
13f40 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
13f50 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
13f60 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
13f70 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
13f80 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
13f90 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
13fa0 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
13fb0 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
13fc0 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
13fd0 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
13fe0 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54  ned char *) k_ST
13ff0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
14000 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
14010 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
14020 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
14030 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
14040 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20  ed char *) k_L, 
14050 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
14060 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
14070 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
14080 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
14090 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
140a0 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31   char *) k_O, -1
140b0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
140c0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
140d0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
140e0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
140f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
14100 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
14110 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14120 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14130 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
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 43 4e 2c 20 2d 31  char *) k_CN, -1
14170 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
14180 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
14190 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
141a0 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
141b0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
141c0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61  ed char *) k_Ema
141d0 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  il, -1, -1, 0);.
141e0 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a  ...X509_set_subj
141f0 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61  ect_name(cert,na
14200 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30  me);....if (!X50
14210 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79  9_sign(cert,pkey
14220 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20  ,EVP_sha256())) 
14230 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65  {...    X509_fre
14240 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45  e(cert);...    E
14250 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
14260 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
14270 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
14280 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
14290 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
142a0 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63  .#endif...    Tc
142b0 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
142c0 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
142d0 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
142e0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
142f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
14300 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20  }....if (isStr) 
14310 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
14320 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
14330 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
14340 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
14350 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ert);...    i=BI
14360 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
14370 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
14380 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
14390 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
143a0 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
143b0 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
143c0 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
143d0 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
143e0 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
143f0 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
14400 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
14410 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
14420 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
14430 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
14440 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
14450 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  pemout);...    P
14460 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
14470 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
14480 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
14490 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  out);...}....X50
144a0 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
144b0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
144c0 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
144d0 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
144e0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
144f0 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
14500 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ndif..    }..}..
14510 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
14520 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  lt:..break;.    
14530 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
14540 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  _OK;.}.../******
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14560 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20  /* Init         
14570 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
14590 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
145a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
145d0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
145e0 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
145f0 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
14600 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
14610 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
14620 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
14630 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
14640 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
14650 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
14660 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
14670 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
14680 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
14690 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
146a0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
146b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
146e0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
146f0 54 6c 73 5f 46 72 65 65 28 63 68 61 72 20 2a 62  Tls_Free(char *b
14700 6c 6f 63 6b 50 74 72 29 20 7b 0a 20 20 20 20 53  lockPtr) {.    S
14710 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
14720 20 28 53 74 61 74 65 20 2a 29 62 6c 6f 63 6b 50   (State *)blockP
14730 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  tr;..    dprintf
14740 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
14750 20 54 6c 73 5f 43 6c 65 61 6e 28 73 74 61 74 65   Tls_Clean(state
14760 50 74 72 29 3b 0a 20 20 20 20 63 6b 66 72 65 65  Ptr);.    ckfree
14770 28 62 6c 6f 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a  (blockPtr);.}...
14780 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
147c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54  --------. *. * T
147d0 6c 73 5f 43 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20  ls_Clean --. *. 
147e0 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65  *.This procedure
147f0 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20   cleans up when 
14800 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73  a SSL socket bas
14810 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73  ed channel. *.is
14820 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20   closed and its 
14830 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
14840 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 2e 20 20  falls below 1.  
14850 54 68 69 73 20 73 68 6f 75 6c 64 0a 20 2a 09 62  This should. *.b
14860 65 20 63 61 6c 6c 65 64 20 73 79 6e 63 68 72 6f  e called synchro
14870 6e 6f 75 73 6c 79 20 62 79 20 74 68 65 20 43 6c  nously by the Cl
14880 6f 73 65 50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20  oseProc, not in 
14890 74 68 65 0a 20 2a 09 45 76 65 6e 74 75 61 6c 6c  the. *.Eventuall
148a0 79 46 72 65 65 20 63 61 6c 6c 62 61 63 6b 2e 0a  yFree callback..
148b0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
148c0 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.none. *. * Sid
148d0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72  e effects:. *.Fr
148e0 65 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74  ees all the stat
148f0 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  e. *. *---------
14900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
14940 6f 69 64 20 54 6c 73 5f 43 6c 65 61 6e 28 53 74  oid Tls_Clean(St
14950 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b  ate *statePtr) {
14960 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
14970 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a  lled");..    /*.
14980 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73 73       * we're ass
14990 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74 20  uming here that 
149a0 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72  we're single-thr
149b0 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20  eaded.     */.  
149c0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
149d0 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69  timer != (Tcl_Ti
149e0 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20  merToken) NULL) 
149f0 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d  {..Tcl_DeleteTim
14a00 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50  erHandler(stateP
14a10 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61  tr->timer);..sta
14a20 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e  tePtr->timer = N
14a30 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
14a40 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
14a50 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28  otos) {..ckfree(
14a60 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
14a70 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  );..statePtr->pr
14a80 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  otos = NULL;.   
14a90 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
14aa0 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20  Ptr->bio) {../* 
14ab0 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53  This will call S
14ac0 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67  SL_shutdown. Bug
14ad0 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72   1414045 */..dpr
14ae0 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61  intf("BIO_free_a
14af0 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ll(%p)", statePt
14b00 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72  r->bio);..BIO_fr
14b10 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d  ee_all(statePtr-
14b20 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72  >bio);..statePtr
14b30 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->bio = NULL;.  
14b40 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74    }.    if (stat
14b50 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64 70  ePtr->ssl) {..dp
14b60 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65 28  rintf("SSL_free(
14b70 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e  %p)", statePtr->
14b80 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65 28  ssl);..SSL_free(
14b90 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
14ba0 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20 3d  .statePtr->ssl =
14bb0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
14bc0 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63   if (statePtr->c
14bd0 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66  tx) {..SSL_CTX_f
14be0 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ree(statePtr->ct
14bf0 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63  x);..statePtr->c
14c00 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  tx = NULL;.    }
14c10 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
14c20 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  r->callback) {..
14c30 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
14c40 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
14c50 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ack);..statePtr-
14c60 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c  >callback = NULL
14c70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
14c80 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
14c90 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  rd) {..Tcl_DecrR
14ca0 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
14cb0 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74  ->password);..st
14cc0 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
14cd0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
14ce0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
14cf0 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65  >vcmd) {..Tcl_De
14d00 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
14d10 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61  Ptr->vcmd);..sta
14d20 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55  tePtr->vcmd = NU
14d30 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LL;.    }..    d
14d40 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
14d50 67 22 29 3b 0a 7d 0a 0c 0a 23 69 66 20 54 43 4c  g");.}...#if TCL
14d60 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e  _MAJOR_VERSION >
14d70 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56   8.#define MIN_V
14d80 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c  ERSION "9.0".#el
14d90 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56  se.#define MIN_V
14da0 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e  ERSION "8.5".#en
14db0 64 69 66 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  dif../*. *------
14dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14e00 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
14e10 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
14e20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
14e30 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
14e40 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
14e50 64 0a 20 2a 09 62 79 20 54 63 6c 20 77 68 65 6e  d. *.by Tcl when
14e60 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
14e70 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
14e80 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
14e90 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 20 20   *. * Results:  
14ea0 53 73 6c 20 63 6f 6e 66 69 67 75 72 65 64 20 61  Ssl configured a
14eb0 6e 64 20 6c 6f 61 64 65 64 0a 20 2a 0a 20 2a 20  nd loaded. *. * 
14ec0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
14ed0 09 20 63 72 65 61 74 65 20 74 68 65 20 73 73 6c  . create the ssl
14ee0 20 63 6f 6d 6d 61 6e 64 2c 20 69 6e 69 74 69 61   command, initia
14ef0 6c 69 7a 65 20 73 73 6c 20 63 6f 6e 74 65 78 74  lize ssl context
14f00 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
14f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c  ---------. */.DL
14f50 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
14f60 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
14f70 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 63  *interp) {.    c
14f80 6f 6e 73 74 20 63 68 61 72 20 74 6c 73 54 63 6c  onst char tlsTcl
14f90 49 6e 69 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b  InitScript[] = {
14fa0 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74  .#include "tls.t
14fb0 63 6c 2e 68 22 0a 09 30 78 30 30 0a 20 20 20 20  cl.h"..0x00.    
14fc0 7d 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  };..    dprintf(
14fd0 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64  "Called");..#ifd
14fe0 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53  ef USE_TCL_STUBS
14ff0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69  .    if (Tcl_Ini
15000 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d  tStubs(interp, M
15010 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
15020 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
15030 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
15040 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
15050 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65   (Tcl_PkgRequire
15060 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20  (interp, "Tcl", 
15070 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
15080 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
15090 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
150a0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73    }..    if (Tls
150b0 4c 69 62 49 6e 69 74 28 30 29 20 21 3d 20 54 43  LibInit(0) != TC
150c0 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70  L_OK) {..Tcl_App
150d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
150e0 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69  , "could not ini
150f0 74 69 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72  tialize SSL libr
15100 61 72 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ary", (char *) N
15110 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
15120 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
15130 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
15140 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
15150 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c   "tls::ciphers",
15160 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20   CiphersObjCmd, 
15170 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
15180 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
15190 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
151a0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
151b0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
151c0 20 22 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f   "tls::connectio
151d0 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e  n", ConnectionIn
151e0 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  foObjCmd, (Clien
151f0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
15200 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15210 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
15220 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
15230 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a  nd(interp, "tls:
15240 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e  :handshake", Han
15250 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43  dshakeObjCmd, (C
15260 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15270 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15280 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15290 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
152a0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
152b0 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d  tls::import", Im
152c0 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  portObjCmd, (Cli
152d0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
152e0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
152f0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15300 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15310 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15320 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e  s::unimport", Un
15330 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  importObjCmd, (C
15340 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
15350 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
15360 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
15370 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
15380 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
15390 74 6c 73 3a 3a 73 74 61 74 75 73 22 2c 20 53 74  tls::status", St
153a0 61 74 75 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  atusObjCmd, (Cli
153b0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
153c0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
153d0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
153e0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
153f0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15400 73 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72  s::version", Ver
15410 73 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  sionObjCmd, (Cli
15420 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
15430 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
15440 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
15450 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
15460 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c  mand(interp, "tl
15470 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62  s::misc", MiscOb
15480 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
15490 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
154a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
154b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
154c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
154d0 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 72 6f  nterp, "tls::pro
154e0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f  tocols", Protoco
154f0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  lsObjCmd, (Clien
15500 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
15510 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
15520 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69  *) NULL);..    i
15530 66 20 28 69 6e 74 65 72 70 29 20 7b 0a 09 54 63  f (interp) {..Tc
15540 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74  l_Eval(interp, t
15550 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29  lsTclInitScript)
15560 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
15570 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn Tcl_PkgProvi
15580 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41  de(interp, PACKA
15590 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45  GE_NAME, PACKAGE
155a0 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a  _VERSION);.}../*
155b0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
155c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
155e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
155f0 09 54 6c 73 5f 53 61 66 65 49 6e 69 74 20 2d 2d  .Tls_SafeInit --
15600 0a 20 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *.---------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15630 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 09 53 74 61 6e  -------*. *.Stan
15640 64 61 72 64 20 70 72 6f 63 65 64 75 72 65 20 72  dard procedure r
15650 65 71 75 69 72 65 64 20 62 79 20 27 6c 6f 61 64  equired by 'load
15660 27 2e 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65  '.. *.Initialize
15670 73 20 74 68 69 73 20 65 78 74 65 6e 73 69 6f 6e  s this extension
15680 20 66 6f 72 20 61 20 73 61 66 65 20 69 6e 74 65   for a safe inte
15690 72 70 72 65 74 65 72 2e 0a 20 2a 09 2d 2d 2d 2d  rpreter.. *.----
156a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
156c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
156d0 0a 20 2a 09 53 69 64 65 20 65 66 66 65 63 74 73  . *.Side effects
156e0 3a 0a 20 2a 09 09 41 73 20 6f 66 20 27 54 6c 73  :. *..As of 'Tls
156f0 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 09 52 65 73  _Init'. *. *.Res
15700 75 6c 74 3a 0a 20 2a 09 09 41 20 73 74 61 6e 64  ult:. *..A stand
15710 61 72 64 20 54 63 6c 20 65 72 72 6f 72 20 63 6f  ard Tcl error co
15720 64 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  de.. *. *-------
15730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
15760 0a 20 2a 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69  . */.DLLEXPORT i
15770 6e 74 20 54 6c 73 5f 53 61 66 65 49 6e 69 74 28  nt Tls_SafeInit(
15780 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
15790 72 70 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  rp) {.    dprint
157a0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20  f("Called");.   
157b0 20 72 65 74 75 72 6e 28 54 6c 73 5f 49 6e 69 74   return(Tls_Init
157c0 28 69 6e 74 65 72 70 29 29 3b 0a 7d 0a 0a 2f 2a  (interp));.}../*
157d0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a  ---------*. *. *
15810 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20  .TlsLibInit --. 
15820 2a 0a 20 2a 09 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *.-----------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15850 2d 2d 2d 2d 2d 2a 0a 20 2a 09 49 6e 69 74 69 61  -----*. *.Initia
15860 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72  lizes SSL librar
15870 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69  y once per appli
15880 63 61 74 69 6f 6e 0a 20 2a 09 2d 2d 2d 2d 2d 2d  cation. *.------
15890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
158b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
158c0 2a 09 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  *.Side effects:.
158d0 20 2a 09 09 69 6e 69 74 69 61 6c 69 7a 65 73 20   *..initializes 
158e0 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
158f0 2a 09 52 65 73 75 6c 74 3a 0a 20 2a 09 09 6e 6f  *.Result:. *..no
15900 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ne. *. *--------
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
15940 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54   */.static int T
15950 6c 73 4c 69 62 49 6e 69 74 28 69 6e 74 20 75 6e  lsLibInit(int un
15960 69 6e 69 74 69 61 6c 69 7a 65 29 20 7b 0a 20 20  initialize) {.  
15970 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69    static int ini
15980 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 20 20  tialized = 0;.  
15990 20 20 69 6e 74 20 73 74 61 74 75 73 20 3d 20 54    int status = T
159a0 43 4c 5f 4f 4b 3b 0a 23 69 66 20 64 65 66 69 6e  CL_OK;.#if defin
159b0 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45 41  ed(OPENSSL_THREA
159c0 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28 54  DS) && defined(T
159d0 43 4c 5f 54 48 52 45 41 44 53 29 0a 20 20 20 20  CL_THREADS).    
159e0 73 69 7a 65 5f 74 20 6e 75 6d 5f 6c 6f 63 6b 73  size_t num_locks
159f0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
15a00 20 28 75 6e 69 6e 69 74 69 61 6c 69 7a 65 29 20   (uninitialize) 
15a10 7b 0a 09 69 66 20 28 21 69 6e 69 74 69 61 6c 69  {..if (!initiali
15a20 7a 65 64 29 20 7b 0a 09 20 20 20 20 64 70 72 69  zed) {..    dpri
15a30 6e 74 66 28 22 41 73 6b 65 64 20 74 6f 20 75 6e  ntf("Asked to un
15a40 69 6e 69 74 69 61 6c 69 7a 65 2c 20 62 75 74 20  initialize, but 
15a50 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 69 74 69  we are not initi
15a60 61 6c 69 7a 65 64 22 29 3b 0a 0a 09 20 20 20 20  alized");...    
15a70 72 65 74 75 72 6e 28 54 43 4c 5f 4f 4b 29 3b 0a  return(TCL_OK);.
15a80 09 7d 0a 0a 09 64 70 72 69 6e 74 66 28 22 41 73  .}...dprintf("As
15a90 6b 65 64 20 74 6f 20 75 6e 69 6e 69 74 69 61 6c  ked to uninitial
15aa0 69 7a 65 22 29 3b 0a 0a 23 69 66 20 64 65 66 69  ize");..#if defi
15ab0 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48 52 45  ned(OPENSSL_THRE
15ac0 41 44 53 29 20 26 26 20 64 65 66 69 6e 65 64 28  ADS) && defined(
15ad0 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09 54 63  TCL_THREADS)..Tc
15ae0 6c 5f 4d 75 74 65 78 4c 6f 63 6b 28 26 69 6e 69  l_MutexLock(&ini
15af0 74 5f 6d 78 29 3b 0a 0a 09 69 66 20 28 6c 6f 63  t_mx);...if (loc
15b00 6b 73 29 20 7b 0a 09 20 20 20 20 66 72 65 65 28  ks) {..    free(
15b10 6c 6f 63 6b 73 29 3b 0a 09 20 20 20 20 6c 6f 63  locks);..    loc
15b20 6b 73 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  ks = NULL;..    
15b30 6c 6f 63 6b 73 43 6f 75 6e 74 20 3d 20 30 3b 0a  locksCount = 0;.
15b40 09 7d 0a 23 65 6e 64 69 66 0a 09 69 6e 69 74 69  .}.#endif..initi
15b50 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 23 69 66  alized = 0;..#if
15b60 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
15b70 5f 54 48 52 45 41 44 53 29 20 26 26 20 64 65 66  _THREADS) && def
15b80 69 6e 65 64 28 54 43 4c 5f 54 48 52 45 41 44 53  ined(TCL_THREADS
15b90 29 0a 09 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f  )..Tcl_MutexUnlo
15ba0 63 6b 28 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65  ck(&init_mx);.#e
15bb0 6e 64 69 66 0a 0a 09 72 65 74 75 72 6e 28 54 43  ndif...return(TC
15bc0 4c 5f 4f 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  L_OK);.    }..  
15bd0 20 20 69 66 20 28 69 6e 69 74 69 61 6c 69 7a 65    if (initialize
15be0 64 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 43  d) {..dprintf("C
15bf0 61 6c 6c 65 64 2c 20 62 75 74 20 75 73 69 6e 67  alled, but using
15c00 20 63 61 63 68 65 64 20 76 61 6c 75 65 22 29 3b   cached value");
15c10 0a 09 72 65 74 75 72 6e 28 73 74 61 74 75 73 29  ..return(status)
15c20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
15c30 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
15c40 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45  .#if defined(OPE
15c50 4e 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26  NSSL_THREADS) &&
15c60 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52   defined(TCL_THR
15c70 45 41 44 53 29 0a 20 20 20 20 54 63 6c 5f 4d 75  EADS).    Tcl_Mu
15c80 74 65 78 4c 6f 63 6b 28 26 69 6e 69 74 5f 6d 78  texLock(&init_mx
15c90 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 6e  );.#endif.    in
15ca0 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 0a  itialized = 1;..
15cb0 23 69 66 20 64 65 66 69 6e 65 64 28 4f 50 45 4e  #if defined(OPEN
15cc0 53 53 4c 5f 54 48 52 45 41 44 53 29 20 26 26 20  SSL_THREADS) && 
15cd0 64 65 66 69 6e 65 64 28 54 43 4c 5f 54 48 52 45  defined(TCL_THRE
15ce0 41 44 53 29 0a 20 20 20 20 6e 75 6d 5f 6c 6f 63  ADS).    num_loc
15cf0 6b 73 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b  ks = 1;.    lock
15d00 73 43 6f 75 6e 74 20 3d 20 28 69 6e 74 29 20 6e  sCount = (int) n
15d10 75 6d 5f 6c 6f 63 6b 73 3b 0a 20 20 20 20 6c 6f  um_locks;.    lo
15d20 63 6b 73 20 3d 20 6d 61 6c 6c 6f 63 28 73 69 7a  cks = malloc(siz
15d30 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20 6e 75  eof(*locks) * nu
15d40 6d 5f 6c 6f 63 6b 73 29 3b 0a 20 20 20 20 6d 65  m_locks);.    me
15d50 6d 73 65 74 28 6c 6f 63 6b 73 2c 20 30 2c 20 73  mset(locks, 0, s
15d60 69 7a 65 6f 66 28 2a 6c 6f 63 6b 73 29 20 2a 20  izeof(*locks) * 
15d70 6e 75 6d 5f 6c 6f 63 6b 73 29 3b 0a 23 65 6e 64  num_locks);.#end
15d80 69 66 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  if..    /* Initi
15d90 61 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72  alize BOTH libcr
15da0 79 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e  ypto and libssl.
15db0 20 2a 2f 0a 20 20 20 20 4f 50 45 4e 53 53 4c 5f   */.    OPENSSL_
15dc0 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c  init_ssl(OPENSSL
15dd0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53  _INIT_LOAD_SSL_S
15de0 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c  TRINGS | OPENSSL
15df0 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54  _INIT_LOAD_CRYPT
15e00 4f 5f 53 54 52 49 4e 47 53 0a 09 7c 20 4f 50 45  O_STRINGS..| OPE
15e10 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c  NSSL_INIT_ADD_AL
15e20 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e  L_CIPHERS | OPEN
15e30 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
15e40 5f 44 49 47 45 53 54 53 2c 20 4e 55 4c 4c 29 3b  _DIGESTS, NULL);
15e50 0a 0a 20 20 20 20 42 49 4f 5f 6e 65 77 5f 74 63  ..    BIO_new_tc
15e60 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 23 69 66  l(NULL, 0);..#if
15e70 20 30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a   0.    /*.     *
15e80 20 58 58 58 3a 54 4f 44 4f 3a 20 52 65 6d 6f 76   XXX:TODO: Remov
15e90 65 20 74 68 69 73 20 63 6f 64 65 20 61 6e 64 20  e this code and 
15ea0 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
15eb0 61 20 63 68 65 63 6b 0a 20 20 20 20 20 2a 20 66  a check.     * f
15ec0 6f 72 20 65 6e 6f 75 67 68 20 65 6e 74 72 6f 70  or enough entrop
15ed0 79 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74 72 79  y and do not try
15ee0 20 74 6f 20 63 72 65 61 74 65 20 6f 75 72 20 6f   to create our o
15ef0 77 6e 0a 20 20 20 20 20 2a 20 74 65 72 72 69 62  wn.     * terrib
15f00 6c 65 20 65 6e 74 72 6f 70 79 0a 20 20 20 20 20  le entropy.     
15f10 2a 2f 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  */.    /*.     *
15f20 20 53 65 65 64 20 74 68 65 20 72 61 6e 64 6f 6d   Seed the random
15f30 20 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f   number generato
15f40 72 20 69 6e 20 74 68 65 20 53 53 4c 20 6c 69 62  r in the SSL lib
15f50 72 61 72 79 2c 0a 20 20 20 20 20 2a 20 75 73 69  rary,.     * usi
15f60 6e 67 20 74 68 65 20 64 6f 2f 77 68 69 6c 65 20  ng the do/while 
15f70 63 6f 6e 73 74 72 75 63 74 20 62 65 63 61 75 73  construct becaus
15f80 65 20 6f 66 20 74 68 65 20 62 75 67 20 6e 6f 74  e of the bug not
15f90 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  e in the.     * 
15fa0 4f 70 65 6e 53 53 4c 20 46 41 51 20 61 74 20 68  OpenSSL FAQ at h
15fb0 74 74 70 3a 2f 2f 77 77 77 2e 6f 70 65 6e 73 73  ttp://www.openss
15fc0 6c 2e 6f 72 67 2f 73 75 70 70 6f 72 74 2f 66 61  l.org/support/fa
15fd0 71 2e 68 74 6d 6c 23 55 53 45 52 31 0a 20 20 20  q.html#USER1.   
15fe0 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65 20 63    *.     * The c
15ff0 72 75 78 20 6f 66 20 74 68 65 20 70 72 6f 62 6c  rux of the probl
16000 65 6d 20 69 73 20 74 68 61 74 20 53 6f 6c 61 72  em is that Solar
16010 69 73 20 37 20 64 6f 65 73 20 6e 6f 74 20 68 61  is 7 does not ha
16020 76 65 20 61 0a 20 20 20 20 20 2a 20 2f 64 65 76  ve a.     * /dev
16030 2f 72 61 6e 64 6f 6d 20 6f 72 20 2f 64 65 76 2f  /random or /dev/
16040 75 72 61 6e 64 6f 6d 20 64 65 76 69 63 65 20 73  urandom device s
16050 6f 20 69 74 20 63 61 6e 6e 6f 74 20 67 61 74 68  o it cannot gath
16060 65 72 20 65 6e 6f 75 67 68 0a 20 20 20 20 20 2a  er enough.     *
16070 20 65 6e 74 72 6f 70 79 20 66 72 6f 6d 20 74 68   entropy from th
16080 65 20 52 41 4e 44 5f 73 65 65 64 28 29 20 77 68  e RAND_seed() wh
16090 65 6e 20 54 4c 53 20 69 6e 69 74 69 61 6c 69 7a  en TLS initializ
160a0 65 73 20 61 6e 64 20 72 65 66 75 73 65 73 0a 20  es and refuses. 
160b0 20 20 20 20 2a 20 74 6f 20 67 6f 20 66 75 72 74      * to go furt
160c0 68 65 72 2e 20 45 61 72 6c 69 65 72 20 76 65 72  her. Earlier ver
160d0 73 69 6f 6e 73 20 6f 66 20 4f 70 65 6e 53 53 4c  sions of OpenSSL
160e0 20 63 61 72 72 69 65 64 20 6f 6e 20 72 65 67 61   carried on rega
160f0 72 64 6c 65 73 73 2e 0a 20 20 20 20 20 2a 2f 0a  rdless..     */.
16100 20 20 20 20 73 72 61 6e 64 28 28 75 6e 73 69 67      srand((unsig
16110 6e 65 64 20 69 6e 74 29 20 74 69 6d 65 28 28 74  ned int) time((t
16120 69 6d 65 5f 74 20 2a 29 20 4e 55 4c 4c 29 29 3b  ime_t *) NULL));
16130 0a 20 20 20 20 64 6f 20 7b 0a 09 66 6f 72 20 28  .    do {..for (
16140 69 20 3d 20 30 3b 20 69 20 3c 20 31 36 3b 20 69  i = 0; i < 16; i
16150 2b 2b 29 20 7b 0a 09 20 20 20 20 72 6e 64 5f 73  ++) {..    rnd_s
16160 65 65 64 5b 69 5d 20 3d 20 31 20 2b 20 28 63 68  eed[i] = 1 + (ch
16170 61 72 29 20 28 32 35 35 2e 30 20 2a 20 72 61 6e  ar) (255.0 * ran
16180 64 28 29 2f 28 52 41 4e 44 5f 4d 41 58 2b 31 2e  d()/(RAND_MAX+1.
16190 30 29 29 3b 0a 09 7d 0a 09 52 41 4e 44 5f 73 65  0));..}..RAND_se
161a0 65 64 28 72 6e 64 5f 73 65 65 64 2c 20 73 69 7a  ed(rnd_seed, siz
161b0 65 6f 66 28 72 6e 64 5f 73 65 65 64 29 29 3b 0a  eof(rnd_seed));.
161c0 20 20 20 20 7d 20 77 68 69 6c 65 20 28 52 41 4e      } while (RAN
161d0 44 5f 73 74 61 74 75 73 28 29 20 21 3d 20 31 29  D_status() != 1)
161e0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ;.#endif..#if de
161f0 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 54 48  fined(OPENSSL_TH
16200 52 45 41 44 53 29 20 26 26 20 64 65 66 69 6e 65  READS) && define
16210 64 28 54 43 4c 5f 54 48 52 45 41 44 53 29 0a 09  d(TCL_THREADS)..
16220 54 63 6c 5f 4d 75 74 65 78 55 6e 6c 6f 63 6b 28  Tcl_MutexUnlock(
16230 26 69 6e 69 74 5f 6d 78 29 3b 0a 23 65 6e 64 69  &init_mx);.#endi
16240 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 28 73 74  f..    return(st
16250 61 74 75 73 29 3b 0a 7d 0a                       atus);.}.