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: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63  nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72  lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73   <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64  lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64  ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a  eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79  .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79  , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68  ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09  ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69  .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28  leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73  key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43  tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63  , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75  har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64  y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31   char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79  ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53  _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65  ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a   char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20  ..char *CAfile, 
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65  O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e  SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54  ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09  LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78  _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30  ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44  .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28  (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20  flag) & (mask)) 
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66  == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20  Callbacks       
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20  ----. *. * Eval 
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64  Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63   --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72  and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61  ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65   or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31  d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72   = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65  ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75  ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f  ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76  */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49  alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53  nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29  Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c   {.    int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70   ok = 0;..    dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63  allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72  cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66  eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72  ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20   return value 0 
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64  L_GLOBAL);.    d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c  printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29  back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ;.    if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20  = TCL_OK) {../* 
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72  Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c  f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46  L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54  esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b  CL_OK) {..    ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74   = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20  f("Result: %d", 
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ok);.    } else 
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65  {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69  ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66  cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43  Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72  r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rn;.    }..    i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c  n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79   message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  pe args */.    c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29  gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  minor, -1));..  
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54  L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d  ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74  gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ret), -1));.    
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61  tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c   *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74  onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a  ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d  efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65  E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e  ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76  t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74  ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ent_type, const 
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f  void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c  t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20  .    char *ver, 
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a  *type;.    BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75  bio;.    char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20  ffer[15000];.   
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a   buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23  tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61  _NO_SSL2).    ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a  se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b  ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  3).    case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b   "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a  e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a  .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a   TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31  ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49  ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.2";..break;.  
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45    case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65  .    case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65  r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ";..break;.    }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f  ..    switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20  ntent_type) {.  
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22  EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b  Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f  T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49  TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70  nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b   Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20  RT_ALERT:..type 
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61  = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09  _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b  type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50  case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09  LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61  type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f  ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c  00L.    case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a  S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62  ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f  :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65  /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e   time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e  able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f   */.    if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73   = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c  _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c  ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20  _trace(write_p, 
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74  version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c  _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69   ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61  o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20  IO_pending(bio) 
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65  < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39  nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20  99);..n = (n<0) 
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72  ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29  [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a  BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a  .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63  f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c  tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67   type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20  e=%s", write_p, 
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66  ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  er[0]);..    /* 
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c  chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20   version, type, 
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  The certificate 
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64  chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69  he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74  ng level. *.  (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69  he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b  ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65  ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63   peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e  ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64  atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69  , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61  s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79  nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20   time.. *.Check 
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69  that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62  cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72  y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e  tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65  . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20  vocation status 
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69  for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74  cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74  he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64  he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61   the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09  tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69  Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65  es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a  rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69   Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20  fy_ok indicates 
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74  whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61  ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20  tion passed (1) 
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a  or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63   Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f  allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20   the socket may 
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20  return one of:. 
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20  *.    0...- the 
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73  eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e  end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65  . *....  failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20   alert to peer, 
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61  and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20  ndshake.. *.    
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20  valid, continue 
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a  with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72   *.    empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20  ing.- no change 
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76  to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  alidation. *. * 
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74  rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f   ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20  CTX *ctx) {.    
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09  .    SSL   *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54  .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64  ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74  ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54  _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a  ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  >interp;.    int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  d");.    dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65  )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72   ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71  ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74  uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61  ifyCallback: eva
2a80: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20  l callback");.. 
2a90: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
2aa0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
2ab0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74  h fn, chan, dept
2ac0: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73  h, cert info lis
2ad0: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65  t, status, and e
2ae0: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20  rror args */.   
2af0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2b00: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2b10: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
2b20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2b50: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
2b60: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
2b70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b90: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2ba0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2bb0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2bc0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2bd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2be0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2bf0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c00: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
2c10: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
2c20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2c40: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
2c50: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
2c60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2c70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c90: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
2ca0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2cb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2cc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2cd0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2ce0: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76  bj((char*)X509_v
2cf0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
2d00: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
2d10: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76  ));..    /* Prev
2d20: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61  ent I/O while ca
2d30: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f  llback is in pro
2d40: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20  gress */.    /* 
2d50: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2d60: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42  |= TLS_TCL_CALLB
2d70: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ACK; */..    /* 
2d80: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2d90: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2da0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2db0: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  dPtr);.    ok = 
2dc0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2dd0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2de0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2df0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2e00: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Ptr);..    dprin
2e10: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61  tf("VerifyCallba
2e20: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75  ck: command resu
2e30: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  lt = %d", ok);..
2e40: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2e50: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2e60: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2e70: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  /.    return ok;
2e80: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
2e90: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
2ea0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  on unchanged. */
2eb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2f00: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2f10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2f20: 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72  lback with error
2f30: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20   message.. *. * 
2f40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2f50: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
2f60: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
2f70: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
2f80: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
2f90: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2fa0: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2fb0: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
2fc0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3010: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f  */.void.Tls_Erro
3020: 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  r(State *statePt
3030: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  r, const char *m
3040: 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e  sg) {.    Tcl_In
3050: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3060: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3080: 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  dPtr, *listPtr;.
3090: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
30a0: 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65  g err;.    state
30b0: 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a  Ptr->err = msg;.
30c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
30d0: 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 73 61 67  lled with messag
30e0: 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a 0a 20 20  e %s", msg);..  
30f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3100: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
3110: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
3120: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
3130: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3140: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
3150: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
3160: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
3170: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3180: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3190: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
31a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
31b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
31c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
31d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
31e0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
31f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3230: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3240: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3250: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
3260: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
3270: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3280: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3290: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
32a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
32b0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
32c0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
32d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
32e0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
32f0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
3300: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3310: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3330: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3340: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
3350: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
3360: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3370: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
3380: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3390: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
33a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
33b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
33c0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
33d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
33e0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
33f0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
3400: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
3410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3430: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
3440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
3450: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3460: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3470: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3480: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
3490: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
34a0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
34b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
34c0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
34d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3520: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20   KeyLogCallback 
3530: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72  --. *. *.Write r
3540: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61  eceived key data
3550: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a   to log file.. *
3560: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3570: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c  --. */.void KeyL
35d0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  ogCallback(const
35e0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
35f0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20   char *line) {. 
3600: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67     char *str = g
3610: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
3620: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a  ILE);.    FILE *
3630: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  fd;..    dprintf
3640: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3650: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20   if (str) {..fd 
3660: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22  = fopen(str, "a"
3670: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20  );..fprintf(fd, 
3680: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66  "%s\n",line);..f
3690: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
36a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
36f0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c  . * Password Cal
3700: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43  lback --. *. *.C
3710: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73  alled when a pas
3720: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20  sword is needed 
3730: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3740: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20  y when loading. 
3750: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50  *.or storing a P
3760: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77  EM certificate w
3770: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20  ith encryption. 
3780: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20  Evals callback. 
3790: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74  *.script and ret
37a0: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  urns the result 
37b0: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  as the password 
37c0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20  string in buf.. 
37d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
37e0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
37f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
3800: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
3810: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
3820: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77  eturns:. *.Passw
3830: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ord size in byte
3840: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  s or -1 for an e
3850: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 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 0a 20  --------------. 
38a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
38b0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63  sswordCallback(c
38c0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69  har *buf, int si
38d0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20  ze, int rwflag, 
38e0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20  void *udata) {. 
38f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
3900: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75  tr.= (State *) u
3910: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  data;.    Tcl_In
3920: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3930: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3940: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3950: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3960: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  de;.    Tcl_Size
3970: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e   len;..    dprin
3980: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3990: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
39a0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
39b0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
39c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
39d0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
39e0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
39f0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3a00: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3a10: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3a20: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3a30: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3a40: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3a50: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3a60: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3a70: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3a80: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54      if (len > (T
3a90: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29  cl_Size) size-1)
3aa0: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f   {...len = (Tcl_
3ab0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20  Size) size-1;.. 
3ac0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70     }..    strncp
3ad0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3ae0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
3af0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
3b00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3b10: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20  t) len;..} else 
3b20: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  {..    return -1
3b30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3b40: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3b50: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3b60: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73  n, rwflag, and s
3b70: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ize args */.    
3b80: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
3b90: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
3ba0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20  tr->password);. 
3bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3be0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
3bf0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20  ssword", -1));. 
3c00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3c10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3c20: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3c30: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67  NewIntObj(rwflag
3c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3c70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
3c80: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ize));..    Tcl_
3c90: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3ca0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3cb0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
3cc0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3cd0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3ce0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3cf0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3d00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3d10: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
3d20: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3d30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3d40: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3d50: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
3d60: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
3d70: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
3d80: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
3d90: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
3da0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
3db0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
3dc0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
3dd0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
3de0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
3df0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3e00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3e10: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3e20: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3e30: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3e40: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  r);..    /* If s
3e50: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20  uccessful, pass 
3e60: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74  back password st
3e70: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74  ring and truncat
3e80: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  e if too long */
3e90: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
3ea0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
3eb0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3ec0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3ed0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3ee0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
3ef0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20  &len);..if (len 
3f00: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  > (Tcl_Size) siz
3f10: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  e-1) {..    len 
3f20: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  = (Tcl_Size) siz
3f30: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
3f40: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3f50: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
3f60: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
3f70: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3f80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
3f90: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
3fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
3fb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3fc0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
3fd0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c    return -1;.}..
3fe0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4030: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
4040: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4050: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
4060: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
4070: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4080: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e  cache. In TLS 1.
4090: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65  3. *.this may be
40a0: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
40b0: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74  le times after t
40c0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f  he handshake. Fo
40d0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72  r. *.earlier ver
40e0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c  sions, this will
40f0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72   be received dur
4100: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ing the handshak
4110: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68  e.. *.This is th
4120: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20  e preferred way 
4130: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75  to obtain a resu
4140: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20  mable session.. 
4150: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4160: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4170: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4180: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4190: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
41a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
41b0: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20  0 = error where 
41c0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20  session will be 
41d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f  immediately remo
41e0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ved from the int
41f0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09  ernal cache.. *.
4200: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72  1 = success wher
4210: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65  e app retains se
4220: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e  ssion in session
4230: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74   cache, and must
4240: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f   call SSL_SESSIO
4250: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f  N_free() when do
4260: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
42b0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73  .static int.Sess
42c0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20  ionCallback(SSL 
42d0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
42e0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
42f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4300: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
4310: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4320: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
4330: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4340: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4350: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4360: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4370: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4380: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4390: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
43a0: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
43b0: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
43c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
43d0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
43e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
43f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4400: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
4410: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4440: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4450: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4460: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4470: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4480: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4490: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
44a0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73  h fn, chan, sess
44b0: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20  ion id, session 
44c0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65  ticket, and life
44d0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  time args */.   
44e0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
44f0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
4500: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
4510: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4520: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4530: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
4550: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20  ession", -1));. 
4560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4580: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
4590: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
45a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
45b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
45c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  elf), -1));..   
45d0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a   /* Session id *
45e0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64  /.    session_id
45f0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
4600: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
4610: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  ulen);.    Tcl_L
4620: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4630: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4640: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4650: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
4660: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
4670: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  len));..    /* S
4680: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f  ession ticket */
4690: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e  .    SSL_SESSION
46a0: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
46b0: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
46c0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  len2);.    Tcl_L
46d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
46e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
46f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4700: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
4710: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
4720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74  );..    /* Lifet
4730: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20  ime - number of 
4740: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54  seconds */.    T
4750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4770: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
4780: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53  LongObj((long) S
4790: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
47a0: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
47b0: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  int(session)));.
47c0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
47d0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
47e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
47f0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
4800: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
4810: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4820: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
4830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4840: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  cmdPtr);..    /*
4850: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f   Return 0 for no
4860: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20  w until session 
4870: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70  handling is comp
4880: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
4890: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61  --. *. * ALPN Ca
48f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
4900: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62  rs and NPN Callb
4910: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
4920: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
4930: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f   protocol (http/
4940: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63  1.1, h2, h3, etc
4950: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72  .) selection for
4960: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67   the. *.incoming
4970: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c   connection. Cal
4980: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20  led after Hello 
4990: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62  and server callb
49a0: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27  acks.. *.Where '
49b0: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64  out' is selected
49c0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69   protocol and 'i
49d0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61  n' is the peer a
49e0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a  dvertised list..
49f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4a00: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4a10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4a20: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4a30: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4a40: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4a50: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4a60: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  OK: ALPN protoco
4a70: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
4a80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4a90: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4aa0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4ab0: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e  TAL: There was n
4ac0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  o overlap betwee
4ad0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20  n the client's. 
4ae0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c  *.    supplied l
4af0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76  ist and the serv
4b00: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
4b10: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4b20: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64   will be aborted
4b30: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4b40: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20  ERR_NOACK: ALPN 
4b50: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
4b60: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63  ected, e.g., bec
4b70: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09  ause no ALPN. *.
4b80: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72      protocols ar
4b90: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  e configured for
4ba0: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
4bb0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4bc0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
4bd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4c20: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  int.ALPNCallback
4c30: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74  (SSL *ssl, const
4c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c50: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4c60: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4c70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4c80: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4c90: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4ca0: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4cb0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4cc0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4ce0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4cf0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4d00: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4d10: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4d20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4d30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4d40: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4d50: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4d60: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4d70: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4d80: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4d90: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4da0: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4db0: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67  ext_proto((unsig
4dc0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74  ned char **) out
4dd0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4de0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4df0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4e00: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4e10: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4e20: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4e30: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4e40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4e50: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4e60: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4e70: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4e80: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4e90: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4ea0: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4eb0: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..re
4ec0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4ed0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4ee0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4ef0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4f00: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4f10: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
4f20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4f30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
4f40: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65  ith fn, chan, de
4f50: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c  pth, cert info l
4f60: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64  ist, status, and
4f70: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20   error args */. 
4f80: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
4f90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
4fa0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
4fb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4fc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4fd0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
4ff0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
5000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5020: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5040: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5060: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
50a0: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72  gObj((const char
50b0: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a   *) *out, -1));.
50c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
50d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
50e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
50f0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
5100: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
5110: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
5120: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5130: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5140: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5150: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5160: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5170: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5180: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5190: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
51b0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
51c0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
51d0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
51e0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
51f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5200: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5210: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
5220: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5230: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5240: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5250: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
52a0: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
52b0: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
52c0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
52d0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
52e0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
52f0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
5300: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
5310: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
5320: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5330: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5340: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5350: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5360: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5370: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5380: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5390: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
53a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
53b0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
53c0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
53d0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
53e0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
53f0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
5400: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
5410: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5420: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5430: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5480: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5490: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
54a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
54b0: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
54c0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
54d0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
54e0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
54f0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
5500: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
5510: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
5520: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5530: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5540: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5550: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5560: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5570: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5580: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
55a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
55b0: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
55c0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
55d0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
55e0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
55f0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
5600: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
5610: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
5620: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5630: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5640: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5650: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5660: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
56c0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
56d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
56e0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
56f0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
5700: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
5710: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
5720: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5730: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5740: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5750: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5760: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5770: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5780: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5790: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
57a0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
57b0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
57c0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
57d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
57e0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
57f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
5800: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5810: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5820: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5830: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5840: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5850: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5860: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5870: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5880: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5890: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
58a0: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
58b0: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
58c0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
58d0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
58e0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
58f0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
5900: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
5910: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
5920: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5930: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5940: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5950: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5960: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5970: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5980: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5990: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
59a0: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
59b0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
59c0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5a10: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5a20: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5a30: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5a40: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5a50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5a60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5a70: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5a80: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5a90: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5aa0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5ab0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
5ac0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
5ad0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
5ae0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
5af0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5b00: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5b10: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5b20: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5b30: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5b40: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5b50: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20    /* Only works 
5b60: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20  for TLS 1.2 and 
5b70: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73  earlier */.    s
5b80: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f  ervername = SSL_
5b90: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
5ba0: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
5bb0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a  YPE_host_name);.
5bc0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e      if (!servern
5bd0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d  ame || servernam
5be0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
5bf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5c00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5c10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
5c20: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
5c30: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
5c40: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5c50: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5c60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5c70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
5c80: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
5c90: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  and server name 
5ca0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
5cb0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5cc0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5cd0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5ce0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5cf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5d00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5d10: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5d20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5d30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5d40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5d50: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5d60: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5d70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5d80: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5d90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5da0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5db0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5dc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5dd0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5de0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5df0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5e00: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5e10: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5e20: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5e30: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5e40: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5e50: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5e60: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5e70: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5e80: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5e90: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5ea0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5eb0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5ec0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5ed0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5ee0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5ef0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5f00: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5f10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5f20: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
5f30: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
5f40: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
5f50: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
5f60: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
5f70: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
5f80: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
5f90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
5fa0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5ff0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
6000: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
6010: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
6020: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
6030: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
6040: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
6050: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
6060: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
6070: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
6080: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
6090: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
60a0: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
60b0: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
60c0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
60d0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
60e0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
60f0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
6100: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
6110: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
6120: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
6130: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
6140: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
6150: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
6160: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
6170: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
6180: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
6190: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
61a0: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
61b0: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
61c0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
61d0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
61e0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
61f0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
6200: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
6210: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
6220: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
6230: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6240: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
6250: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6260: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6270: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6280: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6290: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
62a0: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
62b0: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
62c0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
62d0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
62e0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
62f0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
6300: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
6310: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
6320: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
6330: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6340: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
6350: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
63a0: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
63b0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
63c0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
63d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
63e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
63f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
6400: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6410: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
6420: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
6430: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
6440: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
6450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6460: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20  *servername;.   
6470: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6480: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a  char *p;.    siz
6490: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69  e_t len, remaini
64a0: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ng;..    dprintf
64b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
64c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
64d0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
64e0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
64f0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6500: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
6510: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
6520: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55   (const SSL *)NU
6530: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f  LL || arg == (vo
6540: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  id *)NULL) {..re
6550: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6560: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6570: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e   }..    /* Get n
6580: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  ames */.    if (
6590: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  !SSL_client_hell
65a0: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20  o_get0_ext(ssl, 
65b0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76  TLSEXT_TYPE_serv
65c0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65  er_name, &p, &re
65d0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61  maining) || rema
65e0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
65f0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
6600: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
6610: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
6620: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6630: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6640: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
6650: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
6660: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
6670: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
6680: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
6690: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
66a0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
66b0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
66c0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
66d0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
66e0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
66f0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
6700: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6710: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6720: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
6730: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   len;..    /* Th
6740: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69  e list in practi
6750: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69  ce only has a si
6760: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f  ngle element, so
6770: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65   we only conside
6780: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  r the first one.
6790: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
67a0: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70  ining == 0 || *p
67b0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d  ++ != TLSEXT_NAM
67c0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
67d0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
67e0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
67f0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6800: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6810: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6820: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6830: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ng--;..    /* No
6840: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79  w we can finally
6850: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79   pull out the by
6860: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
6870: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d  e actual hostnam
6880: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
6890: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
68a0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
68b0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
68c0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
68d0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
68e0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
68f0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  }.    len = (*(p
6900: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
6910: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
6920: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20    if (len + 2 > 
6930: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6940: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6950: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6960: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6970: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6980: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6990: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
69a0: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61  en;.    serverna
69b0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
69c0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   *)p;..    /* Cr
69d0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
69e0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
69f0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e  an, and server n
6a00: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ame args */.    
6a10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
6a20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
6a30: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
6a40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6a50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6a60: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6a70: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22  tringObj("hello"
6a80: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6a90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6aa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6ab0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
6ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
6ad0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
6ae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
6af0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
6b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6b10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6b20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6b30: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28  bj(servername, (
6b40: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b  Tcl_Size) len));
6b50: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
6b60: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
6b70: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
6b80: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6b90: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
6ba0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
6bb0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
6bc0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
6bd0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6be0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a  _HELLO_RETRY;..*
6bf0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6c00: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43  SV1_ALERT_USER_C
6c10: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20  ANCELLED;.    } 
6c20: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
6c30: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6c40: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6c50: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6c60: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  e {..res = SSL_C
6c70: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6c80: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  R;..*alert = SSL
6c90: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6ca0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20  NTERNAL_ERROR;. 
6cb0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6cc0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6cd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6ce0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s;.}.../********
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
6d00: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20   Commands       
6d10: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
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 0a 20 2a 20 43 69 70 68  -----. *. * Ciph
6d80: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  ersObjCmd -- lis
6d90: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6da0: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ers. *. *.This p
6db0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6dc0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
6dd0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  he "tls::ciphers
6de0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
6df0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6e00: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70  iphers, based up
6e10: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  on protocol sele
6e20: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cted.. *. * Resu
6e30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6e40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
6e50: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
6e60: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
6e70: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f  ructs and destro
6e80: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ys SSL context (
6e90: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6ee0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6ef0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d  har *protocols[]
6f00: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73   = {.."ssl2", "s
6f10: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
6f20: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
6f30: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
6f40: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
6f50: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
6f60: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
6f70: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
6f80: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
6f90: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
6fa0: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
6fb0: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
6fc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6fd0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6fe0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6ff0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7000: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7010: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7020: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7030: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7040: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7050: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7060: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
7070: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62   *sk;.    char b
7080: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
7090: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
70a0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
70b0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
70c0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
70d0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
70e0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
70f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7100: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
7110: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
7120: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
7130: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7140: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7150: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
7160: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
7170: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7180: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7190: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
71a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
71b0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
71c0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
71d0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
71e0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
71f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7200: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7210: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
7220: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7230: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7240: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7250: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7260: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7270: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
7280: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
7290: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
72a0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
72b0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
72e0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
72f0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
7300: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
7310: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
7320: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7330: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7340: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7350: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
7360: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
7370: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7380: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
7390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
73a0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
73b0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
73c0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
73d0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
73e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
73f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7400: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53  ..    method = S
7410: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62  SLv2_method(); b
7420: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7430: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7440: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7460: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7470: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7480: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7490: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
74a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
74b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
74c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
74d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
74e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
74f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7500: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7510: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
7520: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7530: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7540: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
7550: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7560: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7570: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7580: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7590: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
75a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
75b0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
75c0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
75d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
75e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
75f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7600: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7610: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7620: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b   TLSv1_method();
7630: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7640: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a  case TLS_TLS1_1:
7650: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7660: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7680: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
76a0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _1_METHOD)..    
76b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
76c0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
76d0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
76e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
76f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
7700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
7710: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7720: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7730: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  = TLSv1_1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7760: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7870: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
78b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
78c0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
78d0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
78e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
78f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7920: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7930: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7940: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7950: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
7960: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
7970: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53  VERSION);..    S
7980: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
7990: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
79a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
79b0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  );..    break;.#
79c0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
79d0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
79e0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20  S_method();..   
79f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7a00: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7a10: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
7a20: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
7a30: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7a40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7a50: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7a60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
7a90: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
7aa0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
7ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7ac0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7ad0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
7ae0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7af0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
7b00: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
7b10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7b20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
7b30: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
7b40: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
7b50: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
7b60: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
7b70: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
7b80: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7b90: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
7ba0: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
7bb0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7bc0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
7bd0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
7be0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
7bf0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
7c00: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
7c10: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68   {..    const ch
7c20: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a  ar *cp;..    obj
7c30: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7c40: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7c50: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7c60: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7c70: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7c80: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7c90: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7ca0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7cb0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7cc0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7cd0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7ce0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7cf0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7d00: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7d10: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7d20: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7d50: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7d60: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
7d70: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20   cp, -1));..    
7d80: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7d90: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7da0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7db0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7dc0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7dd0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7de0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7df0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7e00: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7e10: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7e20: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7e30: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7e40: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7e50: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7e60: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7e70: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7e80: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7e90: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7ea0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7eb0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7ec0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7ed0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7ee0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7ef0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7f00: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7f10: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
7f20: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
7f30: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
7f40: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
7f50: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
7f60: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
7f70: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
7f80: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
7f90: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
7fa0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
7fb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7fc0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
8020: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8030: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8040: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8050: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8060: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8070: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8080: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
8090: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
80a0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
80b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
80c0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
80d0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
80e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
80f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8150: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8160: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8170: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8180: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8190: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
81a0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
81b0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
81c0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
81d0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
81e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
81f0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
8200: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
8210: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8220: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8250: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8260: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
8270: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
8280: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
8290: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
82a0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
82c0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
82d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
82e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
82f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8300: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8320: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8330: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
8340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8350: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8370: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
8380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
8390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
83a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
83b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
83c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
83d0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
83e0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29  [TLS_SSL3], -1))
83f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8400: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
8410: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8420: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8430: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8440: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8450: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8470: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8490: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
84a0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
84b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
84c0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
84d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
84e0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
84f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8500: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
8510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8530: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8540: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8550: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8560: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8570: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8580: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
8590: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
85b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
85c0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
85d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
85e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
85f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8600: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8610: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
8620: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8630: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8640: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8650: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8660: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8680: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8690: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
86a0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
86b0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
86c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
86d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
86e0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
86f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8700: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8750: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8760: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8770: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8780: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
8790: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
87a0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
87b0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
87c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
87d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
87e0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
87f0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
8800: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
8810: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8820: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8830: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8840: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
88a0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
88b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
88c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
88d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
88e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
88f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8900: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
8910: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
8920: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
8930: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
8940: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
8950: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
8960: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
8970: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
8980: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
8990: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
89a0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
89b0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
89c0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
89d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
89e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
89f0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
8a00: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8a10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8a20: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8a30: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
8a40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8a50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8a60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8a70: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8a80: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8a90: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8aa0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
8ab0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8ac0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8ad0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8ae0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8af0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8b00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8b10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8b20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8b30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8b40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8b60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8b70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8b80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8b90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8ba0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8bc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8bd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8be0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8bf0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8c00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8c10: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8c20: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
8c30: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
8c40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
8c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8c60: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
8c70: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
8c80: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
8c90: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
8ca0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
8cb0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8cc0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
8cd0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8ce0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
8cf0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
8d00: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
8d10: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
8d20: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
8d30: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
8d40: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
8d50: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
8d60: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
8d70: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
8d80: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
8d90: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
8da0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
8db0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
8dc0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
8dd0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
8de0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8df0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8e00: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8e10: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8e20: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8e30: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8e40: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8e50: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8e60: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8e70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8e80: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8e90: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8ea0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8eb0: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
8ec0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
8ed0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
8ee0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
8ef0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
8f00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8f10: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
8f20: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
8f30: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
8f40: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
8f50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
8f60: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8f70: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8f80: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8f90: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
8fa0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
8fb0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
8fc0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
8fd0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
8fe0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
8ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9000: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
9010: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
9020: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
9030: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
9040: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
9050: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
9060: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
9070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
9080: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
9090: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
90a0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
90b0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
90c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
90d0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
90e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
90f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
9150: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
9160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
9180: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
9190: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
91a0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
91b0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
91c0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
91d0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
91e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
91f0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
9200: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
9210: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
9220: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
9230: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
9240: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9290: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
92a0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
92b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
92c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
92d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
92e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
92f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
9300: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
9310: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
9320: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9330: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
9340: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
9350: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
9360: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
9370: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
9380: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9390: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
93a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
93b0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
93c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
93d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
93e0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
93f0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
9400: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
9410: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
9420: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9440: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
9450: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
9460: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
9470: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
9480: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
9490: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
94a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
94b0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
94c0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
94d0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
94e0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
94f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
9500: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
9510: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9520: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9530: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
9540: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
9550: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9560: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
9570: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9580: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
9590: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
95a0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
95b0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
95c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
95d0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
95e0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f  .    char *CAsto
95f0: 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  re..= NULL;.    
9600: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09  char *DHparams..
9610: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9620: 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c   *model...= NULL
9630: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76  ;.    char *serv
9640: 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09  ername..= NULL;.
9650: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20  /* hostname for 
9660: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69  Server Name Indi
9670: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68  cation */.    ch
9680: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09  ar *session_id..
9690: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
96a0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c  Obj *alpn..= NUL
96b0: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20  L;.    int ssl2 
96c0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20  = 0, ssl3 = 0;. 
96d0: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c     int tls1 = 1,
96e0: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73   tls1_1 = 1, tls
96f0: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20  1_2 = 1, tls1_3 
9700: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f  = 1;.    int pro
9710: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20  to = 0, level = 
9720: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69  -1;.    int veri
9730: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20  fy = 0, require 
9740: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31  = 0, request = 1
9750: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
9760: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29   = 0;.    (void)
9770: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
9780: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
9790: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
97a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
97b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
97c0: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20  _TLS1).    tls1 
97d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
97e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
97f0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
9800: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
9810: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b  .    tls1_1 = 0;
9820: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
9830: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
9840: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
9850: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
9860: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e   tls1_2 = 0;.#en
9870: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
9880: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
9890: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
98a0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73  _TLS1_3).    tls
98b0: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  1_3 = 0;.#endif.
98c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
98d0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
98e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
98f0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
9900: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72   ?options?");..r
9910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
9930: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
9940: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
9950: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
9960: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
9970: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
9980: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
9990: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
99a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
99b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
99c0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
99d0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
99e0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
99f0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
9a00: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
9a10: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
9a20: 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64  for (idx = 2; id
9a30: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29  x < objc; idx++)
9a40: 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20   {..char *opt = 
9a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9a60: 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28  jv[idx]);...if (
9a70: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09  opt[0] != '-')..
9a80: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54      break;...OPT
9a90: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70  OBJ("-alpn", alp
9aa0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  n);..OPTSTR("-ca
9ab0: 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09  dir", CApath);..
9ac0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22  OPTSTR("-cafile"
9ad0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53  , CAfile);..OPTS
9ae0: 54 52 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43  TR("-castore", C
9af0: 41 73 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54  Astore);..OPTBYT
9b00: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c  E("-cert", cert,
9b10: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54   cert_len);..OPT
9b20: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c  STR("-certfile",
9b30: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54   certfile);..OPT
9b40: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63  STR("-cipher", c
9b50: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9b60: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70  ("-ciphers", cip
9b70: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
9b80: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20  -ciphersuites", 
9b90: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09  ciphersuites);..
9ba0: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
9bb0: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54  ", script);..OPT
9bc0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c  STR("-dhparams",
9bd0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54   DHparams);..OPT
9be0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79  BYTE("-key", key
9bf0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54  , key_len);..OPT
9c00: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20  STR("-keyfile", 
9c10: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  keyfile);..OPTST
9c20: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65  R("-model", mode
9c30: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61  l);..OPTOBJ("-pa
9c40: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72  ssword", passwor
9c50: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70  d);..OPTBOOL("-p
9c60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20  ost_handshake", 
9c70: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
9c80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75  ..OPTBOOL("-requ
9c90: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a  est", request);.
9ca0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69  .OPTBOOL("-requi
9cb0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
9cc0: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74  OPTINT("-securit
9cd0: 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29  y_level", level)
9ce0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72  ;..OPTBOOL("-ser
9cf0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09  ver", server);..
9d00: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e  OPTSTR("-servern
9d10: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65  ame", servername
9d20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73  );..OPTSTR("-ses
9d30: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
9d40: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  n_id);..OPTBOOL(
9d50: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a  "-ssl2", ssl2);.
9d60: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22  .OPTBOOL("-ssl3"
9d70: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl3);..OPTBOO
9d80: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29  L("-tls1", tls1)
9d90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9da0: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09  1.1", tls1_1);..
9db0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32  OPTBOOL("-tls1.2
9dc0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54  ", tls1_2);..OPT
9dd0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20  BOOL("-tls1.3", 
9de0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a  tls1_3);..OPTOBJ
9df0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61  ("-validatecomma
9e00: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54  nd", vcmd);..OPT
9e10: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d  OBJ("-vcmd", vcm
9e20: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70  d);...OPTBAD("op
9e30: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d  tion", "-alpn, -
9e40: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20  cadir, -cafile, 
9e50: 2d 63 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c  -castore, -cert,
9e60: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70   -certfile, -cip
9e70: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74  her, -ciphersuit
9e80: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64  es, -command, -d
9e90: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d  hparams, -key, -
9ea0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c  keyfile, -model,
9eb0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73   -password, -pos
9ec0: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65  t_handshake, -re
9ed0: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c  quest, -require,
9ee0: 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c   -security_level
9ef0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76  , -server, -serv
9f00: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e  ername, -session
9f10: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c  _id, -ssl2, -ssl
9f20: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e  3, -tls1, -tls1.
9f30: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73  1, -tls1.2, -tls
9f40: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74  1.3, or -validat
9f50: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65  ecommand");...re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65      }.    if (re
9f80: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c  quest)..verify |
9f90: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  = SSL_VERIFY_CLI
9fa0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56  ENT_ONCE | SSL_V
9fb0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20  ERIFY_PEER;.    
9fc0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72  if (request && r
9fd0: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c  equire).verify |
9fe0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  = SSL_VERIFY_FAI
9ff0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
a000: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  T;.    if (reque
a010: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
a020: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20  hake).verify |= 
a030: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f  SSL_VERIFY_POST_
a040: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69  HANDSHAKE;.    i
a050: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09  f (verify == 0).
a060: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
a070: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
a080: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
a090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
a0a0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a0b0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
a0c0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
a0d0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a0e0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
a0f0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
a100: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
a110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
a120: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
a130: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
a140: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
a150: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a160: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
a170: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
a180: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
a190: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
a1a0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
a1b0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
a1c0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
a1d0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
a1e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a1f0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
a200: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
a210: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a220: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
a230: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
a240: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a260: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
a270: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
a280: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a290: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
a2a0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
a2b0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
a2c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a2d0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
a2e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
a2f0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
a300: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
a310: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
a320: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
a330: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
a340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a350: 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61  CApath && !*CApa
a360: 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61  th).        CApa
a370: 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  th.        = NUL
a380: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f  L;.    if (CAsto
a390: 72 65 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29  re && !*CAstore)
a3a0: 09 20 20 20 20 20 20 20 20 43 41 73 74 6f 72 65  .        CAstore
a3b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a3c0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
a3d0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
a3e0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
a3f0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
a400: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
a410: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
a420: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
a430: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
a440: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
a450: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
a460: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
a470: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
a480: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
a490: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
a4a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
a4b0: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
a4c0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
a4d0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
a4e0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
a4f0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
a500: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
a510: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a    if (script) {.
a520: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a530: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72  tringFromObj(scr
a540: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ipt, &len);..if 
a550: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a560: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
a570: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54  = script;..    T
a580: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a590: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a5a0: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ck);..}.    }.. 
a5b0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70     /* allocate p
a5c0: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69  assword */.    i
a5d0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  f (password) {..
a5e0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a5f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73  ringFromObj(pass
a600: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  word, &len);..if
a610: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
a620: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a630: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20   = password;..  
a640: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a650: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
a660: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d  sword);..}.    }
a670: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a680: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61  e validate comma
a690: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63  nd */.    if (vc
a6a0: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  md) {..(void) Tc
a6b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a6c0: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a  bj(vcmd, &len);.
a6d0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a6e0: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20   statePtr->vcmd 
a6f0: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c  = vcmd;..    Tcl
a700: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a710: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
a720: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
a730: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  (model != NULL) 
a740: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a  {..int mode;../*
a750: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22   Get the "model"
a760: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61   context */..cha
a770: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
a780: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c  el(interp, model
a790: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63  , &mode);..if (c
a7a0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
a7b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  nel) NULL) {..  
a7c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
a7d0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
a7e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a800: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20  }.../*.. * Make 
a810: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
a820: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
a830: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61  hannel.. */..cha
a840: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
a850: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66  annel(chan);..if
a860: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
a870: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
a880: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
a890: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a8a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a8b0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
a8c0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
a8d0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
a8e0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
a8f0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
a900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
a910: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
a920: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
a930: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
a940: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
a950: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a960: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
a970: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
a980: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a9a0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a9b0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a9c0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a9d0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a9e0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a9f0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
aa00: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
aa10: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
aa20: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
aa30: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
aa40: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61    cert_len, CApa
aa50: 74 68 2c 20 43 41 73 74 6f 72 65 2c 20 43 41 66  th, CAstore, CAf
aa60: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69  ile, ciphers, ci
aa70: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65  phersuites, leve
aa80: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d  l, DHparams)) ==
aa90: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
aaa0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
aab0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
aac0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
aad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
aae0: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74    }..    statePt
aaf0: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20  r->ctx = ctx;.. 
ab00: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
ab10: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
ab20: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e  e that the chann
ab30: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61  el works in bina
ab40: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20  ry (for the.    
ab50: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f   * encryption no
ab60: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20  t to get goofed 
ab70: 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  up)..     */.   
ab80: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
ab90: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
aba0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
abb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
abc0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
abd0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
abe0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
abf0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ac00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ac10: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
ac20: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ac30: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ac40: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ac50: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
ac60: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
ac70: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
ac80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ac90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
aca0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
acb0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
acc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
acd0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ace0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
acf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
ad00: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
ad10: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
ad20: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ad30: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ad40: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ad50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ad60: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
ad70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ad80: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
ad90: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
ada0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
adb0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
adc0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
add0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
ade0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
adf0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
ae00: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
ae10: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
ae20: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
ae30: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
ae40: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
ae50: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
ae60: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
ae70: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54  a) statePtr,..(T
ae80: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
ae90: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
aea0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
aeb0: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
aec0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
aed0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
aee0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
aef0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
af00: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
af10: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
af20: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
af30: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
af40: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
af50: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
af60: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
af70: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
af80: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
af90: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  r);..Tcl_DString
afa0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
afb0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
afc0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
afd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
afe0: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53  coding);..Tcl_DS
aff0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
b000: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
b010: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
b020: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b030: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72  locking);..retur
b040: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b050: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
b060: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b070: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b080: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
b090: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
b0a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
b0b0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
b0c0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
b0d0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
b0e0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
b0f0: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
b100: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b110: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
b120: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
b130: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
b140: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
b150: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
b160: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
b170: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b180: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
b190: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b1a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b1b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b1c0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
b1d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
b1e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
b1f0: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  king));.    Tcl_
b200: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b210: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
b220: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
b230: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b240: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
b250: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b260: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b270: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
b280: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b290: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b2a0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f  locking);..    /
b2b0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69  *.     * SSL Ini
b2c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
b2d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
b2e0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28  ->ssl = SSL_new(
b2f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
b300: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74      if (!statePt
b310: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53  r->ssl) {../* SS
b320: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20  L library error 
b330: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  */..Tcl_AppendRe
b340: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
b350: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74  uldn't construct
b360: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c   ssl session: ",
b370: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
b380: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
b390: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b3a0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b3b0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b3c0: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45  , "INIT", "FAILE
b3d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
b3e0: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74  L);..Tls_Free((t
b3f0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
b400: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
b410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b420: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
b430: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65  host server name
b440: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76   */.    if (serv
b450: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65  ername) {../* Se
b460: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ts the server na
b470: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
b480: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c  NI) in ClientHel
b490: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a  lo extension */.
b4a0: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36  ./* Per RFC 6066
b4b0: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20  , hostname is a 
b4c0: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74  ASCII encoded st
b4d0: 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43  ring, though RFC
b4e0: 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38   4366 says UTF-8
b4f0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73  . */..if (!SSL_s
b500: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e  et_tlsext_host_n
b510: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
b520: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26  l, servername) &
b530: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20  & require) {..  
b540: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b550: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b560: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61  SNI extension fa
b570: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
b580: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b590: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b5a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b5b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b5c0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c  "IMPORT", "SNI",
b5d0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b5e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b5f0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
b600: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
b610: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
b620: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b630: 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d  ../* Set hostnam
b640: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69  e for peer certi
b650: 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20  ficate hostname 
b660: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  verification in 
b670: 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e  clients...   Don
b680: 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f  't use SSL_set1_
b690: 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61  host since it ha
b6a0: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a  s limitations. *
b6b0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31  /..if (!SSL_add1
b6c0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e  _host(statePtr->
b6d0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b6e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
b6f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b700: 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e  , "Set DNS hostn
b710: 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ame failed: ", G
b720: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
b730: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b740: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b750: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b760: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b770: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49  "HOSTNAME", "FAI
b780: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b790: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b7a0: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
b7b0: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
b7c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b7d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b7e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b7f0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b800: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b810: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b820: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b830: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b840: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b850: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b860: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b870: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b880: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b890: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09  tatePtr->ssl),..
b8a0: 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  .(const unsigned
b8b0: 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e   char *) session
b8c0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  _id, (unsigned i
b8d0: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69  nt) strlen(sessi
b8e0: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20  on_id))) {..    
b8f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b900: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65  (interp, "Resume
b910: 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a   session failed:
b920: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
b930: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
b940: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b950: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b960: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b970: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20  RT", "SESSION", 
b980: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b990: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b9a0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
b9b0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
b9c0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
b9e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61     }..    /* Ena
b9f0: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d  ble Application-
ba00: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e  Layer Protocol N
ba10: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d  egotiation. Exam
ba20: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31  ples are: http/1
ba30: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68  .0,..http/1.1, h
ba40: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70  2, h3, ftp, imap
ba50: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69  , pop3, xmpp-cli
ba60: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72  ent, xmpp-server
ba70: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63  , mqtt, irc, etc
ba80: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70  . */.    if (alp
ba90: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74  n) {../* Convert
baa0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f   a TCL list into
bab0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74   a protocol-list
bac0: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20   in wire-format 
bad0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
bae0: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09  r *protos, *p;..
baf0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f  unsigned int pro
bb00: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63  tos_len = 0;..Tc
bb10: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09  l_Size cnt, i;..
bb20: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20  int j;..Tcl_Obj 
bb30: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
bb40: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
bb50: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
bb60: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  n, &cnt, &list) 
bb70: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
bb80: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
bb90: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
bba0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
bbb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bbc0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
bbd0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
bbe0: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
bbf0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
bc00: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
bc10: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
bc20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
bc30: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
bc40: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
bc50: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
bc60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bc70: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
bc80: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c  ocol names too l
bc90: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ong", (char *) N
bca0: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45  ULL);...Tcl_SetE
bcb0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
bcc0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
bcd0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
bce0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
bcf0: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28  L);...Tls_Free((
bd00: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
bd10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65   statePtr);...re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bd30: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74  .    }..    prot
bd40: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69  os_len += 1 + (i
bd50: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a  nt) len;..}.../*
bd60: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c   Build the compl
bd70: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ete protocol-lis
bd80: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63  t */..protos = c
bd90: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65  kalloc(protos_le
bda0: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c  n);../* protocol
bdb0: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f  -lists consist o
bdc0: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70  f 8-bit length-p
bdd0: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74  refixed, byte st
bde0: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a  rings */..for (j
bdf0: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73   = 0, p = protos
be00: 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20  ; j < cnt; j++) 
be10: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72  {..    char *str
be20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
be30: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c  FromObj(list[j],
be40: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b   &len);..    *p+
be50: 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  + = (unsigned ch
be60: 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65  ar) len;..    me
be70: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69  mcpy(p, str, (si
be80: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20  ze_t) len);..   
be90: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
bea0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
beb0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
bec0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
bed0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
bee0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
bef0: 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65  ion reverses the
bf00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f   return value co
bf10: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  nvention */..if 
bf20: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72  (SSL_set_alpn_pr
bf30: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73  otos(statePtr->s
bf40: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74  sl, protos, prot
bf50: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20  os_len)) {..    
bf60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bf70: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c  (interp, "Set AL
bf80: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69  PN protocols fai
bf90: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
bfa0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
bfb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
bfc0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bfd0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bfe0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
bff0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
c000: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
c010: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
c020: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
c030: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65  Ptr);..    ckfre
c040: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20  e(protos);..    
c050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c060: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20  ;..}.../* Store 
c070: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a  protocols list *
c080: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  /..statePtr->pro
c090: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73  tos = protos;..s
c0a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
c0b0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e  len = protos_len
c0c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
c0d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c0e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50   = NULL;..stateP
c0f0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
c100: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
c110: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c  *.     * SSL Cal
c120: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20  lbacks.     */. 
c130: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64     SSL_set_app_d
c140: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ata(statePtr->ss
c150: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  l, (void *)state
c160: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62  Ptr);./* point b
c170: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20  ack to us */.   
c180: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28   SSL_set_verify(
c190: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76  statePtr->ssl, v
c1a0: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c  erify, VerifyCal
c1b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 53  lback);.    /*SS
c1c0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 70  L_set_verify_dep
c1d0: 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 66  th(SSL_set_verif
c1e0: 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a 20  y_depth, 0);*/. 
c1f0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
c200: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c210: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
c220: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
c230: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
c240: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
c250: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
c260: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
c270: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
c280: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
c290: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
c2a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c2b0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c2c0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
c2d0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
c2e0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
c2f0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
c300: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
c310: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c320: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c330: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
c340: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
c350: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c360: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c370: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
c380: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
c390: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
c3a0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
c3b0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
c3c0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
c3d0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
c3e0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
c3f0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
c400: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
c410: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
c420: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
c430: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
c440: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
c450: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
c460: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c470: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c480: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
c490: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c4a0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
c4b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
c4c0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
c4d0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
c4e0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
c4f0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
c500: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c510: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
c520: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c530: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c540: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
c550: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c560: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c570: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c580: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
c590: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
c5a0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
c5b0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c5c0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
c5d0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
c5e0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
c5f0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
c600: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c610: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
c620: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
c630: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
c640: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
c650: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
c660: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
c670: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
c680: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
c690: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
c6a0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
c6b0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
c6c0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
c6d0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
c6e0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
c6f0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
c700: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c710: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
c720: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
c730: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
c740: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
c750: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c760: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
c770: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
c780: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
c790: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
c7a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c7b0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
c7c0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
c7d0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
c7e0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
c7f0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
c800: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c810: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
c820: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
c830: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
c840: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
c850: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c860: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
c870: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c880: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
c890: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c8a0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
c8b0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c8c0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c8d0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
c8e0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
c8f0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
c900: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
c910: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
c920: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
c930: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
c940: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
c950: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
c960: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
c970: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
c980: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c990: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
c9a0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
c9b0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
c9c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
c9d0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
c9e0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
c9f0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
ca00: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
ca10: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
ca20: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
ca30: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
ca40: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
ca50: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
ca60: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
ca70: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
ca80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
ca90: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
caa0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
cab0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
cac0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
cad0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
cae0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
caf0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
cb00: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
cb10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
cb20: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
cb30: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
cb40: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
cb50: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
cb60: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
cb70: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
cb80: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
cb90: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
cba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
cbb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
cbc0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
cbd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
cbe0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cc30: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
cc40: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
cc50: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
cc60: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
cc70: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cc80: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
cc90: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
cca0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
ccb0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
ccc0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
ccd0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
cce0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
ccf0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 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 0a  ---------------.
cd40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
cd50: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
cd60: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
cd70: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
cd80: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
cd90: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
cda0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
cdb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
cdc0: 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 20  , child;./* The 
cdd0: 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65  stacked and unde
cde0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20  rlying channels 
cdf0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
ce00: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
ce10: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
ce20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ce30: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
ce40: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
ce50: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
ce60: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f   int res = TCL_O
ce70: 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  K;.    (void) cl
ce80: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
ce90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
cea0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
ceb0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
cec0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ced0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
cee0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
cef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cf00: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
cf10: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f   channel name */
cf20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
cf30: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
cf40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
cf50: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
cf60: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
cf70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
cf80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
cf90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cfa0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
cfb0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cfc0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cfd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cfe0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cff0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
d000: 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53  child = Tcl_GetS
d010: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68  tackedChannel(ch
d020: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  an);..    /* Ver
d030: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64  ify is a stacked
d040: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
d050: 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 4c  if (child == NUL
d060: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
d070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d080: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
d090: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
d0a0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
d0b0: 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20  : not a stacked 
d0c0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
d0d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
d0e0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
d0f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
d100: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e  UNIMPORT", "CHAN
d110: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
d120: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d130: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d140: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d150: 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64  * Flush any pend
d160: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  ing data */.    
d170: 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 68  if (Tcl_Flush(ch
d180: 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  an) != TCL_OK) {
d190: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d1a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
d1b0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d1c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
d1d0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
d1e0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
d1f0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d200: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
d210: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
d220: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d230: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d240: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
d250: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20  elEncoding);..  
d260: 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e 74    /* Get current
d270: 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 72   config - EOL tr
d280: 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f 64  anslation, encod
d290: 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 6e  ing and bufferin
d2a0: 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 68  g options are sh
d2b0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c 6c  ared between all
d2c0: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65   channels in the
d2d0: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 63   stack */.    Tc
d2e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
d2f0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
d300: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75   "-blocking", &u
d310: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d320: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
d330: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d340: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
d350: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72  ncoding", &upper
d360: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d370: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
d380: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d390: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68  p, chan, "-eofch
d3a0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ar", &upperChann
d3b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d3c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
d3d0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
d3e0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
d3f0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d400: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20  Translation);.. 
d410: 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68     /* Unstack th
d420: 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 65  e channel and re
d430: 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e 67  store underlying
d440: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20   channel config 
d450: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  */.    if (Tcl_U
d460: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
d470: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
d480: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65  CL_OK) {..Tcl_Se
d490: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d4a0: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d  nterp, child, "-
d4b0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
d4c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
d4d0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d4e0: 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61  g));..Tcl_SetCha
d4f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d500: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 63  p, child, "-eofc
d510: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
d520: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
d530: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 09  nnelEOFChar));..
d540: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
d550: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69  tion(interp, chi
d560: 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  ld, "-translatio
d570: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
d580: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d590: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
d5a0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
d5b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
d5c0: 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  hild, "-blocking
d5d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
d5e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
d5f0: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20  lBlocking));.   
d600: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
d610: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d620: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  }..    /* Clean-
d630: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  up */.    Tcl_DS
d640: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d650: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d660: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
d670: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
d680: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
d690: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d6a0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d6b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d6c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d6d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
d6e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75  cking);.    retu
d6f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
d700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d740: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
d750: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
d760: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
d770: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
d780: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
d790: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
d7a0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
d7b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
d7c0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
d7d0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
d7e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
d830: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e  SSL_CTX *.CTX_In
d840: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  it(State *stateP
d850: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72  tr, int isServer
d860: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
d870: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72  r *keyfile, char
d880: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20   *certfile,.    
d890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
d8a0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ey, unsigned cha
d8b0: 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 7a  r *cert, Tcl_Siz
d8c0: 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53  e key_len, Tcl_S
d8d0: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68  ize cert_len, ch
d8e0: 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20  ar *CApath,.    
d8f0: 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20 63  char *CAstore, c
d900: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61  har *CAfile, cha
d910: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
d920: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
d930: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
d940: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
d950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d960: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
d970: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
d980: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
d990: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d9a0: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66   ds;.    int off
d9b0: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b   = 0, abort = 0;
d9c0: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72  .    int load_pr
d9d0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63  ivate_key;.    c
d9e0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
d9f0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
da00: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
da10: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f  ..    if (!proto
da20: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
da30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
da40: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  o valid protocol
da50: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61   selected", (cha
da60: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
da70: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
da80: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53  .    /* create S
da90: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69  SL context */.#i
daa0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
dab0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
dac0: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
dad0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
dae0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
daf0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28  O_SSL2).    if (
db00: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
db10: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20  LS_PROTO_SSL2)) 
db20: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
db30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
db40: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
db50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
db60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
db70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
db80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
db90: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  d(NO_SSL3) || de
dba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dbb0: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45  _SSL3).    if (E
dbc0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dbd0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b  S_PROTO_SSL3)) {
dbe0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
dbf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33  lt(interp, "SSL3
dc00: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
dc10: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
dc20: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
dc30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
dc40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
dc50: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
dc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc70: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e  TLS1).    if (EN
dc80: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
dc90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a  _PROTO_TLS1)) {.
dca0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
dcb0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
dcc0: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .0 protocol not 
dcd0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
dce0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
dcf0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
dd00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dd10: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
dd20: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
dd30: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
dd40: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dd50: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dd60: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_1)) {..Tcl_App
dd70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dd80: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f  , "TLS 1.1 proto
dd90: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
dda0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
ddb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
ddc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
ddd0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
dde0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
ddf0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
de00: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
de10: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
de20: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
de30: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
de40: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
de50: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
de60: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
de70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
de80: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
de90: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dea0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
deb0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
dec0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
ded0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dee0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
def0: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_3)) {..Tcl_App
df00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
df10: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f  , "TLS 1.3 proto
df20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
df30: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
df40: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
df50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
df60: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
df70: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c  0) {../* Use ful
df80: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f  l range */..SSL_
df90: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
dfa0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30  o_version(ctx, 0
dfb0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
dfc0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
dfd0: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d  n(ctx, 0);.    }
dfe0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72  ..    switch (pr
dff0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53  oto) {.#if OPENS
e000: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
e010: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
e020: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
e030: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
e040: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
e050: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
e060: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68  ROTO_SSL2:..meth
e070: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
e080: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv2_server_met
e090: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c  hod() : SSLv2_cl
e0a0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
e0b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
e0c0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
e0d0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
e0e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
e0f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
e110: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
e120: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d  S_PROTO_SSL3:..m
e130: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
e140: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f   ? SSLv3_server_
e150: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33  method() : SSLv3
e160: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
e170: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
e180: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e190: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
e1a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e1b0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
e1c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e1d0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
e1e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
e1f0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e200: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76  ver ? TLSv1_serv
e210: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e220: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Sv1_client_metho
e230: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e240: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e250: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
e260: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e270: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
e280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e290: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
e2a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e2b0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
e2c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e2d0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f   TLSv1_1_server_
e2e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
e2f0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _1_client_method
e300: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e310: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e320: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e330: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e340: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
e350: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e360: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
e370: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
e380: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68  TO_TLS1_2:..meth
e390: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
e3a0: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d  TLSv1_2_server_m
e3b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
e3c0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
e3d0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e3e0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e3f0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
e400: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e410: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
e420: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
e430: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20  _3:../* Use the 
e440: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61  generic method a
e450: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61  nd constraint ra
e460: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78  nge after contex
e470: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  t is created */.
e480: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e490: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
e4a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
e4b0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e4c0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
e4d0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20     default:../* 
e4e0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73  Negotiate highes
e4f0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f  t available SSL/
e500: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09  TLS version */..
e510: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e520: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
e530: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
e540: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23  ient_method();.#
e550: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
e560: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
e570: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
e580: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
e590: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e5a0: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c  _NO_SSL2)..off |
e5b0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e5c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
e5d0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
e5e0: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64  _NO_SSLv2);.#end
e5f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e600: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
e610: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e620: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL3)..off |= (E
e630: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e640: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20  S_PROTO_SSL3)   
e650: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e660: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv3);.#endif.#
e670: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e680: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
e690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e6a0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e6b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e6c0: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20  OTO_TLS1)   ? 0 
e6d0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
e6e0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
e6f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e700: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
e710: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
e720: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e730: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e740: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20  OTO_TLS1_1) ? 0 
e750: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
e760: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_1);.#endif.#if
e770: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e780: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
e790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e7a0: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _2)..off |= (ENA
e7b0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e7c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
e7d0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
e7e0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
e7f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e800: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
e810: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e820: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_3)..off |= (E
e830: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e840: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
e850: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e860: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66  TLSv1_3);.#endif
e870: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
e880: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
e890: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20  ror();..    ctx 
e8a0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
e8b0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21  thod);.    if (!
e8c0: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ctx) {..return N
e8d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e8e0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
e8f0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
e900: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
e910: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
e920: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
e930: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
e940: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
e950: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
e970: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
e980: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
e990: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
e9a0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
e9b0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
e9c0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
e9d0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
e9e0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
e9f0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
ea00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
ea10: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73  * Force cipher s
ea20: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62  election order b
ea30: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20  y server */.    
ea40: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b  if (!isServer) {
ea50: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70  ..SSL_CTX_set_op
ea60: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
ea70: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f  P_CIPHER_SERVER_
ea80: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20  PREFERENCE);.   
ea90: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
eaa0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
eab0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
eac0: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c   OpenSSL_add_all
ead0: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f  _algorithms(); /
eae0: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61  * Load ciphers a
eaf0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65  nd digests */.#e
eb00: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54  ndif..    SSL_CT
eb10: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
eb20: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
eb30: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
eb40: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
eb50: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
eb60: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
eb70: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
eb80: 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20 62  Enable all SSL b
eb90: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a  ug workarounds *
eba0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
ebb0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
ebc0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53  SL_OP_NO_COMPRES
ebd0: 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62 6c  SION);./* Disabl
ebe0: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76  e compression ev
ebf0: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20  en if supported 
ec00: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
ec10: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
ec20: 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62 6c  off);../* Disabl
ec30: 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 74  e specified prot
ec40: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f  ocol versions */
ec50: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 77  ..    /* Allow w
ec60: 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74 20  rites to report 
ec70: 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65 73  success when les
ec80: 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f 72  s than all recor
ec90: 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ds have been wri
eca0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tten */.    SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78  CTX_set_mode(ctx
ecc0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42 4c  , SSL_MODE_ENABL
ecd0: 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45 29  E_PARTIAL_WRITE)
ece0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  ;..    /* Disabl
ecf0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 72  e attempts to tr
ed00: 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  y to process the
ed10: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e 73   next record ins
ed20: 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69 6e  tead of returnin
ed30: 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20  g after a.      
ed40: 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64 2e   non-app record.
ed50: 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69 6e   Avoids hangs in
ed60: 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20   blocking mode, 
ed70: 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f 72  when using SSL_r
ed80: 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20 20  ead() and a.    
ed90: 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74 69     non-applicati
eda0: 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73 65  on record was se
edb0: 6e 74 20 61 6e 64 20 6e 6f 20 61 70 70 6c 69 63  nt and no applic
edc0: 61 74 69 6f 6e 20 64 61 74 61 20 77 61 73 20 73  ation data was s
edd0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  ent. */.    SSL_
ede0: 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63  CTX_clear_mode(c
edf0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54  tx, SSL_MODE_AUT
ee00: 4f 5f 52 45 54 52 59 29 3b 0a 0a 20 20 20 20 53  O_RETRY);..    S
ee10: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
ee20: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20  cache_size(ctx, 
ee30: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  128);..    /* Se
ee40: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  t user defined c
ee50: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73  iphers, cipher s
ee60: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72  uites, and secur
ee70: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
ee80: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
ee90: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
eea0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
eeb0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
eec0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
eed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
eee0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65  et ciphers faile
eef0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
ef00: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
ef10: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
ef20: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
ef30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
ef40: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69    if ((ciphersui
ef50: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  tes != NULL) && 
ef60: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
ef70: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63  hersuites(ctx, c
ef80: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a  iphersuites)) {.
ef90: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
efa0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
efb0: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69  ipher suites fai
efc0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
efd0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
efe0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
eff0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
f000: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
f010: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
f020: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f030: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
f040: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
f050: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
f060: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
f070: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
f080: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
f090: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
f0a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
f0b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
f0c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f0d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
f0e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
f0f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
f100: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
f110: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
f120: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
f130: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
f140: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
f150: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
f160: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
f170: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
f180: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
f190: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66  ngInit(&ds);.#if
f1a0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
f1b0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
f1c0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
f1d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f1e0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
f1f0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
f200: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
f210: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
f220: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f230: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
f240: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
f250: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
f260: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f270: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
f280: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  o;...    bio = B
f290: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
f2a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
f2b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
f2c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
f2d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f2e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f2f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
f300: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
f310: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
f320: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f330: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
f340: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
f350: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
f360: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
f370: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
f380: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
f390: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
f3a0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
f3b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f3c0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
f3d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
f3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
f3f0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
f400: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
f410: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
f420: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f430: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f440: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f450: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
f460: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
f470: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65  h);..    DH_free
f480: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  (dh);...} else {
f490: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
f4a0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
f4b0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
f4c0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
f4d0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
f4e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
f4f0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
f500: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
f510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f520: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
f530: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
f540: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
f550: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f560: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f570: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f580: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f590: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
f5a0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
f5b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
f5c0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
f5d0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
f5e0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
f5f0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
f600: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
f610: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f620: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
f630: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
f640: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
f650: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
f660: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
f670: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f6a0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
f6b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
f6c0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
f6d0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
f6e0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f6f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f700: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f710: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
f720: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f730: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65  e(&ds);..    } e
f740: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20  lse if (cert != 
f750: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
f760: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09  ivate_key = 1;..
f770: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f780: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31  certificate_ASN1
f790: 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 74  (ctx, (int) cert
f7a0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30  _len, cert) <= 0
f7b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
f7c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f7d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f7e0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
f7f0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f800: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f810: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f820: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f830: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f840: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
f850: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
f860: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
f870: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
f880: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
f890: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
f8a0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
f8b0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
f8c0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
f8d0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  0..    Tcl_Appen
f8e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f8f0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
f900: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
f910: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
f920: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54  ile, ": ",...GET
f930: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f940: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f950: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
f960: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
f970: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
f980: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
f990: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65   set our private
f9a0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
f9b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
f9c0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  ) {..if (keyfile
f9d0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20   == NULL && key 
f9e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
f9f0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
fa00: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79  le;..}...if (key
fa10: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
fa20: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20  .    /* get the 
fa30: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
fa40: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
fa50: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
fa60: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
fa70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65   == NULL) {...ke
fa80: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
fa90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
faa0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
fab0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63  rivateKey_file(c
fac0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c  tx, F2N(keyfile,
fad0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
fae0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
faf0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
fb00: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
fb10: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
fb20: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
fb30: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
fb40: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
fb50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
fb60: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
fb70: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
fb80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
fb90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
fba0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
fbb0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09  keyfile, " ",...
fbc0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53      GET_ERR_REAS
fbd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
fbe0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
fbf0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
fc00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
fc10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
fc20: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20  gFree(&ds);...} 
fc30: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20  else if (key != 
fc40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
fc50: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
fc60: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50  vateKey_ASN1(EVP
fc70: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20  _PKEY_RSA, ctx, 
fc80: 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c  key, (int) key_l
fc90: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a  en) <= 0) {.../*
fca0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
fcb0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
fcc0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
fcd0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
fce0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
fcf0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
fd00: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
fd10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fd20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
fd30: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47  public key: ", G
fd40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
fd50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
fd60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
fd70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
fd80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
fd90: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
fda0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
fdb0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
fdc0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
fdd0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
fde0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
fdf0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
fe00: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
fe10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fe20: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
fe30: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
fe40: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
fe50: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
fe60: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
fe70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
fe80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
fe90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
fea0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
feb0: 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68 65  * Set to use the
fec0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
fed0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
fee0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
fef0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
ff00: 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20 54  icates..     * T
ff10: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65  he default CA ce
ff20: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63  rtificates direc
ff30: 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20 63  tory is called c
ff40: 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66 61  erts in the defa
ff50: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20  ult OpenSSL.    
ff60: 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74   * directory. It
ff70: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 41   contains the CA
ff80: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e   certificates in
ff90: 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74   PEM format, wit
ffa0: 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  h one certificat
ffb0: 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69 6c  e per.     * fil
ffc0: 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70 61  e. The verify pa
ffd0: 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e  th and store can
ffe0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
fff0: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44  y the SSL_CERT_D
10000 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a  IR env var. The.
10010 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20 43       * default C
10020 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66  A certificates f
10030 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65  ile is called ce
10040 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65  rt.pem in the de
10050 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69  fault OpenSSL di
10060 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20  rectory..     * 
10070 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20  The verify file 
10080 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
10090 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
100a0 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20  T_FILE env var. 
100b0 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
100c0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
100d0 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
100e0 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20  )) {..abort++;. 
100f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
10100 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43  rrides for the C
10110 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  A verify path an
10120 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a  d file */.    {.
10130 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
10140 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
10150 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41  0000000L..if (CA
10160 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  path != NULL || 
10170 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
10180 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
10190 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c  ng ds1;..    Tcl
101a0 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
101b0 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53  1);...    if (!S
101c0 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
101d0 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
101e0 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
101f0 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  s), F2N(CApath, 
10200 26 64 73 31 29 29 29 20 7b 0a 09 09 54 63 6c 5f  &ds1))) {...Tcl_
10210 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
10220 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
10230 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
10240 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
10250 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 54 63  _free(ctx);...Tc
10260 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
10270 73 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  s);...Tcl_DStrin
10280 67 46 72 65 65 28 26 64 73 31 29 3b 0a 09 09 72  gFree(&ds1);...r
10290 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20  eturn NULL;..   
102a0 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
102b0 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20  ingFree(&ds);.. 
102c0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
102d0 65 65 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20  ee(&ds1);...    
102e0 2f 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43  /* Set list of C
102f0 41 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c  As to send to cl
10300 69 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73  ient when reques
10310 74 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65  ting a client ce
10320 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
10330 20 20 2f 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75    /* https://sou
10340 72 63 65 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74  rceforge.net/p/t
10350 6c 73 2f 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09  ls/bugs/57/ */..
10360 20 20 20 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a      /* XXX:TODO:
10370 20 4c 65 74 20 74 68 65 20 75 73 65 72 20 73 75   Let the user su
10380 70 70 6c 79 20 76 61 6c 75 65 73 20 68 65 72 65  pply values here
10390 20 69 6e 73 74 65 61 64 20 6f 66 20 73 6f 6d 65   instead of some
103a0 74 68 69 6e 67 20 74 68 61 74 20 65 78 69 73 74  thing that exist
103b0 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 79 73  s on the filesys
103c0 74 65 6d 20 2a 2f 0a 09 20 20 20 20 53 54 41 43  tem */..    STAC
103d0 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20  K_OF(X509_NAME) 
103e0 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c  *certNames = SSL
103f0 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f  _load_client_CA_
10400 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c  file(F2N(CAfile,
10410 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20   &ds));..    if 
10420 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55  (certNames != NU
10430 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f  LL) {...SSL_CTX_
10440 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  set_client_CA_li
10450 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65  st(ctx, certName
10460 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  s);..    }..    
10470 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
10480 26 64 73 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a  &ds);..}..#else.
10490 09 2f 2a 20 53 65 74 20 64 69 72 65 63 74 6f 72  ./* Set director
104a0 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 43 41 20  y containing CA 
104b0 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e 20  certificates in 
104c0 50 45 4d 20 66 6f 72 6d 61 74 2e 20 2a 2f 0a 09  PEM format. */..
104d0 69 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55  if (CApath != NU
104e0 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21  LL) {..    if (!
104f0 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72  SSL_CTX_load_ver
10500 69 66 79 5f 64 69 72 28 63 74 78 2c 20 46 32 4e  ify_dir(ctx, F2N
10510 28 43 41 70 61 74 68 2c 20 26 64 73 29 29 29 20  (CApath, &ds))) 
10520 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
10530 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47 45 54  sult(interp, GET
10540 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
10550 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
10560 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
10570 78 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  x);...Tcl_DStrin
10580 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 72 65  gFree(&ds);...re
10590 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
105a0 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  }..    Tcl_DStri
105b0 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a  ngFree(&ds);..}.
105c0 09 0a 09 2f 2a 20 53 65 74 20 55 52 49 20 66 6f  .../* Set URI fo
105d0 72 20 74 6f 20 61 20 73 74 6f 72 65 2c 20 77 68  r to a store, wh
105e0 69 63 68 20 6d 61 79 20 62 65 20 61 20 73 69 6e  ich may be a sin
105f0 67 6c 65 20 63 6f 6e 74 61 69 6e 65 72 20 6f 72  gle container or
10600 20 61 20 63 61 74 61 6c 6f 67 20 6f 66 20 63 6f   a catalog of co
10610 6e 74 61 69 6e 65 72 73 2e 20 2a 2f 0a 09 69 66  ntainers. */..if
10620 20 28 43 41 73 74 6f 72 65 20 21 3d 20 4e 55 4c   (CAstore != NUL
10630 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
10640 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
10650 66 79 5f 73 74 6f 72 65 28 63 74 78 2c 20 46 32  fy_store(ctx, F2
10660 4e 28 43 41 73 74 6f 72 65 2c 20 26 64 73 29 29  N(CAstore, &ds))
10670 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  ) {...Tcl_Append
10680 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
10690 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
106a0 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
106b0 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
106c0 63 74 78 29 3b 0a 09 09 54 63 6c 5f 44 53 74 72  ctx);...Tcl_DStr
106d0 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
106e0 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20  return NULL;..  
106f0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
10700 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
10710 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 66 69 6c 65  }..../* Set file
10720 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 63 61   of CA certifica
10730 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61  tes in PEM forma
10740 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 66 69  t.  */..if (CAfi
10750 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  le != NULL) {.. 
10760 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
10770 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c 65  load_verify_file
10780 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c 65  (ctx, F2N(CAfile
10790 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 54 63 6c  , &ds))) {...Tcl
107a0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
107b0 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45  terp, GET_ERR_RE
107c0 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29  ASON(), (char *)
107d0 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54   NULL);...SSL_CT
107e0 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 54  X_free(ctx);...T
107f0 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
10800 64 73 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  ds);...return NU
10810 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
10820 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
10830 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53  &ds);...    /* S
10840 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20 74  et list of CAs t
10850 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74  o send to client
10860 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
10870 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69 66   a client certif
10880 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 53 54  icate */..    ST
10890 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
108a0 29 20 2a 63 65 72 74 4e 61 6d 65 73 20 3d 20 53  ) *certNames = S
108b0 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e 74 5f 43  SL_load_client_C
108c0 41 5f 66 69 6c 65 28 46 32 4e 28 43 41 66 69 6c  A_file(F2N(CAfil
108d0 65 2c 20 26 64 73 29 29 3b 0a 09 20 20 20 20 69  e, &ds));..    i
108e0 66 20 28 63 65 72 74 4e 61 6d 65 73 20 21 3d 20  f (certNames != 
108f0 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c 5f 43 54  NULL) {...SSL_CT
10900 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f  X_set_client_CA_
10910 6c 69 73 74 28 63 74 78 2c 20 63 65 72 74 4e 61  list(ctx, certNa
10920 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20  mes);..    }..  
10930 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
10940 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65 6e 64 69  e(&ds);..}.#endi
10950 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  f.    }..    ret
10960 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn ctx;.}.../*.
10970 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109b0 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 74 61 74  -----. *. * Stat
109c0 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75  usObjCmd -- retu
109d0 72 6e 20 63 65 72 74 69 66 69 63 61 74 65 20 66  rn certificate f
109e0 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20 70 65 65  or connected pee
109f0 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a 20 52 65  r info.. *. * Re
10a00 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
10a10 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e  dard Tcl result.
10a20 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
10a30 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
10a40 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
10a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a80 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69  ------. */.stati
10a90 63 20 69 6e 74 0a 53 74 61 74 75 73 4f 62 6a 43  c int.StatusObjC
10aa0 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  md(ClientData cl
10ab0 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e  ientData, Tcl_In
10ac0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
10ad0 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20  t objc, Tcl_Obj 
10ae0 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b  *const objv[]) {
10af0 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
10b00 65 50 74 72 3b 0a 20 20 20 20 58 35 30 39 20 2a  ePtr;.    X509 *
10b10 70 65 65 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  peer;.    Tcl_Ob
10b20 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20 20 20 54  j *objPtr;.    T
10b30 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
10b40 0a 20 20 20 20 63 68 61 72 20 2a 63 68 61 6e 6e  .    char *chann
10b50 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68 65 72 73  elName, *ciphers
10b60 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a  ;.    int mode;.
10b70 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
10b80 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f 3b 0a  ed char *proto;.
10b90 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
10ba0 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 6e 69   len;.    int ni
10bb0 64 2c 20 72 65 73 3b 0a 20 20 20 20 28 76 6f 69  d, res;.    (voi
10bc0 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
10bd0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
10be0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
10bf0 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63  objc < 2 || objc
10c00 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63 20 3d 3d   > 3 || (objc ==
10c10 20 33 20 26 26 20 21 73 74 72 63 6d 70 28 54 63   3 && !strcmp(Tc
10c20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10c30 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c 22 29 29  [1]), "-local"))
10c40 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
10c50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
10c60 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63 61 6c 3f   objv, "?-local?
10c70 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74   channel");..ret
10c80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10c90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
10ca0 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20   channel Id */. 
10cb0 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d 65 20 3d     channelName =
10cc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
10cd0 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20 32 20 3f  bjv[(objc == 2 ?
10ce0 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20 20 20 63   1 : 2)]);.    c
10cf0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
10d00 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61  nnel(interp, cha
10d10 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f 64 65 29  nnelName, &mode)
10d20 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
10d30 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
10d40 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
10d50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
10d60 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
10d70 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
10d80 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
10d90 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
10da0 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
10db0 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
10dc0 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
10dd0 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
10de0 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
10df0 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
10e00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
10e10 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
10e20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
10e30 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
10e40 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
10e50 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
10e60 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
10e70 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
10e80 22 54 4c 53 22 2c 20 22 53 54 41 54 55 53 22 2c  "TLS", "STATUS",
10e90 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
10ea0 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
10eb0 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
10ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10ed0 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
10ee0 53 74 61 74 65 20 2a 29 20 54 63 6c 5f 47 65 74  State *) Tcl_Get
10ef0 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
10f00 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  ata(chan);..    
10f10 2f 2a 20 47 65 74 20 63 65 72 74 69 66 69 63 61  /* Get certifica
10f20 74 65 20 66 6f 72 20 70 65 65 72 20 6f 72 20 73  te for peer or s
10f30 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  elf */.    if (o
10f40 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 70 65 65  bjc == 2) {..pee
10f50 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72  r = SSL_get_peer
10f60 5f 63 65 72 74 69 66 69 63 61 74 65 28 73 74 61  _certificate(sta
10f70 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20  tePtr->ssl);.   
10f80 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65 65 72 20   } else {..peer 
10f90 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72 74 69 66  = SSL_get_certif
10fa0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
10fb0 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ssl);.    }.    
10fc0 2f 2a 20 47 65 74 20 58 35 30 39 20 63 65 72 74  /* Get X509 cert
10fd0 69 66 69 63 61 74 65 20 69 6e 66 6f 20 2a 2f 0a  ificate info */.
10fe0 20 20 20 20 69 66 20 28 70 65 65 72 29 20 7b 0a      if (peer) {.
10ff0 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73 5f 4e 65  .objPtr = Tls_Ne
11000 77 58 35 30 39 4f 62 6a 28 69 6e 74 65 72 70 2c  wX509Obj(interp,
11010 20 70 65 65 72 29 3b 0a 09 69 66 20 28 6f 62 6a   peer);..if (obj
11020 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58  c == 2) {..    X
11030 35 30 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a  509_free(peer);.
11040 09 20 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c  .    peer = NULL
11050 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20  ;..}.    } else 
11060 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  {..objPtr = Tcl_
11070 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
11080 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  LL);.    }..    
11090 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a  /* Peer name */.
110a0 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28      LAPPEND_STR(
110b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
110c0 22 70 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f  "peername", SSL_
110d0 67 65 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74  get0_peername(st
110e0 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31  atePtr->ssl), -1
110f0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49  );.    LAPPEND_I
11100 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  NT(interp, objPt
11110 72 2c 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f  r, "sbits", SSL_
11120 67 65 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28  get_cipher_bits(
11130 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e  statePtr->ssl, N
11140 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68  ULL));..    ciph
11150 65 72 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c  ers = (char*)SSL
11160 5f 67 65 74 5f 63 69 70 68 65 72 28 73 74 61 74  _get_cipher(stat
11170 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
11180 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11190 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
111a0 68 65 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d  her", ciphers, -
111b0 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69  1);..    /* Veri
111c0 66 79 20 74 68 65 20 58 35 30 39 20 63 65 72 74  fy the X509 cert
111d0 69 66 69 63 61 74 65 20 70 72 65 73 65 6e 74 65  ificate presente
111e0 64 20 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f  d by the peer */
111f0 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11200 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11210 20 22 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c   "verifyResult",
11220 0a 09 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65  ..X509_verify_ce
11230 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28  rt_error_string(
11240 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72  SSL_get_verify_r
11250 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e  esult(statePtr->
11260 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20  ssl)), -1);..   
11270 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
11280 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53  */.    mode = SS
11290 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64  L_get_verify_mod
112a0 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
112b0 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26  ;.    if (mode &
112c0 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e  & SSL_VERIFY_NON
112d0 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  E) {..LAPPEND_ST
112e0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
112f0 2c 20 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20  , "verifyMode", 
11300 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20  "none", -1);.   
11310 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f   } else {..Tcl_O
11320 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d  bj *listObjPtr =
11330 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
11340 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d  0, NULL);..if (m
11350 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
11360 59 5f 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54  Y_PEER) {..    T
11370 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11380 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
11390 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f  listObjPtr, Tcl_
113a0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65  NewStringObj("pe
113b0 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69  er", -1));..}..i
113c0 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56  f (mode && SSL_V
113d0 45 52 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f  ERIFY_FAIL_IF_NO
113e0 5f 50 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20  _PEER_CERT) {.. 
113f0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11400 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11410 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
11420 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11430 28 22 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65  ("fail if no pee
11440 72 20 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09  r cert", -1));..
11450 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
11460 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54  SL_VERIFY_CLIENT
11470 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63  _ONCE) {..    Tc
11480 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11490 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c  lement(interp, l
114a0 69 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e  istObjPtr, Tcl_N
114b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69  ewStringObj("cli
114c0 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b  ent once", -1));
114d0 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
114e0 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54   SSL_VERIFY_POST
114f0 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20  _HANDSHAKE) {.. 
11500 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
11510 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
11520 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20  rp, listObjPtr, 
11530 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
11540 28 22 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65  ("post handshake
11550 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50  ", -1));..}..LAP
11560 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c  PEND_OBJ(interp,
11570 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
11580 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74  Mode", listObjPt
11590 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  r).    }..    /*
115a0 20 56 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70   Verify mode dep
115b0 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  th */.    LAPPEN
115c0 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
115d0 6a 50 74 72 2c 20 22 76 65 72 69 66 79 44 65 70  jPtr, "verifyDep
115e0 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  th", SSL_get_ver
115f0 69 66 79 5f 64 65 70 74 68 28 73 74 61 74 65 50  ify_depth(stateP
11600 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20  tr->ssl));..    
11610 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
11620 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
11630 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
11640 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  he negotiation *
11650 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61  /.    SSL_get0_a
11660 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
11670 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
11680 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c  to, &len);.    L
11690 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
116a0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e  p, objPtr, "alpn
116b0 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  ", (char *)proto
116c0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e  , (Tcl_Size) len
116d0 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  );.    LAPPEND_S
116e0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
116f0 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53  r, "protocol", S
11700 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73  SL_get_version(s
11710 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d  tatePtr->ssl), -
11720 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69  1);..    /* Vali
11730 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69  d for non-RSA si
11740 67 6e 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20  gnature and TLS 
11750 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f  1.3 */.    if (o
11760 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73  bjc == 2) {..res
11770 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f   = SSL_get_peer_
11780 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
11790 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
117a0 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
117b0 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
117c0 73 69 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74  signature_nid(st
117d0 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
117e0 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
117f0 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
11800 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
11810 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
11820 72 2c 20 22 73 69 67 6e 61 74 75 72 65 48 61 73  r, "signatureHas
11830 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a  hAlgorithm", OBJ
11840 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
11850 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 64  );..    /* Added
11860 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e   in OpenSSL 1.1.
11870 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  1a */.#if OPENSS
11880 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
11890 20 3e 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20   > 0x10101000L. 
118a0 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32     if (objc == 2
118b0 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  ) {..res = SSL_g
118c0 65 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72  et_peer_signatur
118d0 65 5f 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65  e_type_nid(state
118e0 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b  Ptr->ssl, &nid);
118f0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72  .    } else {..r
11900 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67  es = SSL_get_sig
11910 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28  nature_type_nid(
11920 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
11930 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  nid);.    }.    
11940 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d  if (!res) {nid =
11950 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44   0;}.    LAPPEND
11960 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11970 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54  Ptr, "signatureT
11980 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e  ype", OBJ_nid2ln
11990 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e 64  (nid), -1);.#end
119a0 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  if..    Tcl_SetO
119b0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
119c0 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65   objPtr);.    re
119d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
119e0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
119f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
11a30 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62  ConnectionInfoOb
11a40 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63  jCmd -- return c
11a50 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66  onnection info f
11a60 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a  rom OpenSSL.. *.
11a70 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
11a80 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74   list of connect
11a90 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d  ion info.  *. *-
11aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ae0 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
11af0 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  nt ConnectionInf
11b00 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  oObjCmd(ClientDa
11b10 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
11b20 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11b30 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
11b40 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
11b50 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
11b60 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
11b70 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
11b80 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a  et a mode on */.
11b90 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
11ba0 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20  Ptr;../* client 
11bb0 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f  state for ssl so
11bc0 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  cket */.    Tcl_
11bd0 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69  Obj *objPtr, *li
11be0 73 74 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74  stPtr;.    const
11bf0 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63   SSL *ssl;.    c
11c00 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20  onst SSL_CIPHER 
11c10 2a 63 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e  *cipher;.    con
11c20 73 74 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a  st SSL_SESSION *
11c30 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e  session;.    con
11c40 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20  st EVP_MD *md;. 
11c50 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
11c60 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6f  Data;..    if (o
11c70 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c  bjc != 2) {..Tcl
11c80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
11c90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
11ca0 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75  channel");..retu
11cb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11cc0 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20    }..    chan = 
11cd0 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
11ce0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
11cf0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e  ring(objv[1]), N
11d00 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68  ULL);.    if (ch
11d10 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
11d20 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74  el) NULL) {..ret
11d30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11d40 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b     }..    /* Mak
11d50 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74  e sure to operat
11d60 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74  e on the topmost
11d70 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
11d80 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f  chan = Tcl_GetTo
11d90 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  pChannel(chan);.
11da0 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
11db0 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
11dc0 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
11dd0 79 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70  ype()) {..Tcl_Ap
11de0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11df0 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20  p, "bad channel 
11e00 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e  \"", Tcl_GetChan
11e10 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09  nelName(chan),..
11e20 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54      "\": not a T
11e30 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68  LS channel", (ch
11e40 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63  ar *) NULL);..Tc
11e50 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
11e60 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43  nterp, "TLS", "C
11e70 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41  ONNECTION", "CHA
11e80 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
11e90 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
11ea0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
11eb0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
11ec0 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
11ed0 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
11ee0 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;..    /* Connec
11ef0 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  tion info */.   
11f00 20 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61   statePtr = (Sta
11f10 74 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e  te *)Tcl_GetChan
11f20 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28  nelInstanceData(
11f30 63 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d  chan);.    ssl =
11f40 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a   statePtr->ssl;.
11f50 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e      if (ssl != N
11f60 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
11f70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f  signed char *pro
11f80 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e  to;..unsigned in
11f90 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69  t ulen;.../* Ini
11fa0 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69  tialization fini
11fb0 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  shed */..LAPPEND
11fc0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
11fd0 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69  jPtr, "init_fini
11fe0 73 68 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e  shed", SSL_is_in
11ff0 69 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29  it_finished(ssl)
12000 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74  );..../* connect
12010 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41  ion state */..LA
12020 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12030 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65  , objPtr, "state
12040 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72  ", SSL_state_str
12050 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d  ing_long(ssl), -
12060 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49  1);.../* Get SNI
12070 20 72 65 71 75 65 73 74 65 64 20 73 65 72 76 65   requested serve
12080 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45  r name */..LAPPE
12090 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
120a0 62 6a 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61  bjPtr, "serverna
120b0 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72  me", SSL_get_ser
120c0 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53  vername(ssl, TLS
120d0 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73  EXT_NAMETYPE_hos
120e0 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09  t_name), -1);...
120f0 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73 65  /* Report the se
12100 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
12110 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
12120 68 65 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a  he negotiation *
12130 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e  /..SSL_get0_alpn
12140 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65 50  _selected(stateP
12150 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c  tr->ssl, &proto,
12160 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
12170 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12180 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63  jPtr, "alpn", (c
12190 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63  har *)proto, (Tc
121a0 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a  l_Size) ulen);..
121b0 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c  ./* Get protocol
121c0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
121d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
121e0 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
121f0 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c  _get_version(ssl
12200 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e  ), -1);.../* Ren
12210 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77  egotiation allow
12220 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ed */..LAPPEND_B
12230 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
12240 74 72 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69  tr, "renegotiati
12250 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c  on_allowed", SSL
12260 5f 67 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65  _get_secure_rene
12270 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72  gotiation_suppor
12280 74 28 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b  t((SSL *) ssl));
12290 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69  .../* Get securi
122a0 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50  ty level */..LAP
122b0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
122c0 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69   objPtr, "securi
122d0 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67  ty_level", SSL_g
122e0 65 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65  et_security_leve
122f0 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65  l(ssl));.../* Se
12300 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c  ssion info */..L
12310 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12320 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73  rp, objPtr, "ses
12330 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53  sion_reused", SS
12340 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64  L_session_reused
12350 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20  (ssl));.../* Is 
12360 73 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09  server info */..
12370 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
12380 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73  erp, objPtr, "is
12390 5f 73 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73  _server", SSL_is
123a0 5f 73 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a  _server(ssl));..
123b0 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09  ./* Is DTLS */..
123c0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
123d0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73  erp, objPtr, "is
123e0 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64  _dtls", SSL_is_d
123f0 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20  tls(ssl));..#if 
12400 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
12410 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 30  NUMBER >= 0x3020
12420 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49  0000L../* Is QUI
12430 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  C */..LAPPEND_BO
12440 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
12450 72 2c 20 22 69 73 5f 71 75 69 63 22 2c 20 53 53  r, "is_quic", SS
12460 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c 29 29 3b  L_is_quic(ssl));
12470 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a  .../* Is TLS */.
12480 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
12490 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69  terp, objPtr, "i
124a0 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74  s_tls", SSL_is_t
124b0 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66  ls(ssl));.#endif
124c0 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61  .../* DANE TLS a
124d0 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f  uthentication */
124e0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
124f0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12500 64 61 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f  dane_auth", SSL_
12510 67 65 74 30 5f 64 61 6e 65 28 73 73 6c 29 20 21  get0_dane(ssl) !
12520 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a 20 57 61  = NULL);.../* Wa
12530 69 74 69 6e 67 20 66 6f 72 20 61 73 79 6e 63 20  iting for async 
12540 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
12550 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12560 20 22 77 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73   "waiting_for_as
12570 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69 74 69 6e  ync", SSL_waitin
12580 67 5f 66 6f 72 5f 61 73 79 6e 63 28 73 73 6c 29  g_for_async(ssl)
12590 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d 6f 75 74  );.../* Time-out
125a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
125b0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
125c0 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c 20 53 53  , "time-out", SS
125d0 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f 74 69  L_get_default_ti
125e0 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a 0a 09 2f  meout(ssl));.../
125f0 2a 20 49 73 20 43 65 72 74 69 66 69 63 61 74 65  * Is Certificate
12600 20 54 72 61 6e 73 70 61 72 65 6e 63 79 20 76 61   Transparency va
12610 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62 6c 65 64  lidation enabled
12620 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
12630 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
12640 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64 22 2c 20  , "ct_enabled", 
12650 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61 62 6c 65  SSL_ct_is_enable
12660 64 28 73 73 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a  d(ssl));.    }..
12670 20 20 20 20 2f 2a 20 43 69 70 68 65 72 20 69 6e      /* Cipher in
12680 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70 68 65 72  fo */.    cipher
12690 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72 65   = SSL_get_curre
126a0 6e 74 5f 63 69 70 68 65 72 28 73 73 6c 29 3b 0a  nt_cipher(ssl);.
126b0 20 20 20 20 69 66 20 28 63 69 70 68 65 72 20 21      if (cipher !
126c0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
126d0 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d 20 7b 30  buf[BUFSIZ] = {0
126e0 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c 20 61 6c  };..int bits, al
126f0 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20 43 69 70  g_bits;.../* Cip
12700 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50  her name */..LAP
12710 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12720 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72   objPtr, "cipher
12730 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65  ", SSL_CIPHER_ge
12740 74 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  t_name(cipher), 
12750 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43 20 6e 61  -1);.../* RFC na
12760 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
12770 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12780 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
12790 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c 20 53 53  andard_name", SS
127a0 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e 64 61 72  L_CIPHER_standar
127b0 64 5f 6e 61 6d 65 28 63 69 70 68 65 72 29 2c 20  d_name(cipher), 
127c0 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53  -1);.../* OpenSS
127d0 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72  L name of cipher
127e0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
127f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12800 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c   "openssl_name",
12810 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68 65 72 5f   OPENSSL_cipher_
12820 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48 45 52 5f  name(SSL_CIPHER_
12830 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 28 63 69  standard_name(ci
12840 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f  pher)), -1);.../
12850 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73 65 63 72  * number of secr
12860 65 74 20 62 69 74 73 20 75 73 65 64 20 66 6f 72  et bits used for
12870 20 63 69 70 68 65 72 20 2a 2f 0a 09 62 69 74 73   cipher */..bits
12880 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65   = SSL_CIPHER_ge
12890 74 5f 62 69 74 73 28 63 69 70 68 65 72 2c 20 26  t_bits(cipher, &
128a0 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c 41 50 50  alg_bits);..LAPP
128b0 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
128c0 6f 62 6a 50 74 72 2c 20 22 73 65 63 72 65 74 5f  objPtr, "secret_
128d0 62 69 74 73 22 2c 20 62 69 74 73 29 3b 0a 09 4c  bits", bits);..L
128e0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
128f0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 67 6f  p, objPtr, "algo
12900 72 69 74 68 6d 5f 62 69 74 73 22 2c 20 61 6c 67  rithm_bits", alg
12910 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f  _bits);../* alg_
12920 62 69 74 73 20 69 73 20 61 63 74 75 61 6c 20 6b  bits is actual k
12930 65 79 20 73 65 63 72 65 74 20 62 69 74 73 2e 20  ey secret bits. 
12940 49 66 20 75 73 65 20 62 69 74 73 20 61 6e 64 20  If use bits and 
12950 73 65 63 72 65 74 20 28 61 6c 67 6f 72 69 74 68  secret (algorith
12960 6d 29 20 62 69 74 73 20 64 69 66 66 65 72 2c 0a  m) bits differ,.
12970 09 20 20 20 74 68 65 20 72 65 73 74 20 6f 66 20  .   the rest of 
12980 74 68 65 20 62 69 74 73 20 61 72 65 20 66 69 78  the bits are fix
12990 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20 6c 69 6d  ed, i.e. for lim
129a0 69 74 65 64 20 65 78 70 6f 72 74 20 63 69 70 68  ited export ciph
129b0 65 72 73 20 28 62 69 74 73 20 3c 20 35 36 29 20  ers (bits < 56) 
129c0 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63 61 74 65  */.../* Indicate
129d0 73 20 77 68 69 63 68 20 53 53 4c 2f 54 4c 53 20  s which SSL/TLS 
129e0 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
129f0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 74   first defined t
12a00 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41  he cipher */..LA
12a10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12a20 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69 6e 5f 76  , objPtr, "min_v
12a30 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f 43 49 50  ersion", SSL_CIP
12a40 48 45 52 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  HER_get_version(
12a50 63 69 70 68 65 72 29 2c 20 2d 31 29 3b 0a 0a 09  cipher), -1);...
12a60 2f 2a 20 43 69 70 68 65 72 20 4e 49 44 20 2a 2f  /* Cipher NID */
12a70 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
12a80 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12a90 69 70 68 65 72 4e 49 44 22 2c 20 28 63 68 61 72  ipherNID", (char
12aa0 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53   *)OBJ_nid2ln(SS
12ab0 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 63 69 70  L_CIPHER_get_cip
12ac0 68 65 72 5f 6e 69 64 28 63 69 70 68 65 72 29 29  her_nid(cipher))
12ad0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
12ae0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12af0 74 72 2c 20 22 64 69 67 65 73 74 4e 49 44 22 2c  tr, "digestNID",
12b00 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64   (char *)OBJ_nid
12b10 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67  2ln(SSL_CIPHER_g
12b20 65 74 5f 64 69 67 65 73 74 5f 6e 69 64 28 63 69  et_digest_nid(ci
12b30 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41  pher)), -1);..LA
12b40 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12b50 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65 79 45 78  , objPtr, "keyEx
12b60 63 68 61 6e 67 65 4e 49 44 22 2c 20 28 63 68 61  changeNID", (cha
12b70 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53  r *)OBJ_nid2ln(S
12b80 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6b 78  SL_CIPHER_get_kx
12b90 5f 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d  _nid(cipher)), -
12ba0 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  1);..LAPPEND_STR
12bb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12bc0 20 22 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   "authentication
12bd0 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42  NID", (char *)OB
12be0 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50  J_nid2ln(SSL_CIP
12bf0 48 45 52 5f 67 65 74 5f 61 75 74 68 5f 6e 69 64  HER_get_auth_nid
12c00 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12c10 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20 61 75 74  ../* message aut
12c20 68 65 6e 74 69 63 61 74 69 6f 6e 20 63 6f 64 65  hentication code
12c30 20 2d 20 43 69 70 68 65 72 20 69 73 20 41 45 41   - Cipher is AEA
12c40 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f 72 20 43  D (e.g. GCM or C
12c50 68 61 43 68 61 32 30 2f 50 6f 6c 79 31 33 30 35  haCha20/Poly1305
12c60 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20  ) or not */../* 
12c70 41 75 74 68 65 6e 74 69 63 61 74 65 64 20 45 6e  Authenticated En
12c80 63 72 79 70 74 69 6f 6e 20 77 69 74 68 20 61 73  cryption with as
12c90 73 6f 63 69 61 74 65 64 20 64 61 74 61 20 28 41  sociated data (A
12ca0 45 41 44 29 20 63 68 65 63 6b 20 2a 2f 0a 09 4c  EAD) check */..L
12cb0 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12cc0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
12cd0 68 65 72 5f 69 73 5f 61 65 61 64 22 2c 20 53 53  her_is_aead", SS
12ce0 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61 65 61 64  L_CIPHER_is_aead
12cf0 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20  (cipher));.../* 
12d00 44 69 67 65 73 74 20 75 73 65 64 20 64 75 72 69  Digest used duri
12d10 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c 53 20 68  ng the SSL/TLS h
12d20 61 6e 64 73 68 61 6b 65 20 77 68 65 6e 20 75 73  andshake when us
12d30 69 6e 67 20 74 68 65 20 63 69 70 68 65 72 2e 20  ing the cipher. 
12d40 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f 43 49 50  */..md = SSL_CIP
12d50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73 68 61 6b  HER_get_handshak
12d60 65 5f 64 69 67 65 73 74 28 63 69 70 68 65 72 29  e_digest(cipher)
12d70 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
12d80 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12d90 68 61 6e 64 73 68 61 6b 65 5f 64 69 67 65 73 74  handshake_digest
12da0 22 2c 20 28 63 68 61 72 20 2a 29 45 56 50 5f 4d  ", (char *)EVP_M
12db0 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d 31 29 3b  D_name(md), -1);
12dc0 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65 6e 53 53  .../* Get OpenSS
12dd0 4c 2d 73 70 65 63 69 66 69 63 20 49 44 2c 20 6e  L-specific ID, n
12de0 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f 0a 09 4c  ot IANA ID */..L
12df0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12e00 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68  p, objPtr, "ciph
12e10 65 72 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53  er_id", (int) SS
12e20 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 69 64 28  L_CIPHER_get_id(
12e30 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 54  cipher));.../* T
12e40 77 6f 2d 62 79 74 65 20 49 44 20 75 73 65 64 20  wo-byte ID used 
12e50 69 6e 20 74 68 65 20 54 4c 53 20 70 72 6f 74 6f  in the TLS proto
12e60 63 6f 6c 20 6f 66 20 74 68 65 20 67 69 76 65 6e  col of the given
12e70 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50   cipher */..LAPP
12e80 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20  END_INT(interp, 
12e90 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f  objPtr, "protoco
12ea0 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20 53 53 4c  l_id", (int) SSL
12eb0 5f 43 49 50 48 45 52 5f 67 65 74 5f 70 72 6f 74  _CIPHER_get_prot
12ec0 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65 72 29 29  ocol_id(cipher))
12ed0 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61 6c 20 64  ;.../* Textual d
12ee0 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
12ef0 65 20 63 69 70 68 65 72 20 2a 2f 0a 09 69 66 20  e cipher */..if 
12f00 28 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63  (SSL_CIPHER_desc
12f10 72 69 70 74 69 6f 6e 28 63 69 70 68 65 72 2c 20  ription(cipher, 
12f20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62 75 66 29  buf, sizeof(buf)
12f30 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  ) != NULL) {..  
12f40 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
12f50 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64  terp, objPtr, "d
12f60 65 73 63 72 69 70 74 69 6f 6e 22 2c 20 62 75 66  escription", buf
12f70 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  , -1);..}.    }.
12f80 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20  .    /* Session 
12f90 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73 65 73 73  info */.    sess
12fa0 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 73 65  ion = SSL_get_se
12fb0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20 20 20 20  ssion(ssl);.    
12fc0 69 66 20 28 73 65 73 73 69 6f 6e 20 21 3d 20 4e  if (session != N
12fd0 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e  ULL) {..const un
12fe0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 69 63  signed char *tic
12ff0 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20 6c 65 6e  ket;..size_t len
13000 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  2;..unsigned int
13010 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e   ulen;..const un
13020 73 69 67 6e 65 64 20 63 68 61 72 20 2a 73 65 73  signed char *ses
13030 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b  sion_id, *proto;
13040 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  ..unsigned char 
13050 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d  buffer[SSL_MAX_M
13060 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48  ASTER_KEY_LENGTH
13070 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  ];.../* Report t
13080 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
13090 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
130a0 20 6f 66 20 74 68 65 20 41 4c 50 4e 20 6e 65 67   of the ALPN neg
130b0 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c  otiation */..SSL
130c0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 61 6c  _SESSION_get0_al
130d0 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 65 73 73  pn_selected(sess
130e0 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65  ion, &proto, &le
130f0 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  n2);..LAPPEND_ST
13100 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13110 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20  , "alpn", (char 
13120 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53  *) proto, (Tcl_S
13130 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a  ize) len2);.../*
13140 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
13150 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
13160 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
13170 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74 69 6f 6e   NPN negotiation
13180 20 2a 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e   */.#ifdef USE_N
13190 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f 6e 65 78  PN..SSL_get0_nex
131a0 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74 69 61 74  t_proto_negotiat
131b0 65 64 28 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20  ed(ssl, &proto, 
131c0 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44  &ulen);..LAPPEND
131d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
131e0 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28 63 68 61  Ptr, "npn", (cha
131f0 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63 6c  r *) proto, (Tcl
13200 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 23 65  _Size) ulen);.#e
13210 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73 75 6d 61  ndif.../* Resuma
13220 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 09  ble session */..
13230 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
13240 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 72 65  erp, objPtr, "re
13250 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c 5f 53 45  sumable", SSL_SE
13260 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75 6d 61 62  SSION_is_resumab
13270 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  le(session));...
13280 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74 61 72 74  /* Session start
13290 20 74 69 6d 65 20 28 73 65 63 6f 6e 64 73 20 73   time (seconds s
132a0 69 6e 63 65 20 65 70 6f 63 68 29 20 2a 2f 0a 09  ince epoch) */..
132b0 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74  LAPPEND_LONG(int
132c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
132d0 61 72 74 5f 74 69 6d 65 22 2c 20 53 53 4c 5f 53  art_time", SSL_S
132e0 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 28  ESSION_get_time(
132f0 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20  session));.../* 
13300 54 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 2d 20  Timeout value - 
13310 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74 69 6d 65  SSL_CTX_get_time
13320 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  out (in seconds)
13330 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
13340 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
13350 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20 53 53 4c  , "timeout", SSL
13360 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69 6d  _SESSION_get_tim
13370 65 6f 75 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a  eout(session));.
13380 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20  ../* Session id 
13390 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64 20 62 65  - TLSv1.2 and be
133a0 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73  low only */..ses
133b0 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45  sion_id = SSL_SE
133c0 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73  SSION_get_id(ses
133d0 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  sion, &ulen);..L
133e0 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e  APPEND_BARRAY(in
133f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
13400 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73  ession_id", sess
13410 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
13420 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
13430 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78 74 20 2a  ession context *
13440 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20  /..session_id = 
13450 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
13460 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73 65 73 73  _id_context(sess
13470 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41  ion, &ulen);..LA
13480 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
13490 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65  erp, objPtr, "se
134a0 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74 22 2c 20  ssion_context", 
134b0 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c  session_id, (Tcl
134c0 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09  _Size) ulen);...
134d0 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
134e0 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e 6c 79 20  t - client only 
134f0 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  */..SSL_SESSION_
13500 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73 73  get0_ticket(sess
13510 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
13520 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
13530 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
13540 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 74  jPtr, "session_t
13550 69 63 6b 65 74 22 2c 20 74 69 63 6b 65 74 2c 20  icket", ticket, 
13560 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
13570 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74  ;.../* Session t
13580 69 63 6b 65 74 20 6c 69 66 65 74 69 6d 65 20 68  icket lifetime h
13590 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e 64 73 29  int (in seconds)
135a0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e   */..LAPPEND_LON
135b0 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  G(interp, objPtr
135c0 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c 20 53 53  , "lifetime", SS
135d0 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
135e0 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68 69  cket_lifetime_hi
135f0 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  nt(session));...
13600 2f 2a 20 54 69 63 6b 65 74 20 61 70 70 20 64 61  /* Ticket app da
13610 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53  ta */.#if OPENSS
13620 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
13630 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
13640 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
13650 5f 74 69 63 6b 65 74 5f 61 70 70 64 61 74 61 28  _ticket_appdata(
13660 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 29 20  (SSL_SESSION *) 
13670 73 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74  session, &ticket
13680 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45  , &len2);..LAPPE
13690 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
136a0 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69 63 6b 65  , objPtr, "ticke
136b0 74 5f 61 70 70 5f 64 61 74 61 22 2c 20 74 69 63  t_app_data", tic
136c0 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ket, (Tcl_Size) 
136d0 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66 0a 0a 09  len2);.#endif...
136e0 2f 2a 20 47 65 74 20 6d 61 73 74 65 72 20 6b 65  /* Get master ke
136f0 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20 53 53 4c  y */..len2 = SSL
13700 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 6d 61 73  _SESSION_get_mas
13710 74 65 72 5f 6b 65 79 28 73 65 73 73 69 6f 6e 2c  ter_key(session,
13720 20 62 75 66 66 65 72 2c 20 53 53 4c 5f 4d 41 58   buffer, SSL_MAX
13730 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e 47  _MASTER_KEY_LENG
13740 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41  TH);..LAPPEND_BA
13750 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a  RRAY(interp, obj
13760 50 74 72 2c 20 22 6d 61 73 74 65 72 5f 6b 65 79  Ptr, "master_key
13770 22 2c 20 62 75 66 66 65 72 2c 20 28 54 63 6c 5f  ", buffer, (Tcl_
13780 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f  Size) len2);.../
13790 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e 20 69 64  * Compression id
137a0 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e   */..unsigned in
137b0 74 20 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49  t id = SSL_SESSI
137c0 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65 73 73 5f  ON_get_compress_
137d0 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a 09 4c 41  id(session);..LA
137e0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
137f0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
13800 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69 64 20 3d  ession_id", id =
13810 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20 3a 20 22  = 1 ? "zlib" : "
13820 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  none", -1);.    
13830 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 72 65  }..    /* Compre
13840 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20  ssion info */.  
13850 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
13860 4c 29 20 7b 0a 23 69 66 64 65 66 20 48 41 56 45  L) {.#ifdef HAVE
13870 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53 49 4f 4e  _SSL_COMPRESSION
13880 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f 4d 45 54  ..const COMP_MET
13890 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e  HOD *comp, *expn
138a0 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c 5f 67 65  ;..comp = SSL_ge
138b0 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d 70 72 65  t_current_compre
138c0 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09 65 78 70  ssion(ssl);..exp
138d0 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75 72 72  n = SSL_get_curr
138e0 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e 28 73 73  ent_expansion(ss
138f0 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44 5f 53 54  l);...LAPPEND_ST
13900 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
13910 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f 6e 22 2c  , "compression",
13920 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43 4f 4d 50   comp ? SSL_COMP
13930 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d 70 29 20  _get_name(comp) 
13940 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09  : "none", -1);..
13950 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
13960 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 65 78 70  rp, objPtr, "exp
13970 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e 20 3f 20  ansion", expn ? 
13980 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d  SSL_COMP_get_nam
13990 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f 6e 65 22  e(expn) : "none"
139a0 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a 09 4c 41  , -1);.#else..LA
139b0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
139c0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f 6d 70 72  , objPtr, "compr
139d0 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c  ession", "none",
139e0 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53   -1);..LAPPEND_S
139f0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
13a00 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e 22 2c 20  r, "expansion", 
13a10 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6e  "none", -1);.#en
13a20 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  dif.    }..    /
13a30 2a 20 53 65 72 76 65 72 20 69 6e 66 6f 20 2a 2f  * Server info */
13a40 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64  .    {..long mod
13a50 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f  e = SSL_CTX_get_
13a60 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
13a70 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
13a80 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67 3b 0a 0a  );..char *msg;..
13a90 09 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f  .if (mode & SSL_
13aa0 53 45 53 53 5f 43 41 43 48 45 5f 4f 46 46 29 20  SESS_CACHE_OFF) 
13ab0 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 6f 66  {..    msg = "of
13ac0 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28  f";..} else if (
13ad0 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f  mode & SSL_SESS_
13ae0 43 41 43 48 45 5f 43 4c 49 45 4e 54 29 20 7b 0a  CACHE_CLIENT) {.
13af0 09 20 20 20 20 6d 73 67 20 3d 20 22 63 6c 69 65  .    msg = "clie
13b00 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  nt";..} else if 
13b10 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
13b20 5f 43 41 43 48 45 5f 53 45 52 56 45 52 29 20 7b  _CACHE_SERVER) {
13b30 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 73 65 72  ..    msg = "ser
13b40 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65 20 69 66  ver";..} else if
13b50 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53   (mode & SSL_SES
13b60 53 5f 43 41 43 48 45 5f 42 4f 54 48 29 20 7b 0a  S_CACHE_BOTH) {.
13b70 09 20 20 20 20 6d 73 67 20 3d 20 22 62 6f 74 68  .    msg = "both
13b80 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  ";..} else {..  
13b90 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e    msg = "unknown
13ba0 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 53  ";..}..LAPPEND_S
13bb0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
13bc0 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63 61 63 68  r, "session_cach
13bd0 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c 20 2d 31  e_mode", msg, -1
13be0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
13bf0 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20 20 20 20   CA List */.    
13c00 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73 65 72 76  /* IF not a serv
13c10 65 72 2c 20 73 61 6d 65 20 61 73 20 53 53 4c 5f  er, same as SSL_
13c20 67 65 74 30 5f 70 65 65 72 5f 43 41 5f 6c 69 73  get0_peer_CA_lis
13c30 74 2e 20 49 66 20 73 65 72 76 65 72 20 73 61 6d  t. If server sam
13c40 65 20 61 73 20 53 53 4c 5f 43 54 58 5f 67 65 74  e as SSL_CTX_get
13c50 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 20  _client_CA_list 
13c60 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74 72 20 3d  */.    listPtr =
13c70 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
13c80 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 53 54  0, NULL);.    ST
13c90 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e 41 4d 45  ACK_OF(X509_NAME
13ca0 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20 20 20 20  ) *ca_list;.    
13cb0 69 66 20 28 28 63 61 5f 6c 69 73 74 20 3d 20 53  if ((ca_list = S
13cc0 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41  SL_get_client_CA
13cd0 5f 6c 69 73 74 28 73 73 6c 29 29 20 21 3d 20 4e  _list(ssl)) != N
13ce0 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66  ULL) {..char buf
13cf0 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a 09 66 6f  fer[BUFSIZ];..fo
13d00 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
13d10 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e  < sk_X509_NAME_n
13d20 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20 69 2b 2b  um(ca_list); i++
13d30 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f 4e 41  ) {..    X509_NA
13d40 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b 5f 58 35  ME *name = sk_X5
13d50 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65 28 63 61  09_NAME_value(ca
13d60 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20 20 20 20  _list, i);..    
13d70 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09 09 58 35  if (name) {...X5
13d80 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28  09_NAME_oneline(
13d90 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c 20 42 55  name, buffer, BU
13da0 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f 4c 69 73  FSIZ);...Tcl_Lis
13db0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
13dc0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
13dd0 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
13de0 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d 31 29 29  Obj(buffer, -1))
13df0 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20  ;..    }..}.    
13e00 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 4f 42  }.    LAPPEND_OB
13e10 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  J(interp, objPtr
13e20 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c 69 73 74  , "caList", list
13e30 50 74 72 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  Ptr);.    LAPPEN
13e40 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
13e50 6a 50 74 72 2c 20 22 63 61 4c 69 73 74 43 6f 75  jPtr, "caListCou
13e60 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d  nt", sk_X509_NAM
13e70 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 29 3b  E_num(ca_list));
13e80 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
13e90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
13ea0 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
13eb0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
13ec0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
13ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f00 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65  -------. *. * Ve
13f10 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72  rsionObjCmd -- r
13f20 65 74 75 72 6e 20 76 65 72 73 69 6f 6e 20 73 74  eturn version st
13f30 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65 6e 53 53  ring from OpenSS
13f40 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
13f50 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
13f60 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
13f70 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
13f80 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
13f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fd0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
13fe0 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 28 43  .VersionObjCmd(C
13ff0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
14000 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
14010 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
14020 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
14030 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
14040 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72   Tcl_Obj *objPtr
14050 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
14060 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 28 76 6f  entData;.    (vo
14070 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20 20 28 76  id) objc;.    (v
14080 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20 20 20 20  oid) objv;..    
14090 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
140a0 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d  );..    objPtr =
140b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
140c0 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  j(OPENSSL_VERSIO
140d0 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a 20 20 20  N_TEXT, -1);.   
140e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
140f0 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
14100 29 3b 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
14110 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
14120 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14130 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14140 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14160 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73 63 4f 62  ---. *. * MiscOb
14170 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20 63 6f 6d  jCmd -- misc com
14180 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 73 75  mands. *. * Resu
14190 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
141a0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
141b0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
141c0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
141d0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14210 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
14220 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d 64 28 43  int.MiscObjCmd(C
14230 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
14240 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
14250 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
14260 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
14270 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
14280 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
14290 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20  ar *commands [] 
142a0 3d 20 7b 20 22 72 65 71 22 2c 20 22 73 74 72 72  = { "req", "strr
142b0 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20  eq", NULL };.   
142c0 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20   enum command { 
142d0 43 5f 52 45 51 2c 20 43 5f 53 54 52 52 45 51 2c  C_REQ, C_STRREQ,
142e0 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20 20 20 20   C_DUMMY };.    
142f0 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b 0a 20 20  Tcl_Size cmd;.  
14300 20 20 69 6e 74 20 69 73 53 74 72 3b 0a 20 20 20    int isStr;.   
14310 20 63 68 61 72 20 62 75 66 66 65 72 5b 31 36 33   char buffer[163
14320 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  84];.    (void) 
14330 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
14340 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
14350 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
14360 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
14370 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
14380 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 73 75 62  p, 1, objv, "sub
14390 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73 3f 22 29  command ?args?")
143a0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
143b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
143c0 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46  f (Tcl_GetIndexF
143d0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
143e0 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73  bjv[1], commands
143f0 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20  , "command", 0, 
14400 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  &cmd) != TCL_OK)
14410 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
14420 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
14430 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72   ERR_clear_error
14440 28 29 3b 0a 0a 20 20 20 20 69 73 53 74 72 20 3d  ();..    isStr =
14450 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54 52 52 45   (cmd == C_STRRE
14460 51 29 3b 0a 20 20 20 20 73 77 69 74 63 68 20 28  Q);.    switch (
14470 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64 29 20 63  (enum command) c
14480 6d 64 29 20 7b 0a 09 63 61 73 65 20 43 5f 52 45  md) {..case C_RE
14490 51 3a 0a 09 63 61 73 65 20 43 5f 53 54 52 52 45  Q:..case C_STRRE
144a0 51 3a 20 7b 0a 09 20 20 20 20 45 56 50 5f 50 4b  Q: {..    EVP_PK
144b0 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09  EY *pkey=NULL;..
144c0 20 20 20 20 58 35 30 39 20 2a 63 65 72 74 3d 4e      X509 *cert=N
144d0 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30 39 5f 4e  ULL;..    X509_N
144e0 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a  AME *name=NULL;.
144f0 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c  .    Tcl_Obj **l
14500 69 73 74 76 3b 0a 09 20 20 20 20 54 63 6c 5f 53  istv;..    Tcl_S
14510 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20 20 20 20  ize listc;..    
14520 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20 42 49 4f  int i;...    BIO
14530 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20   *out=NULL;...  
14540 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a    char *k_C="",*
14550 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c  k_ST="",*k_L="",
14560 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22  *k_O="",*k_OU=""
14570 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61  ,*k_CN="",*k_Ema
14580 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63 68 61 72  il="";..    char
14590 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d 6f 75 74   *keyout,*pemout
145a0 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69 6e 74 20  ,*str;..    int 
145b0 6b 65 79 73 69 7a 65 2c 73 65 72 69 61 6c 3d 30  keysize,serial=0
145c0 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23 69 66 20  ,days=365;..#if 
145d0 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
145e0 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30  NUMBER < 0x30000
145f0 30 30 30 4c 0a 09 20 20 20 20 42 49 47 4e 55 4d  000L..    BIGNUM
14600 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20   *bne = NULL;.. 
14610 20 20 20 52 53 41 20 2a 72 73 61 20 3d 20 4e 55     RSA *rsa = NU
14620 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 45  LL;.#else..    E
14630 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a 63 74 78  VP_PKEY_CTX *ctx
14640 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a   = NULL;.#endif.
14650 0a 09 20 20 20 20 69 66 20 28 28 6f 62 6a 63 3c  ..    if ((objc<
14660 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36 29 29 20  5) || (objc>6)) 
14670 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d  {...Tcl_WrongNum
14680 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
14690 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a 65 20 6b  objv, "keysize k
146a0 65 79 66 69 6c 65 20 63 65 72 74 66 69 6c 65 20  eyfile certfile 
146b0 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72 65 74 75  ?info?");...retu
146c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20  rn TCL_ERROR;.. 
146d0 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 54     }...    if (T
146e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
146f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
14700 2c 20 26 6b 65 79 73 69 7a 65 29 20 21 3d 20 54  , &keysize) != T
14710 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 74 75 72  CL_OK) {...retur
14720 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
14730 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f 75 74 3d    }..    keyout=
14740 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14750 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20 70 65 6d  jv[3]);..    pem
14760 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  out=Tcl_GetStrin
14770 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09 20 20 20  g(objv[4]);..   
14780 20 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09   if (isStr) {...
14790 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72  Tcl_SetVar(inter
147a0 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30 29 3b 0a  p,keyout,"",0);.
147b0 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74  ..Tcl_SetVar(int
147c0 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22 2c 30 29  erp,pemout,"",0)
147d0 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
147e0 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b 0a 09 09  f (objc>=6) {...
147f0 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47  if (Tcl_ListObjG
14800 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
14810 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 6c 69 73  p, objv[5], &lis
14820 74 63 2c 20 26 6c 69 73 74 76 29 20 21 3d 20 54  tc, &listv) != T
14830 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20 20 20 72  CL_OK) {...    r
14840 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14850 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28 6c 69 73  ...}....if ((lis
14860 74 63 25 32 29 20 21 3d 20 30 29 20 7b 0a 09 09  tc%2) != 0) {...
14870 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
14880 74 28 69 6e 74 65 72 70 2c 22 49 6e 66 6f 72 6d  t(interp,"Inform
14890 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20  ation list must 
148a0 68 61 76 65 20 65 76 65 6e 20 6e 75 6d 62 65 72  have even number
148b0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 22 2c 4e   of arguments",N
148c0 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
148d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
148e0 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b 20 69 3c  }...for (i=0; i<
148f0 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20 7b 0a 09  listc; i+=2) {..
14900 09 20 20 20 20 73 74 72 3d 54 63 6c 5f 47 65 74  .    str=Tcl_Get
14910 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 5d 29  String(listv[i])
14920 3b 0a 09 09 20 20 20 20 69 66 20 28 73 74 72 63  ;...    if (strc
14930 6d 70 28 73 74 72 2c 22 64 61 79 73 22 29 3d 3d  mp(str,"days")==
14940 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
14950 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
14960 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
14970 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a  &days)!=TCL_OK).
14980 09 09 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ...    return TC
14990 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d  L_ERROR;...    }
149a0 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70   else if (strcmp
149b0 28 73 74 72 2c 22 73 65 72 69 61 6c 22 29 3d 3d  (str,"serial")==
149c0 30 29 20 7b 0a 09 09 09 69 66 20 28 54 63 6c 5f  0) {....if (Tcl_
149d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
149e0 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c  terp,listv[i+1],
149f0 26 73 65 72 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b  &serial)!=TCL_OK
14a00 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e 20  )....    return 
14a10 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
14a20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14a30 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d 30 29 20  mp(str,"C")==0) 
14a40 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f 47 65 74  {....k_C=Tcl_Get
14a50 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14a60 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14a70 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14a80 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "ST")==0) {....k
14a90 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _ST=Tcl_GetStrin
14aa0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
14ab0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14ac0 73 74 72 63 6d 70 28 73 74 72 2c 22 4c 22 29 3d  strcmp(str,"L")=
14ad0 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c  =0) {....k_L=Tcl
14ae0 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
14af0 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
14b00 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
14b10 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20 7b 0a 09  str,"O")==0) {..
14b20 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74 53 74 72  ..k_O=Tcl_GetStr
14b30 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b  ing(listv[i+1]);
14b40 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66  ...    } else if
14b50 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4f 55   (strcmp(str,"OU
14b60 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4f 55  ")==0) {....k_OU
14b70 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c  =Tcl_GetString(l
14b80 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20  istv[i+1]);...  
14b90 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
14ba0 63 6d 70 28 73 74 72 2c 22 43 4e 22 29 3d 3d 30  cmp(str,"CN")==0
14bb0 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f  ) {....k_CN=Tcl_
14bc0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14bd0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14be0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14bf0 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d 30 29 20  tr,"Email")==0) 
14c00 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c  {....k_Email=Tcl
14c10 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
14c20 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
14c30 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 53 65  else {....Tcl_Se
14c40 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
14c50 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d 65 74 65  Unknown paramete
14c60 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09 72 65 74  r",NULL);....ret
14c70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
14c80 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20 20 20 20  .    }...}..    
14c90 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  }..#if OPENSSL_V
14ca0 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
14cb0 30 78 33 30 30 30 30 30 30 30 4c 0a 09 20 20 20  0x30000000L..   
14cc0 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77 28 29 3b   bne = BN_new();
14cd0 0a 09 20 20 20 20 72 73 61 20 3d 20 52 53 41 5f  ..    rsa = RSA_
14ce0 6e 65 77 28 29 3b 0a 09 20 20 20 20 70 6b 65 79  new();..    pkey
14cf0 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e 65 77 28   = EVP_PKEY_new(
14d00 29 3b 0a 09 20 20 20 20 69 66 20 28 62 6e 65 20  );..    if (bne 
14d10 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73 61 20 3d  == NULL || rsa =
14d20 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d  = NULL || pkey =
14d30 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65  = NULL || !BN_se
14d40 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53 41 5f 46  t_word(bne,RSA_F
14d50 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f 67 65 6e  4) ||...!RSA_gen
14d60 65 72 61 74 65 5f 6b 65 79 5f 65 78 28 72 73 61  erate_key_ex(rsa
14d70 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e 65 2c 20  , keysize, bne, 
14d80 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50 5f 50 4b  NULL) || !EVP_PK
14d90 45 59 5f 61 73 73 69 67 6e 5f 52 53 41 28 70 6b  EY_assign_RSA(pk
14da0 65 79 2c 20 72 73 61 29 29 20 7b 0a 09 09 45 56  ey, rsa)) {...EV
14db0 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79  P_PKEY_free(pkey
14dc0 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66 72 65 65  );.../* RSA_free
14dd0 28 72 73 61 29 3b 20 66 72 65 65 64 20 62 79 20  (rsa); freed by 
14de0 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 20 2a 2f  EVP_PKEY_free */
14df0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
14e00 0a 23 65 6c 73 65 0a 09 20 20 20 20 70 6b 65 79  .#else..    pkey
14e10 20 3d 20 45 56 50 5f 52 53 41 5f 67 65 6e 28 28   = EVP_RSA_gen((
14e20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 20 6b 65  unsigned int) ke
14e30 79 73 69 7a 65 29 3b 0a 09 20 20 20 20 63 74 78  ysize);..    ctx
14e40 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f   = EVP_PKEY_CTX_
14e50 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a  new(pkey,NULL);.
14e60 09 20 20 20 20 69 66 20 28 70 6b 65 79 20 3d 3d  .    if (pkey ==
14e70 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20 3d 3d 20   NULL || ctx == 
14e80 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f 50 4b 45  NULL || !EVP_PKE
14e90 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74 28 63 74  Y_keygen_init(ct
14ea0 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f 50 4b 45  x) ||...!EVP_PKE
14eb0 59 5f 43 54 58 5f 73 65 74 5f 72 73 61 5f 6b 65  Y_CTX_set_rsa_ke
14ec0 79 67 65 6e 5f 62 69 74 73 28 63 74 78 2c 20 6b  ygen_bits(ctx, k
14ed0 65 79 73 69 7a 65 29 20 7c 7c 20 21 45 56 50 5f  eysize) || !EVP_
14ee0 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63 74 78 2c  PKEY_keygen(ctx,
14ef0 20 26 70 6b 65 79 29 29 20 7b 0a 09 09 45 56 50   &pkey)) {...EVP
14f00 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
14f10 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f 43 54 58  ;...EVP_PKEY_CTX
14f20 5f 66 72 65 65 28 63 74 78 29 3b 0a 23 65 6e 64  _free(ctx);.#end
14f30 69 66 0a 09 09 54 63 6c 5f 53 65 74 52 65 73 75  if...Tcl_SetResu
14f40 6c 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72  lt(interp,"Error
14f50 20 67 65 6e 65 72 61 74 69 6e 67 20 70 72 69 76   generating priv
14f60 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a  ate key",NULL);.
14f70 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
14f80 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  OR;..    } else 
14f90 7b 0a 09 09 69 66 20 28 69 73 53 74 72 29 20 7b  {...if (isStr) {
14fa0 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e  ...    out=BIO_n
14fb0 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b  ew(BIO_s_mem());
14fc0 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65  ...    PEM_write
14fd0 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28  _bio_PrivateKey(
14fe0 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55  out,pkey,NULL,NU
14ff0 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b  LL,0,NULL,NULL);
15000 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65 61  ...    i=BIO_rea
15010 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69 7a  d(out,buffer,siz
15020 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b 0a  eof(buffer)-1);.
15030 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f 20  ..    i=(i<0) ? 
15040 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75 66  0 : i;...    buf
15050 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09 20  fer[i]='\0';... 
15060 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
15070 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62 75 66 66  terp,keyout,buff
15080 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49 4f  er,0);...    BIO
15090 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09 20  _flush(out);... 
150a0 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74 29     BIO_free(out)
150b0 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  ;...} else {... 
150c0 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
150d0 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09 09  IO_s_file());...
150e0 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66 69      BIO_write_fi
150f0 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65 79 6f 75  lename(out,keyou
15100 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  t);...    PEM_wr
15110 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
15120 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
15130 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
15140 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20 50 45 4d  L);...    /* PEM
15150 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53 41 50 72  _write_bio_RSAPr
15160 69 76 61 74 65 4b 65 79 28 6f 75 74 2c 20 72 73  ivateKey(out, rs
15170 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30  a, NULL, NULL, 0
15180 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a  , NULL, NULL); *
15190 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  /...    BIO_free
151a0 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20 09 7d 0a  _all(out);.. .}.
151b0 0a 09 09 69 66 20 28 28 63 65 72 74 3d 58 35 30  ...if ((cert=X50
151c0 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c 4c 29 20  9_new())==NULL) 
151d0 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52  {...    Tcl_SetR
151e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
151f0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 63  ror generating c
15200 65 72 74 69 66 69 63 61 74 65 20 72 65 71 75 65  ertificate reque
15210 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20  st",NULL);...   
15220 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70   EVP_PKEY_free(p
15230 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53  key);.#if OPENSS
15240 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
15250 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
15260 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65  .    BN_free(bne
15270 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20  );.#endif...    
15280 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15290 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 73 65  ;...}....X509_se
152a0 74 5f 76 65 72 73 69 6f 6e 28 63 65 72 74 2c 32  t_version(cert,2
152b0 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54 45 47 45  );...ASN1_INTEGE
152c0 52 5f 73 65 74 28 58 35 30 39 5f 67 65 74 5f 73  R_set(X509_get_s
152d0 65 72 69 61 6c 4e 75 6d 62 65 72 28 63 65 72 74  erialNumber(cert
152e0 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09 58 35 30  ),serial);...X50
152f0 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
15300 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66 6f 72 65  9_getm_notBefore
15310 28 63 65 72 74 29 2c 30 29 3b 0a 09 09 58 35 30  (cert),0);...X50
15320 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28 58 35 30  9_gmtime_adj(X50
15330 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74 65 72 28  9_getm_notAfter(
15340 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36 30 2a 36  cert),(long)60*6
15350 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09 09 58 35  0*24*days);...X5
15360 30 39 5f 73 65 74 5f 70 75 62 6b 65 79 28 63 65  09_set_pubkey(ce
15370 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d  rt,pkey);....nam
15380 65 3d 58 35 30 39 5f 67 65 74 5f 73 75 62 6a 65  e=X509_get_subje
15390 63 74 5f 6e 61 6d 65 28 63 65 72 74 29 3b 0a 0a  ct_name(cert);..
153a0 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f  ..X509_NAME_add_
153b0 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d  entry_by_txt(nam
153c0 65 2c 22 43 22 2c 20 4d 42 53 54 52 49 4e 47 5f  e,"C", MBSTRING_
153d0 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69  ASC, (const unsi
153e0 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43  gned char *) k_C
153f0 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
15400 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
15410 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
15420 22 53 54 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  "ST", MBSTRING_A
15430 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
15440 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 53 54  ned char *) k_ST
15450 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09  , -1, -1, 0);...
15460 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e  X509_NAME_add_en
15470 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c  try_by_txt(name,
15480 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  "L", MBSTRING_AS
15490 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
154a0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4c 2c 20  ed char *) k_L, 
154b0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35  -1, -1, 0);...X5
154c0 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
154d0 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f  y_by_txt(name,"O
154e0 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
154f0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
15500 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31   char *) k_O, -1
15510 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
15520 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
15530 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 55 22  by_txt(name,"OU"
15540 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
15550 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
15560 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31  char *) k_OU, -1
15570 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
15580 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
15590 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43 4e 22  by_txt(name,"CN"
155a0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
155b0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
155c0 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31  char *) k_CN, -1
155d0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
155e0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
155f0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 45 6d 61  by_txt(name,"Ema
15600 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  il", MBSTRING_AS
15610 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
15620 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 45 6d 61  ed char *) k_Ema
15630 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a  il, -1, -1, 0);.
15640 0a 09 09 58 35 30 39 5f 73 65 74 5f 73 75 62 6a  ...X509_set_subj
15650 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 2c 6e 61  ect_name(cert,na
15660 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21 58 35 30  me);....if (!X50
15670 39 5f 73 69 67 6e 28 63 65 72 74 2c 70 6b 65 79  9_sign(cert,pkey
15680 2c 45 56 50 5f 73 68 61 32 35 36 28 29 29 29 20  ,EVP_sha256())) 
15690 7b 0a 09 09 20 20 20 20 58 35 30 39 5f 66 72 65  {...    X509_fre
156a0 65 28 63 65 72 74 29 3b 0a 09 09 20 20 20 20 45  e(cert);...    E
156b0 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65  VP_PKEY_free(pke
156c0 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  y);.#if OPENSSL_
156d0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
156e0 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20   0x30000000L... 
156f0 20 20 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b     BN_free(bne);
15700 0a 23 65 6e 64 69 66 0a 09 09 20 20 20 20 54 63  .#endif...    Tc
15710 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
15720 72 70 2c 22 45 72 72 6f 72 20 73 69 67 6e 69 6e  rp,"Error signin
15730 67 20 63 65 72 74 69 66 69 63 61 74 65 22 2c 4e  g certificate",N
15740 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72 65 74 75  ULL);...    retu
15750 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
15760 7d 0a 0a 09 09 69 66 20 28 69 73 53 74 72 29 20  }....if (isStr) 
15770 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
15780 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28 29 29  new(BIO_s_mem())
15790 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74  ;...    PEM_writ
157a0 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75 74 2c 63  e_bio_X509(out,c
157b0 65 72 74 29 3b 0a 09 09 20 20 20 20 69 3d 42 49  ert);...    i=BI
157c0 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65  O_read(out,buffe
157d0 72 2c 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29  r,sizeof(buffer)
157e0 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c  -1);...    i=(i<
157f0 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20  0) ? 0 : i;...  
15800 20 20 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27    buffer[i]='\0'
15810 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56  ;...    Tcl_SetV
15820 61 72 28 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74  ar(interp,pemout
15830 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20  ,buffer,0);...  
15840 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29    BIO_flush(out)
15850 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65  ;...    BIO_free
15860 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20  (out);...} else 
15870 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f  {...    out=BIO_
15880 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29  new(BIO_s_file()
15890 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69  );...    BIO_wri
158a0 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c  te_filename(out,
158b0 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20 20 20 50  pemout);...    P
158c0 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 58 35 30  EM_write_bio_X50
158d0 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a 09 09 20  9(out,cert);... 
158e0 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28     BIO_free_all(
158f0 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09 58 35 30  out);...}....X50
15900 39 5f 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09  9_free(cert);...
15910 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
15920 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c  ey);.#if OPENSSL
15930 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
15940 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 09  < 0x30000000L...
15950 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65  BN_free(bne);.#e
15960 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ndif..    }..}..
15970 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
15980 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  lt:..break;.    
15990 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
159a0 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a  _OK;.}.../******
159b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
159c0 2f 2a 20 49 6e 69 74 20 20 20 20 20 20 20 20 20  /* Init         
159d0 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a      */./********
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
159f0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
15a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c  -------. *. * Tl
15a40 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  s_Free --. *. *.
15a50 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  This procedure c
15a60 6c 65 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20  leans up when a 
15a70 53 53 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64  SSL socket based
15a80 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63   channel. *.is c
15a90 6c 6f 73 65 64 20 61 6e 64 20 69 74 73 20 72 65  losed and its re
15aa0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61  ference count fa
15ab0 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20 2a 0a 20  lls below 1. *. 
15ac0 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
15ad0 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
15ae0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
15af0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
15b00 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b40 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a  ------. */.void.
15b50 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f 66 72 65  Tls_Free(tls_fre
15b60 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b 50 74 72  e_type *blockPtr
15b70 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
15b80 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
15b90 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20   *)blockPtr;..  
15ba0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
15bb0 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73 5f 43 6c  d");..    Tls_Cl
15bc0 65 61 6e 28 73 74 61 74 65 50 74 72 29 3b 0a 20  ean(statePtr);. 
15bd0 20 20 20 63 6b 66 72 65 65 28 62 6c 6f 63 6b 50     ckfree(blockP
15be0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
15bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c30 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43 6c 65 61  -. *. * Tls_Clea
15c40 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  n --. *. *.This 
15c50 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
15c60 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20 73   up when a SSL s
15c70 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61 6e  ocket based chan
15c80 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65 64  nel. *.is closed
15c90 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65 6e   and its referen
15ca0 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20 62  ce count falls b
15cb0 65 6c 6f 77 20 31 2e 20 20 54 68 69 73 20 73 68  elow 1.  This sh
15cc0 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61 6c 6c 65  ould. *.be calle
15cd0 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20  d synchronously 
15ce0 62 79 20 74 68 65 20 43 6c 6f 73 65 50 72 6f 63  by the CloseProc
15cf0 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 20 2a 09  , not in the. *.
15d00 45 76 65 6e 74 75 61 6c 6c 79 46 72 65 65 20 63  EventuallyFree c
15d10 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52  allback.. *. * R
15d20 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a  esults:. *.none.
15d30 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
15d40 74 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c  ts:. *.Frees all
15d50 20 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a   the state. *. *
15d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15da0 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73  ---. */.void Tls
15db0 5f 43 6c 65 61 6e 28 53 74 61 74 65 20 2a 73 74  _Clean(State *st
15dc0 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 64 70  atePtr) {.    dp
15dd0 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
15de0 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
15df0 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53  tr->ssl) {../* S
15e00 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74 69 66 79  end close_notify
15e10 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09 64 70 72   message */..dpr
15e20 69 6e 74 66 28 22 53 53 4c 5f 73 68 75 74 64 6f  intf("SSL_shutdo
15e30 77 6e 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  wn(%p)", statePt
15e40 72 2d 3e 73 73 6c 29 3b 0a 09 2f 2a 20 57 69 6c  r->ssl);../* Wil
15e50 6c 20 72 65 74 75 72 6e 20 72 65 74 75 72 6e 20  l return return 
15e60 30 20 77 68 69 6c 65 20 73 68 75 74 64 6f 77 6e  0 while shutdown
15e70 20 69 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65   in process, the
15e80 6e 20 31 20 77 68 65 6e 20 63 6f 6d 70 6c 65 74  n 1 when complet
15e90 65 20 2a 2f 0a 09 2f 2a 20 63 6c 6f 73 65 73 20  e */../* closes 
15ea0 74 68 65 20 77 72 69 74 65 20 64 69 72 65 63 74  the write direct
15eb0 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f 6e 6e 65  ion of the conne
15ec0 63 74 69 6f 6e 3b 20 74 68 65 20 72 65 61 64 20  ction; the read 
15ed0 64 69 72 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f  direction is clo
15ee0 73 65 64 20 62 79 20 74 68 65 20 70 65 65 72 2e  sed by the peer.
15ef0 20 2a 2f 0a 09 2f 2a 20 44 6f 65 73 20 6e 6f 74   */../* Does not
15f00 20 61 66 66 65 63 74 20 73 6f 63 6b 65 74 20 2a   affect socket *
15f10 2f 0a 09 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28  /..SSL_shutdown(
15f20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
15f30 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
15f40 20 20 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d     * we're assum
15f50 69 6e 67 20 68 65 72 65 20 74 68 61 74 20 77 65  ing here that we
15f60 27 72 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61  're single-threa
15f70 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ded.     */.    
15f80 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69  if (statePtr->ti
15f90 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65  mer != (Tcl_Time
15fa0 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a  rToken) NULL) {.
15fb0 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72  .Tcl_DeleteTimer
15fc0 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72  Handler(statePtr
15fd0 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65  ->timer);..state
15fe0 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c  Ptr->timer = NUL
15ff0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  L;.    }..    /*
16000 20 52 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 6b   Remove callback
16010 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61  s */.    if (sta
16020 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
16030 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43   {..Tcl_DecrRefC
16040 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63  ount(statePtr->c
16050 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65  allback);..state
16060 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20  Ptr->callback = 
16070 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  NULL;.    }.    
16080 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61  if (statePtr->pa
16090 73 73 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44  ssword) {..Tcl_D
160a0 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
160b0 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b  ePtr->password);
160c0 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  ..statePtr->pass
160d0 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  word = NULL;.   
160e0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
160f0 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63  Ptr->vcmd) {..Tc
16100 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
16110 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a  tatePtr->vcmd);.
16120 09 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20  .statePtr->vcmd 
16130 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
16140 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
16150 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72  >protos) {..ckfr
16160 65 65 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ee(statePtr->pro
16170 74 6f 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  tos);..statePtr-
16180 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a  >protos = NULL;.
16190 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
161a0 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a  tatePtr->bio) {.
161b0 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61  ./* This will ca
161c0 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e  ll SSL_shutdown.
161d0 20 42 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a   Bug 1414045 */.
161e0 09 64 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72  .dprintf("BIO_fr
161f0 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61  ee_all(%p)", sta
16200 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49  tePtr->bio);..BI
16210 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65  O_free_all(state
16220 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74  Ptr->bio);..stat
16230 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c  ePtr->bio = NULL
16240 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  ;.    }..    if 
16250 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20  (statePtr->ssl) 
16260 7b 0a 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f  {..dprintf("SSL_
16270 66 72 65 65 28 25 70 29 22 2c 20 73 74 61 74 65  free(%p)", state
16280 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f  Ptr->ssl);..SSL_
16290 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73  free(statePtr->s
162a0 73 6c 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e  sl);..statePtr->
162b0 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ssl = NULL;.    
162c0 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
162d0 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c  Ptr->ctx) {..SSL
162e0 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50  _CTX_free(stateP
162f0 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65  tr->ctx);..state
16300 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b  Ptr->ctx = NULL;
16310 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69  .    }..    dpri
16320 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29  ntf("Returning")
16330 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
16340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16350 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16360 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16380 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e  -. *. * Build In
16390 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a  fo Command --. *
163a0 0a 20 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61  . *.Create comma
163b0 6e 64 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69  nd to return bui
163c0 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b  ld info for pack
163d0 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  age.. *. * Resul
163e0 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
163f0 64 20 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a  d Tcl result. *.
16400 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
16410 0a 20 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c  . *.Created buil
16420 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a  d-info command..
16430 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
16440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
16480 0a 23 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49  .#ifndef STRINGI
16490 46 59 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52  FY.#  define STR
164a0 49 4e 47 49 46 59 28 78 29 20 53 54 52 49 4e 47  INGIFY(x) STRING
164b0 49 46 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e  IFY1(x).#  defin
164c0 65 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 20  e STRINGIFY1(x) 
164d0 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42  #x.#endif..int.B
164e0 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28  uildInfoCommand(
164f0 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65  Tcl_Interp* inte
16500 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d  rp) {.    Tcl_Cm
16510 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20  dInfo info;..   
16520 20 69 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d   if (Tcl_GetComm
16530 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
16540 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e  "::tcl::build-in
16550 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09  fo", &info)) {..
16560 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
16570 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
16580 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22  tls::build-info"
16590 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20  , info.objProc, 
165a0 28 76 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b  (void *)(...PACK
165b0 41 47 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20  AGE_VERSION "+" 
165c0 53 54 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45  STRINGIFY(TLS_VE
165d0 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20  RSION_UUID).#if 
165e0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f  defined(__clang_
165f0 5f 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  _) && defined(__
16600 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09  clang_major__)..
16610 09 09 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20  ..    ".clang-" 
16620 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e  STRINGIFY(__clan
16630 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f  g_major__).#if _
16640 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c  _clang_minor__ <
16650 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23   10....    "0".#
16660 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52  endif....    STR
16670 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d  INGIFY(__clang_m
16680 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23  inor__).#endif.#
16690 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c  if defined(__cpl
166a0 75 73 70 6c 75 73 29 20 26 26 20 21 64 65 66 69  usplus) && !defi
166b0 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09  ned(__OBJC__)...
166c0 09 20 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73  .    ".cplusplus
166d0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
166e0 20 4e 44 45 42 55 47 0a 09 09 09 20 20 20 20 22   NDEBUG....    "
166f0 2e 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23  .debug".#endif.#
16700 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c  if !defined(__cl
16710 61 6e 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  ang__) && !defin
16720 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  ed(__INTEL_COMPI
16730 4c 45 52 29 20 26 26 20 64 65 66 69 6e 65 64 28  LER) && defined(
16740 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20  __GNUC__)....   
16750 20 22 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49   ".gcc-" STRINGI
16760 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66  FY(__GNUC__).#if
16770 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20   __GNUC_MINOR__ 
16780 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a  < 10....    "0".
16790 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54  #endif....    ST
167a0 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d  RINGIFY(__GNUC_M
167b0 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23  INOR__).#endif.#
167c0 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f  ifdef __INTEL_CO
167d0 4d 50 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e  MPILER....    ".
167e0 69 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28  icc-" STRINGIFY(
167f0 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52  __INTEL_COMPILER
16800 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
16810 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09  TCL_MEM_DEBUG...
16820 09 20 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22  .    ".memdebug"
16830 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
16840 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09  ned(_MSC_VER)...
16850 09 20 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54  .    ".msvc-" ST
16860 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52  RINGIFY(_MSC_VER
16870 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ).#endif.#ifdef 
16880 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20  USE_NMAKE....   
16890 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66   ".nmake".#endif
168a0 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47  .#ifndef TCL_CFG
168b0 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20  _OPTIMIZED....  
168c0 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22    ".no-optimize"
168d0 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
168e0 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22  _OBJC__....    "
168f0 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69  .objective-c".#i
16900 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75  f defined(__cplu
16910 73 70 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70  splus)....    "p
16920 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a  lusplus".#endif.
16930 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43  #endif.#ifdef TC
16940 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09  L_CFG_PROFILED..
16950 09 09 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22  ..    ".profile"
16960 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50  .#endif.#ifdef P
16970 55 52 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70  URIFY....    ".p
16980 75 72 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69  urify".#endif.#i
16990 66 64 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c  fdef STATIC_BUIL
169a0 44 0a 09 09 09 20 20 20 20 22 2e 73 74 61 74 69  D....    ".stati
169b0 63 22 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e  c".#endif...), N
169c0 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ULL);.    }.    
169d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
169e0 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
169f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
16a20 20 2a 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 74   *. * TlsLibShut
16a30 64 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68  down --. *. *.Sh
16a40 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61  utdown SSL libra
16a50 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
16a60 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  ication. *. * Re
16a70 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
16a80 64 61 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a  dard TCL result.
16a90 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
16aa0 74 73 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20  ts:. *.Shutdown 
16ab0 53 53 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20  SSL library. *. 
16ac0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16af0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61  -------*. */.sta
16b00 74 69 63 20 69 6e 74 20 54 6c 73 4c 69 62 53 68  tic int TlsLibSh
16b10 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74 44 61 74  utdown(ClientDat
16b20 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a  a clientData) {.
16b30 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28      BIO_cleanup(
16b40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
16b50 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d  L_OK;.}../*. *--
16b60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b90 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c  ----*. *. *.TlsL
16ba0 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  ibInit --. *. *.
16bb0 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20  Initializes SSL 
16bc0 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72  library once per
16bd0 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a   application. *.
16be0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
16bf0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
16c00 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20  sult. *. * Side 
16c10 65 66 66 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74  effects:. *.Init
16c20 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72  ializes SSL libr
16c30 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ary. *. *-------
16c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16c70 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
16c80 54 6c 73 4c 69 62 49 6e 69 74 28 29 20 7b 0a 20  TlsLibInit() {. 
16c90 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 69 6e     static int in
16ca0 69 74 69 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a  itialized = 0;..
16cb0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
16cc0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
16cd0 21 69 6e 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a  !initialized) {.
16ce0 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 42  ./* Initialize B
16cf0 4f 54 48 20 6c 69 62 63 72 79 70 74 6f 20 61 6e  OTH libcrypto an
16d00 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a 09 69 66  d libssl. */..if
16d10 20 28 21 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f   (!OPENSSL_init_
16d20 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  ssl(OPENSSL_INIT
16d30 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47  _LOAD_SSL_STRING
16d40 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54  S | OPENSSL_INIT
16d50 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f 53 54 52  _LOAD_CRYPTO_STR
16d60 49 4e 47 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e  INGS..    | OPEN
16d70 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c  SSL_INIT_ADD_ALL
16d80 5f 43 49 50 48 45 52 53 20 7c 20 4f 50 45 4e 53  _CIPHERS | OPENS
16d90 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f  SL_INIT_ADD_ALL_
16da0 44 49 47 45 53 54 53 0a 09 20 20 20 20 7c 20 4f  DIGESTS..    | O
16db0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
16dc0 5f 43 4f 4e 46 49 47 20 7c 20 4f 50 45 4e 53 53  _CONFIG | OPENSS
16dd0 4c 5f 49 4e 49 54 5f 41 53 59 4e 43 2c 20 4e 55  L_INIT_ASYNC, NU
16de0 4c 4c 29 29 20 7b 0a 09 20 20 20 20 72 65 74 75  LL)) {..    retu
16df0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
16e00 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 42 49 4f  .../* Create BIO
16e10 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a 09 42 49   handlers */..BI
16e20 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20  O_new_tcl(NULL, 
16e30 30 29 3b 0a 09 0a 09 2f 2a 20 43 72 65 61 74 65  0);..../* Create
16e40 20 65 78 69 74 20 68 61 6e 64 6c 65 72 20 2a 2f   exit handler */
16e50 0a 09 54 63 6c 5f 43 72 65 61 74 65 45 78 69 74  ..Tcl_CreateExit
16e60 48 61 6e 64 6c 65 72 28 54 6c 73 4c 69 62 53 68  Handler(TlsLibSh
16e70 75 74 64 6f 77 6e 2c 20 4e 55 4c 4c 29 3b 0a 09  utdown, NULL);..
16e80 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 31 3b  initialized = 1;
16e90 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
16ea0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
16eb0 20 49 6e 69 74 20 73 63 72 69 70 74 20 2a 2f 0a   Init script */.
16ec0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
16ed0 72 20 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69  r tlsTclInitScri
16ee0 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63 6c 75 64  pt[] = {.#includ
16ef0 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22 0a 7d 3b  e "tls.tcl.h".};
16f00 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
16f10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
16f50 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a   Tls_Init --. *.
16f60 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
16f70 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
16f80 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 2c 20 77  ion procedure, w
16f90 68 69 63 68 20 69 73 20 63 61 6c 6c 65 64 0a 20  hich is called. 
16fa0 2a 09 62 79 20 54 43 4c 20 77 68 65 6e 20 74 68  *.by TCL when th
16fb0 69 73 20 70 61 63 6b 61 67 65 20 69 73 20 74 6f  is package is to
16fc0 20 62 65 20 61 64 64 65 64 20 74 6f 20 61 6e 20   be added to an 
16fd0 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a  interpreter.. *.
16fe0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 49   * Results:. *.I
16ff0 6e 69 74 69 61 6c 69 7a 65 73 20 73 74 72 75 63  nitializes struc
17000 74 75 72 65 73 20 61 6e 64 20 63 72 65 61 74 65  tures and create
17010 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20  s commands.. *. 
17020 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
17030 20 2a 09 20 43 72 65 61 74 65 20 74 68 65 20 63   *. Create the c
17040 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d  ommands. *. *---
17050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17090 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 4c 5f 4d 41  . */..#if TCL_MA
170a0 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e 20 38 0a  JOR_VERSION > 8.
170b0 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53  #define MIN_VERS
170c0 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c 73 65 0a  ION "9.0".#else.
170d0 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56 45 52 53  #define MIN_VERS
170e0 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e 64 69 66  ION "8.5".#endif
170f0 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  ..DLLEXPORT int 
17100 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  Tls_Init(Tcl_Int
17110 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 0a  erp *interp) {..
17120 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
17130 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65 66 20 55  led");..#ifdef U
17140 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 20 20 20  SE_TCL_STUBS.   
17150 20 69 66 20 28 54 63 6c 5f 49 6e 69 74 53 74 75   if (Tcl_InitStu
17160 62 73 28 69 6e 74 65 72 70 2c 20 4d 49 4e 5f 56  bs(interp, MIN_V
17170 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55  ERSION, 0) == NU
17180 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  LL) {..return TC
17190 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23  L_ERROR;.    }.#
171a0 65 6e 64 69 66 0a 20 20 20 20 69 66 20 28 54 63  endif.    if (Tc
171b0 6c 5f 50 6b 67 52 65 71 75 69 72 65 28 69 6e 74  l_PkgRequire(int
171c0 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d 49 4e 5f  erp, "Tcl", MIN_
171d0 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e  VERSION, 0) == N
171e0 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
171f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17200 0a 20 20 20 20 69 66 20 28 54 6c 73 4c 69 62 49  .    if (TlsLibI
17210 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f 4f 4b 29  nit() != TCL_OK)
17220 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
17230 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
17240 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69 61 6c 69  uld not initiali
17250 7a 65 20 53 53 4c 20 6c 69 62 72 61 72 79 22 2c  ze SSL library",
17260 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
17270 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
17280 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
17290 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
172a0 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
172b0 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c 20 43 69  ls::ciphers", Ci
172c0 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  phersObjCmd, (Cl
172d0 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
172e0 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
172f0 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
17300 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
17310 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a  mmand(interp, ":
17320 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e  :tls::connection
17330 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66  ", ConnectionInf
17340 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  oObjCmd, (Client
17350 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
17360 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
17370 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
17380 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17390 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
173a0 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c 20 48 61  ::handshake", Ha
173b0 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64 2c 20 28  ndshakeObjCmd, (
173c0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
173d0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
173e0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
173f0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
17400 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17410 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c  "::tls::import",
17420 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28   ImportObjCmd, (
17430 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
17440 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
17450 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
17460 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
17470 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17480 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74  "::tls::unimport
17490 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d  ", UnimportObjCm
174a0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
174b0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
174c0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
174d0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
174e0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
174f0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74  rp, "::tls::unst
17500 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ack", UnimportOb
17510 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
17520 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
17530 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
17540 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
17550 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17560 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73  nterp, "::tls::s
17570 74 61 74 75 73 22 2c 20 53 74 61 74 75 73 4f 62  tatus", StatusOb
17580 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
17590 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
175a0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
175b0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
175c0 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
175d0 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76  nterp, "::tls::v
175e0 65 72 73 69 6f 6e 22 2c 20 56 65 72 73 69 6f 6e  ersion", Version
175f0 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
17600 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
17610 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
17620 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
17630 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
17640 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
17650 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f 62 6a 43  :misc", MiscObjC
17660 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
17670 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
17680 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
17690 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
176a0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
176b0 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f  erp, "::tls::pro
176c0 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74 6f 63 6f  tocols", Protoco
176d0 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  lsObjCmd, (Clien
176e0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
176f0 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
17700 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 42  *) NULL);..    B
17710 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28  uildInfoCommand(
17720 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 69 66  interp);..    if
17730 20 28 69 6e 74 65 72 70 20 26 26 20 54 63 6c 5f   (interp && Tcl_
17740 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 74 6c 73  Eval(interp, tls
17750 54 63 6c 49 6e 69 74 53 63 72 69 70 74 29 20 21  TclInitScript) !
17760 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74  = TCL_OK) {..ret
17770 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17780 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
17790 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
177a0 69 6e 74 65 72 70 2c 20 50 41 43 4b 41 47 45 5f  interp, PACKAGE_
177b0 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45 5f 56 45  NAME, PACKAGE_VE
177c0 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  RSION);.}../*. *
177d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17810 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73 5f 53 61  ---. *. *.Tls_Sa
17820 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09  feInit --. *. *.
17830 54 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67  This is a packag
17840 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
17850 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 73   procedure for s
17860 61 66 65 20 69 6e 74 65 72 70 73 2e 0a 20 2a 0a  afe interps.. *.
17870 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 53   * Results:. *.S
17880 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49  ame as of 'Tls_I
17890 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69 64 65 20  nit'. *. * Side 
178a0 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 61 6d 65  effects:. *.Same
178b0 20 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74   as of 'Tls_Init
178c0 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  '. *. *---------
178d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44  ----------. */.D
17910 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73  LLEXPORT int Tls
17920 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e  _SafeInit(Tcl_In
17930 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a  terp *interp) {.
17940 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
17950 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72  led");.    retur
17960 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e 74 65 72  n Tls_Init(inter
17970 70 29 3b 0a 7d 0a                                p);.}.