Hex Artifact Content

Artifact 99e542a0c256ec2205fa731d3ccee3b44fdce9965694985b4b7be4fb5fcf9ffc:


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 63 72 65  ifyCallback: cre
2a80: 61 74 65 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  ate callback com
2a90: 6d 61 6e 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  mand");..    /* 
2aa0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
2ab0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
2ac0: 63 68 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72  chan, depth, cer
2ad0: 74 20 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61  t info list, sta
2ae0: 74 75 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61  tus, and error a
2af0: 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74  rgs */.    cmdPt
2b00: 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  r = Tcl_Duplicat
2b10: 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76  eObj(statePtr->v
2b20: 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  cmd);.    Tcl_Li
2b30: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2b40: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2b50: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2b60: 4f 62 6a 28 22 76 65 72 69 66 79 22 2c 20 2d 31  Obj("verify", -1
2b70: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2b80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b90: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2ba0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2bb0: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
2bc0: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
2bd0: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
2be0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2bf0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
2c10: 77 49 6e 74 4f 62 6a 28 64 65 70 74 68 29 29 3b  wIntObj(depth));
2c20: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2c30: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2c40: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 6c  terp, cmdPtr, Tl
2c50: 73 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74  s_NewX509Obj(int
2c60: 65 72 70 2c 20 63 65 72 74 2c 20 30 29 29 3b 0a  erp, cert, 0));.
2c70: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2c80: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c90: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
2ca0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b 29 29 3b  _NewIntObj(ok));
2cb0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2cc0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2cd0: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
2ce0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2cf0: 28 63 68 61 72 2a 29 58 35 30 39 5f 76 65 72 69  (char*)X509_veri
2d00: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
2d10: 72 69 6e 67 28 65 72 72 29 2c 20 2d 31 29 29 3b  ring(err), -1));
2d20: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76 65 6e 74  ..    /* Prevent
2d30: 20 49 2f 4f 20 77 68 69 6c 65 20 63 61 6c 6c 62   I/O while callb
2d40: 61 63 6b 20 69 73 20 69 6e 20 70 72 6f 67 72 65  ack is in progre
2d50: 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20 73 74 61  ss */.    /* sta
2d60: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  tePtr->flags |= 
2d70: 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42 41 43 4b  TLS_TCL_CALLBACK
2d80: 3b 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74  ; */..    dprint
2d90: 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63  f("VerifyCallbac
2da0: 6b 3a 20 65 76 61 6c 20 63 61 6c 6c 62 61 63 6b  k: eval callback
2db0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c  ");..    /* Eval
2dc0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e   callback comman
2dd0: 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63  d */.    Tcl_Inc
2de0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
2df0: 29 3b 0a 20 20 20 20 6f 6b 20 3d 20 45 76 61 6c  );.    ok = Eval
2e00: 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c  Callback(interp,
2e10: 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74   statePtr, cmdPt
2e20: 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  r);.    Tcl_Decr
2e30: 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29  RefCount(cmdPtr)
2e40: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
2e50: 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20  VerifyCallback: 
2e60: 63 6f 6d 6d 61 6e 64 20 72 65 73 75 6c 74 20 3d  command result =
2e70: 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20 20   %d", ok);..    
2e80: 2f 2a 20 73 74 61 74 65 50 74 72 2d 3e 66 6c 61  /* statePtr->fla
2e90: 67 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f  gs &= ~(TLS_TCL_
2ea0: 43 41 4c 4c 42 41 43 4b 29 3b 20 2a 2f 0a 20 20  CALLBACK); */.  
2eb0: 20 20 72 65 74 75 72 6e 20 6f 6b 3b 09 2f 2a 20    return ok;./* 
2ec0: 42 79 20 64 65 66 61 75 6c 74 2c 20 6c 65 61 76  By default, leav
2ed0: 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 75  e verification u
2ee0: 6e 63 68 61 6e 67 65 64 2e 20 2a 2f 0a 7d 0a 0c  nchanged. */.}..
2ef0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
2f40: 54 6c 73 5f 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a  Tls_Error --. *.
2f50: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
2f60: 6b 20 77 69 74 68 20 65 72 72 6f 72 20 6d 65 73  k with error mes
2f70: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sage.. *. * Side
2f80: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65   effects:. *.The
2f90: 20 65 72 72 20 66 69 65 6c 64 20 6f 66 20 74 68   err field of th
2fa0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 72  e currently oper
2fb0: 61 74 69 76 65 20 53 74 61 74 65 20 69 73 20 73  ative State is s
2fc0: 65 74 0a 20 2a 09 20 20 74 6f 20 61 20 73 74 72  et. *.  to a str
2fd0: 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20 74  ing describing t
2fe0: 68 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  he SSL negotiati
2ff0: 6f 6e 20 66 61 69 6c 75 72 65 20 72 65 61 73 6f  on failure reaso
3000: 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  n. *. *---------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76  ----------. */.v
3050: 6f 69 64 0a 54 6c 73 5f 45 72 72 6f 72 28 53 74  oid.Tls_Error(St
3060: 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 63  ate *statePtr, c
3070: 6f 6e 73 74 20 63 68 61 72 20 2a 6d 73 67 29 20  onst char *msg) 
3080: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
3090: 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65   *interp.= state
30a0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
30b0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72   Tcl_Obj *cmdPtr
30c0: 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20  , *listPtr;.    
30d0: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 65 72  unsigned long er
30e0: 72 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  r;.    statePtr-
30f0: 3e 65 72 72 20 3d 20 6d 73 67 3b 0a 0a 20 20 20  >err = msg;..   
3100: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
3110: 20 77 69 74 68 20 6d 65 73 73 61 67 65 20 25 73   with message %s
3120: 22 2c 20 6d 73 67 29 3b 0a 0a 20 20 20 20 69 66  ", msg);..    if
3130: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c   (statePtr->call
3140: 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a  back == (Tcl_Obj
3150: 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  *)NULL) {..retur
3160: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70  n;.    }..    dp
3170: 72 69 6e 74 66 28 22 54 6c 73 5f 45 72 72 6f 72  rintf("Tls_Error
3180: 3a 20 63 72 65 61 74 65 20 63 61 6c 6c 62 61 63  : create callbac
3190: 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 20 20  k command");..  
31a0: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
31b0: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
31c0: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
31d0: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
31e0: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
31f0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3200: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
3210: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
3220: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
3230: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
3240: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
3250: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
3260: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3270: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3280: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3290: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
32a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
32b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
32c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
32d0: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
32e0: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
32f0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3300: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
3310: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
3320: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
3330: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
3340: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
3350: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3360: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
3370: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3380: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3390: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
33a0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
33b0: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
33c0: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
33d0: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
33e0: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
33f0: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3400: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
3410: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
3420: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3430: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
3440: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
3450: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
3460: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
3470: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
3480: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3490: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
34a0: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
34b0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
34c0: 66 28 22 54 6c 73 5f 45 72 72 6f 72 3a 20 65 76  f("Tls_Error: ev
34d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a  al callback");..
34e0: 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c      /* Eval call
34f0: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  back command */.
3500: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
3510: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20  ount(cmdPtr);.  
3520: 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69    EvalCallback(i
3530: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c  nterp, statePtr,
3540: 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63   cmdPtr);.    Tc
3550: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63  l_DecrRefCount(c
3560: 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  mdPtr);.}.../*. 
3570: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 65 79 4c 6f  ----. *. * KeyLo
35c0: 67 43 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a  gCallback --. *.
35d0: 20 2a 09 57 72 69 74 65 20 72 65 63 65 69 76 65   *.Write receive
35e0: 64 20 6b 65 79 20 64 61 74 61 20 74 6f 20 6c 6f  d key data to lo
35f0: 67 20 66 69 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69  g file.. *. * Si
3600: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e  de effects:. *.n
3610: 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  one. *. *-------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
3660: 0a 76 6f 69 64 20 4b 65 79 4c 6f 67 43 61 6c 6c  .void KeyLogCall
3670: 62 61 63 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a  back(const SSL *
3680: 73 73 6c 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ssl, const char 
3690: 2a 6c 69 6e 65 29 20 7b 0a 20 20 20 20 63 68 61  *line) {.    cha
36a0: 72 20 2a 73 74 72 20 3d 20 67 65 74 65 6e 76 28  r *str = getenv(
36b0: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 3b 0a  SSLKEYLOGFILE);.
36c0: 20 20 20 20 46 49 4c 45 20 2a 66 64 3b 0a 0a 20      FILE *fd;.. 
36d0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
36e0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
36f0: 74 72 29 20 7b 0a 09 66 64 20 3d 20 66 6f 70 65  tr) {..fd = fope
3700: 6e 28 73 74 72 2c 20 22 61 22 29 3b 0a 09 66 70  n(str, "a");..fp
3710: 72 69 6e 74 66 28 66 64 2c 20 22 25 73 5c 6e 22  rintf(fd, "%s\n"
3720: 2c 6c 69 6e 65 29 3b 0a 09 66 63 6c 6f 73 65 28  ,line);..fclose(
3730: 66 64 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  fd);.    }.}.../
3740: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 61  -------. *. * Pa
3790: 73 73 77 6f 72 64 20 43 61 6c 6c 62 61 63 6b 20  ssword Callback 
37a0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20  --. *. *.Called 
37b0: 77 68 65 6e 20 61 20 70 61 73 73 77 6f 72 64 20  when a password 
37c0: 69 73 20 6e 65 65 64 65 64 20 66 6f 72 20 61 20  is needed for a 
37d0: 70 72 69 76 61 74 65 20 6b 65 79 20 77 68 65 6e  private key when
37e0: 20 6c 6f 61 64 69 6e 67 0a 20 2a 09 6f 72 20 73   loading. *.or s
37f0: 74 6f 72 69 6e 67 20 61 20 50 45 4d 20 63 65 72  toring a PEM cer
3800: 74 69 66 69 63 61 74 65 20 77 69 74 68 20 65 6e  tificate with en
3810: 63 72 79 70 74 69 6f 6e 2e 20 45 76 61 6c 73 20  cryption. Evals 
3820: 63 61 6c 6c 62 61 63 6b 0a 20 2a 09 73 63 72 69  callback. *.scri
3830: 70 74 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  pt and returns t
3840: 68 65 20 72 65 73 75 6c 74 20 61 73 20 74 68 65  he result as the
3850: 20 70 61 73 73 77 6f 72 64 20 73 74 72 69 6e 67   password string
3860: 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 52   in buf.. *. * R
3870: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a  esults:. *.None.
3880: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
3890: 74 73 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  ts:. *.Calls cal
38a0: 6c 62 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65  lback (if define
38b0: 64 29 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  d). *. * Returns
38c0: 3a 0a 20 2a 09 50 61 73 73 77 6f 72 64 20 73 69  :. *.Password si
38d0: 7a 65 20 69 6e 20 62 79 74 65 73 20 6f 72 20 2d  ze in bytes or -
38e0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a  1 for an error..
38f0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
3900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
3940: 74 69 63 20 69 6e 74 0a 50 61 73 73 77 6f 72 64  tic int.Password
3950: 43 61 6c 6c 62 61 63 6b 28 63 68 61 72 20 2a 62  Callback(char *b
3960: 75 66 2c 20 69 6e 74 20 73 69 7a 65 2c 20 69 6e  uf, int size, in
3970: 74 20 72 77 66 6c 61 67 2c 20 76 6f 69 64 20 2a  t rwflag, void *
3980: 75 64 61 74 61 29 20 7b 0a 20 20 20 20 53 74 61  udata) {.    Sta
3990: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
39a0: 53 74 61 74 65 20 2a 29 20 75 64 61 74 61 3b 0a  State *) udata;.
39b0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
39c0: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
39d0: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
39e0: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
39f0: 20 20 20 20 69 6e 74 20 63 6f 64 65 3b 0a 20 20      int code;.  
3a00: 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 3b 0a    Tcl_Size len;.
3a10: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
3a20: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20  lled");..    /* 
3a30: 49 66 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 2c 20  If no callback, 
3a40: 75 73 65 20 64 65 66 61 75 6c 74 20 63 61 6c 6c  use default call
3a50: 62 61 63 6b 20 2a 2f 0a 20 20 20 20 69 66 20 28  back */.    if (
3a60: 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
3a70: 72 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  rd == NULL) {..i
3a80: 66 20 28 54 63 6c 5f 45 76 61 6c 45 78 28 69 6e  f (Tcl_EvalEx(in
3a90: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 70 61 73 73  terp, "tls::pass
3aa0: 77 6f 72 64 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  word", -1, TCL_E
3ab0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 20 3d 3d 20 54  VAL_GLOBAL) == T
3ac0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 63 68  CL_OK) {..    ch
3ad0: 61 72 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20  ar *ret = (char 
3ae0: 2a 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  *) Tcl_GetString
3af0: 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f  FromObj(Tcl_GetO
3b00: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  bjResult(interp)
3b10: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
3b20: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
3b30: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 09 6c  e) size-1) {...l
3b40: 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20  en = (Tcl_Size) 
3b50: 73 69 7a 65 2d 31 3b 0a 09 20 20 20 20 7d 0a 09  size-1;..    }..
3b60: 20 20 20 20 73 74 72 6e 63 70 79 28 62 75 66 2c      strncpy(buf,
3b70: 20 72 65 74 2c 20 28 73 69 7a 65 5f 74 29 20 6c   ret, (size_t) l
3b80: 65 6e 29 3b 0a 09 20 20 20 20 62 75 66 5b 6c 65  en);..    buf[le
3b90: 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 20 20 20 20  n] = '\0';..    
3ba0: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
3bb0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20  ;..} else {..   
3bc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 20   return -1;..}. 
3bd0: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
3be0: 66 28 22 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  f("PasswordCallb
3bf0: 61 63 6b 3a 20 63 72 65 61 74 65 20 63 61 6c 6c  ack: create call
3c00: 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 22 29 3b 0a  back command");.
3c10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
3c20: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
3c30: 69 74 68 20 66 6e 2c 20 72 77 66 6c 61 67 2c 20  ith fn, rwflag, 
3c40: 61 6e 64 20 73 69 7a 65 20 61 72 67 73 20 2a 2f  and size args */
3c50: 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63  .    cmdPtr = Tc
3c60: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73  l_DuplicateObj(s
3c70: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
3c80: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
3c90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3ca0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3cb0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3cc0: 6a 28 22 70 61 73 73 77 6f 72 64 22 2c 20 2d 31  j("password", -1
3cd0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3ce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3cf0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3d00: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
3d10: 77 66 6c 61 67 29 29 3b 0a 20 20 20 20 54 63 6c  wflag));.    Tcl
3d20: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
3d30: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
3d40: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  dPtr, Tcl_NewInt
3d50: 4f 62 6a 28 73 69 7a 65 29 29 3b 0a 0a 20 20 20  Obj(size));..   
3d60: 20 64 70 72 69 6e 74 66 28 22 50 61 73 73 77 6f   dprintf("Passwo
3d70: 72 64 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61 6c  rdCallback: eval
3d80: 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20 20   callback");..  
3d90: 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28 28    Tcl_Preserve((
3da0: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
3db0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 50 72 65  rp);.    Tcl_Pre
3dc0: 73 65 72 76 65 28 28 43 6c 69 65 6e 74 44 61 74  serve((ClientDat
3dd0: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 0a 20  a) statePtr);.. 
3de0: 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62     /* Eval callb
3df0: 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  ack command */. 
3e00: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
3e10: 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20 20 20  unt(cmdPtr);.   
3e20: 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45 76 61 6c   code = Tcl_Eval
3e30: 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 63 6d  ObjEx(interp, cm
3e40: 64 50 74 72 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  dPtr, TCL_EVAL_G
3e50: 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 69 66 20 28  LOBAL);.    if (
3e60: 63 6f 64 65 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  code != TCL_OK) 
3e70: 7b 0a 23 69 66 20 28 54 43 4c 5f 4d 41 4a 4f 52  {.#if (TCL_MAJOR
3e80: 5f 56 45 52 53 49 4f 4e 20 3d 3d 20 38 29 20 26  _VERSION == 8) &
3e90: 26 20 28 54 43 4c 5f 4d 49 4e 4f 52 5f 56 45 52  & (TCL_MINOR_VER
3ea0: 53 49 4f 4e 20 3c 20 36 29 0a 09 54 63 6c 5f 42  SION < 6)..Tcl_B
3eb0: 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 69  ackgroundError(i
3ec0: 6e 74 65 72 70 29 3b 0a 23 65 6c 73 65 0a 09 54  nterp);.#else..T
3ed0: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 78 63  cl_BackgroundExc
3ee0: 65 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  eption(interp, c
3ef0: 6f 64 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ode);.#endif.   
3f00: 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52   }.    Tcl_DecrR
3f10: 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b  efCount(cmdPtr);
3f20: 0a 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61 73  ..    Tcl_Releas
3f30: 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73  e((ClientData) s
3f40: 74 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f  tatePtr);..    /
3f50: 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
3f60: 20 70 61 73 73 20 62 61 63 6b 20 70 61 73 73 77   pass back passw
3f70: 6f 72 64 20 73 74 72 69 6e 67 20 61 6e 64 20 74  ord string and t
3f80: 72 75 6e 63 61 74 65 20 69 66 20 74 6f 6f 20 6c  runcate if too l
3f90: 6f 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  ong */.    if (c
3fa0: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ode == TCL_OK) {
3fb0: 0a 09 63 68 61 72 20 2a 72 65 74 20 3d 20 28 63  ..char *ret = (c
3fc0: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 53 74  har *) Tcl_GetSt
3fd0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
3fe0: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
3ff0: 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  erp), &len);..if
4000: 20 28 6c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a   (len > (Tcl_Siz
4010: 65 29 20 73 69 7a 65 2d 31 29 20 7b 0a 09 20 20  e) size-1) {..  
4020: 20 20 6c 65 6e 20 3d 20 28 54 63 6c 5f 53 69 7a    len = (Tcl_Siz
4030: 65 29 20 73 69 7a 65 2d 31 3b 0a 09 7d 0a 09 73  e) size-1;..}..s
4040: 74 72 6e 63 70 79 28 62 75 66 2c 20 72 65 74 2c  trncpy(buf, ret,
4050: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
4060: 09 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  .buf[len] = '\0'
4070: 3b 0a 09 54 63 6c 5f 52 65 6c 65 61 73 65 28 28  ;..Tcl_Release((
4080: 43 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65  ClientData) inte
4090: 72 70 29 3b 0a 09 72 65 74 75 72 6e 20 28 69 6e  rp);..return (in
40a0: 74 29 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20  t) len;.    }.  
40b0: 20 20 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43    Tcl_Release((C
40c0: 6c 69 65 6e 74 44 61 74 61 29 20 69 6e 74 65 72  lientData) inter
40d0: 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d  p);.    return -
40e0: 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  1;.}.../*. *----
40f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
4130: 20 2a 0a 20 2a 20 53 65 73 73 69 6f 6e 20 43 61   *. * Session Ca
4140: 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e  llback for Clien
4150: 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c  ts --. *. *.Call
4160: 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20 73 65  ed when a new se
4170: 73 73 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74  ssion is added t
4180: 6f 20 74 68 65 20 63 61 63 68 65 2e 20 49 6e 20  o the cache. In 
4190: 54 4c 53 20 31 2e 33 0a 20 2a 09 74 68 69 73 20  TLS 1.3. *.this 
41a0: 6d 61 79 20 62 65 20 72 65 63 65 69 76 65 64 20  may be received 
41b0: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 20 61  multiple times a
41c0: 66 74 65 72 20 74 68 65 20 68 61 6e 64 73 68 61  fter the handsha
41d0: 6b 65 2e 20 46 6f 72 0a 20 2a 09 65 61 72 6c 69  ke. For. *.earli
41e0: 65 72 20 76 65 72 73 69 6f 6e 73 2c 20 74 68 69  er versions, thi
41f0: 73 20 77 69 6c 6c 20 62 65 20 72 65 63 65 69 76  s will be receiv
4200: 65 64 20 64 75 72 69 6e 67 20 74 68 65 20 68 61  ed during the ha
4210: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 54 68 69 73  ndshake.. *.This
4220: 20 69 73 20 74 68 65 20 70 72 65 66 65 72 72 65   is the preferre
4230: 64 20 77 61 79 20 74 6f 20 6f 62 74 61 69 6e 20  d way to obtain 
4240: 61 20 72 65 73 75 6d 61 62 6c 65 20 73 65 73 73  a resumable sess
4250: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ion.. *. * Resul
4260: 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20  ts:. *.None. *. 
4270: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
4280: 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63   *.Calls callbac
4290: 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20  k (if defined). 
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65  *. * Return code
42b0: 73 3a 0a 20 2a 09 30 20 3d 20 65 72 72 6f 72 20  s:. *.0 = error 
42c0: 77 68 65 72 65 20 73 65 73 73 69 6f 6e 20 77 69  where session wi
42d0: 6c 6c 20 62 65 20 69 6d 6d 65 64 69 61 74 65 6c  ll be immediatel
42e0: 79 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  y removed from t
42f0: 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
4300: 65 2e 0a 20 2a 09 31 20 3d 20 73 75 63 63 65 73  e.. *.1 = succes
4310: 73 20 77 68 65 72 65 20 61 70 70 20 72 65 74 61  s where app reta
4320: 69 6e 73 20 73 65 73 73 69 6f 6e 20 69 6e 20 73  ins session in s
4330: 65 73 73 69 6f 6e 20 63 61 63 68 65 2c 20 61 6e  ession cache, an
4340: 64 20 6d 75 73 74 20 63 61 6c 6c 20 53 53 4c 5f  d must call SSL_
4350: 53 45 53 53 49 4f 4e 5f 66 72 65 65 28 29 20 77  SESSION_free() w
4360: 68 65 6e 20 64 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d  hen done.. *. *-
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
43b0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
43c0: 74 0a 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63  t.SessionCallbac
43d0: 6b 28 53 53 4c 20 2a 73 73 6c 2c 20 53 53 4c 5f  k(SSL *ssl, SSL_
43e0: 53 45 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e  SESSION *session
43f0: 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
4400: 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
4410: 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70 5f 64 61  *)SSL_get_app_da
4420: 74 61 28 28 53 53 4c 20 2a 29 73 73 6c 29 3b 0a  ta((SSL *)ssl);.
4430: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a      Tcl_Interp *
4440: 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50 74  interp.= statePt
4450: 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54  r->interp;.    T
4460: 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a  cl_Obj *cmdPtr;.
4470: 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e      const unsign
4480: 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
4490: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  .    const unsig
44a0: 6e 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f  ned char *sessio
44b0: 6e 5f 69 64 3b 0a 20 20 20 20 73 69 7a 65 5f 74  n_id;.    size_t
44c0: 20 6c 65 6e 32 3b 0a 20 20 20 20 75 6e 73 69 67   len2;.    unsig
44d0: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 20  ned int ulen;.. 
44e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
44f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4500: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
4510: 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  k == (Tcl_Obj*)N
4520: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
4530: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
4540: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
4550: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
4560: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
4570: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
4580: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61    }..    /* Crea
4590: 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76  te command to ev
45a0: 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e  al with fn, chan
45b0: 2c 20 73 65 73 73 69 6f 6e 20 69 64 2c 20 73 65  , session id, se
45c0: 73 73 69 6f 6e 20 74 69 63 6b 65 74 2c 20 61 6e  ssion ticket, an
45d0: 64 20 6c 69 66 65 74 69 6d 65 20 61 72 67 73 20  d lifetime args 
45e0: 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20  */.    cmdPtr = 
45f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
4600: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
4610: 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ack);.    Tcl_Li
4620: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
4630: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
4640: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
4650: 4f 62 6a 28 22 73 65 73 73 69 6f 6e 22 2c 20 2d  Obj("session", -
4660: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
4670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
4680: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
4690: 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  ,..    Tcl_NewSt
46a0: 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43  ringObj(Tcl_GetC
46b0: 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65  hannelName(state
46c0: 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29  Ptr->self), -1))
46d0: 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69 6f  ;..    /* Sessio
46e0: 6e 20 69 64 20 2a 2f 0a 20 20 20 20 73 65 73 73  n id */.    sess
46f0: 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53  ion_id = SSL_SES
4700: 53 49 4f 4e 5f 67 65 74 5f 69 64 28 73 65 73 73  SION_get_id(sess
4710: 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a 20 20 20  ion, &ulen);.   
4720: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
4730: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
4740: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4750: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 73 65  wByteArrayObj(se
4760: 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53  ssion_id, (Tcl_S
4770: 69 7a 65 29 20 75 6c 65 6e 29 29 3b 0a 0a 20 20  ize) ulen));..  
4780: 20 20 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63    /* Session tic
4790: 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 53  ket */.    SSL_S
47a0: 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63 6b  ESSION_get0_tick
47b0: 65 74 28 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  et(session, &tic
47c0: 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 20 20 20  ket, &len2);.   
47d0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
47e0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
47f0: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
4800: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 74 69  wByteArrayObj(ti
4810: 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29  cket, (Tcl_Size)
4820: 20 6c 65 6e 32 29 29 3b 0a 0a 20 20 20 20 2f 2a   len2));..    /*
4830: 20 4c 69 66 65 74 69 6d 65 20 2d 20 6e 75 6d 62   Lifetime - numb
4840: 65 72 20 6f 66 20 73 65 63 6f 6e 64 73 20 2a 2f  er of seconds */
4850: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
4860: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
4870: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 54  terp, cmdPtr,..T
4880: 63 6c 5f 4e 65 77 4c 6f 6e 67 4f 62 6a 28 28 6c  cl_NewLongObj((l
4890: 6f 6e 67 29 20 53 53 4c 5f 53 45 53 53 49 4f 4e  ong) SSL_SESSION
48a0: 5f 67 65 74 5f 74 69 63 6b 65 74 5f 6c 69 66 65  _get_ticket_life
48b0: 74 69 6d 65 5f 68 69 6e 74 28 73 65 73 73 69 6f  time_hint(sessio
48c0: 6e 29 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  n)));..    /* Ev
48d0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
48e0: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
48f0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
4900: 74 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c  tr);.    EvalCal
4910: 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74  lback(interp, st
4920: 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b  atePtr, cmdPtr);
4930: 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
4940: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 0a  Count(cmdPtr);..
4950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 30 20      /* Return 0 
4960: 66 6f 72 20 6e 6f 77 20 75 6e 74 69 6c 20 73 65  for now until se
4970: 73 73 69 6f 6e 20 68 61 6e 64 6c 69 6e 67 20 69  ssion handling i
4980: 73 20 63 6f 6d 70 6c 65 74 65 20 2a 2f 0a 20 20  s complete */.  
4990: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0c 0a    return 0;.}...
49a0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 41  --------. *. * A
49f0: 4c 50 4e 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72  LPN Callback for
4a00: 20 53 65 72 76 65 72 73 20 61 6e 64 20 4e 50 4e   Servers and NPN
4a10: 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 43 6c   Callback for Cl
4a20: 69 65 6e 74 73 20 2d 2d 0a 20 2a 0a 20 2a 09 50  ients --. *. *.P
4a30: 65 72 66 6f 72 6d 20 70 72 6f 74 6f 63 6f 6c 20  erform protocol 
4a40: 28 68 74 74 70 2f 31 2e 31 2c 20 68 32 2c 20 68  (http/1.1, h2, h
4a50: 33 2c 20 65 74 63 2e 29 20 73 65 6c 65 63 74 69  3, etc.) selecti
4a60: 6f 6e 20 66 6f 72 20 74 68 65 0a 20 2a 09 69 6e  on for the. *.in
4a70: 63 6f 6d 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  coming connectio
4a80: 6e 2e 20 43 61 6c 6c 65 64 20 61 66 74 65 72 20  n. Called after 
4a90: 48 65 6c 6c 6f 20 61 6e 64 20 73 65 72 76 65 72  Hello and server
4aa0: 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 09 57   callbacks.. *.W
4ab0: 68 65 72 65 20 27 6f 75 74 27 20 69 73 20 73 65  here 'out' is se
4ac0: 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20  lected protocol 
4ad0: 61 6e 64 20 27 69 6e 27 20 69 73 20 74 68 65 20  and 'in' is the 
4ae0: 70 65 65 72 20 61 64 76 65 72 74 69 73 65 64 20  peer advertised 
4af0: 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  list.. *. * Resu
4b00: 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a  lts:. *.None. *.
4b10: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
4b20: 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61  . *.Calls callba
4b30: 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29 0a  ck (if defined).
4b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f 64   *. * Return cod
4b50: 65 73 3a 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58  es:. *.SSL_TLSEX
4b60: 54 5f 45 52 52 5f 4f 4b 3a 20 41 4c 50 4e 20 70  T_ERR_OK: ALPN p
4b70: 72 6f 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64  rotocol selected
4b80: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4b90: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53   continues.. *.S
4ba0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c  SL_TLSEXT_ERR_AL
4bb0: 45 52 54 5f 46 41 54 41 4c 3a 20 54 68 65 72 65  ERT_FATAL: There
4bc0: 20 77 61 73 20 6e 6f 20 6f 76 65 72 6c 61 70 20   was no overlap 
4bd0: 62 65 74 77 65 65 6e 20 74 68 65 20 63 6c 69 65  between the clie
4be0: 6e 74 27 73 0a 20 2a 09 20 20 20 20 73 75 70 70  nt's. *.    supp
4bf0: 6c 69 65 64 20 6c 69 73 74 20 61 6e 64 20 74 68  lied list and th
4c00: 65 20 73 65 72 76 65 72 20 63 6f 6e 66 69 67 75  e server configu
4c10: 72 61 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ration. The conn
4c20: 65 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 61  ection will be a
4c30: 62 6f 72 74 65 64 2e 0a 20 2a 09 53 53 4c 5f 54  borted.. *.SSL_T
4c40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
4c50: 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e   ALPN protocol n
4c60: 6f 74 20 73 65 6c 65 63 74 65 64 2c 20 65 2e 67  ot selected, e.g
4c70: 2e 2c 20 62 65 63 61 75 73 65 20 6e 6f 20 41 4c  ., because no AL
4c80: 50 4e 0a 20 2a 09 20 20 20 20 70 72 6f 74 6f 63  PN. *.    protoc
4c90: 6f 6c 73 20 61 72 65 20 63 6f 6e 66 69 67 75 72  ols are configur
4ca0: 65 64 20 66 6f 72 20 74 68 69 73 20 63 6f 6e 6e  ed for this conn
4cb0: 65 63 74 69 6f 6e 2e 20 54 68 65 20 63 6f 6e 6e  ection. The conn
4cc0: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
4cd0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
4d20: 74 61 74 69 63 20 69 6e 74 0a 41 4c 50 4e 43 61  tatic int.ALPNCa
4d30: 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c 2c  llback(SSL *ssl,
4d40: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
4d50: 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73 69  char **out, unsi
4d60: 67 6e 65 64 20 63 68 61 72 20 2a 6f 75 74 6c 65  gned char *outle
4d70: 6e 2c 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n,..const unsign
4d80: 65 64 20 63 68 61 72 20 2a 69 6e 2c 20 75 6e 73  ed char *in, uns
4d90: 69 67 6e 65 64 20 69 6e 74 20 69 6e 6c 65 6e 2c  igned int inlen,
4da0: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
4db0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4dc0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
4dd0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
4de0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
4df0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
4e00: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
4e10: 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c 20 72  .    int code, r
4e20: 65 73 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  es;..    dprintf
4e30: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
4e40: 20 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c   if (ssl == NULL
4e50: 20 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29   || arg == NULL)
4e60: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54   {..return SSL_T
4e70: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b  LSEXT_ERR_NOACK;
4e80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
4e90: 65 6c 65 63 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  elect protocol *
4ea0: 2f 0a 20 20 20 20 69 66 20 28 53 53 4c 5f 73 65  /.    if (SSL_se
4eb0: 6c 65 63 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 28  lect_next_proto(
4ec0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
4ed0: 2a 29 20 6f 75 74 2c 20 6f 75 74 6c 65 6e 2c 20  *) out, outlen, 
4ee0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
4ef0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  , statePtr->prot
4f00: 6f 73 5f 6c 65 6e 2c 0a 09 69 6e 2c 20 69 6e 6c  os_len,..in, inl
4f10: 65 6e 29 20 3d 3d 20 4f 50 45 4e 53 53 4c 5f 4e  en) == OPENSSL_N
4f20: 50 4e 5f 4e 45 47 4f 54 49 41 54 45 44 29 20 7b  PN_NEGOTIATED) {
4f30: 0a 09 2f 2a 20 4d 61 74 63 68 20 66 6f 75 6e 64  ../* Match found
4f40: 20 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54   */..res = SSL_T
4f50: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20  LSEXT_ERR_OK;.  
4f60: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 4f    } else {../* O
4f70: 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 4f 5f 4f 56  PENSSL_NPN_NO_OV
4f80: 45 52 4c 41 50 20 3d 20 4e 6f 20 6f 76 65 72 6c  ERLAP = No overl
4f90: 61 70 2c 20 73 6f 20 75 73 65 20 66 69 72 73 74  ap, so use first
4fa0: 20 69 74 65 6d 20 66 72 6f 6d 20 63 6c 69 65 6e   item from clien
4fb0: 74 20 70 72 6f 74 6f 63 6f 6c 20 6c 69 73 74 20  t protocol list 
4fc0: 2a 2f 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c  */..res = SSL_TL
4fd0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
4fe0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
4ff0: 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d  tatePtr->vcmd ==
5000: 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29   (Tcl_Obj*)NULL)
5010: 20 7b 0a 09 72 65 74 75 72 6e 20 72 65 73 3b 0a   {..return res;.
5020: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72      }..    /* Cr
5030: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
5040: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
5050: 61 6e 2c 20 64 65 70 74 68 2c 20 63 65 72 74 20  an, depth, cert 
5060: 69 6e 66 6f 20 6c 69 73 74 2c 20 73 74 61 74 75  info list, statu
5070: 73 2c 20 61 6e 64 20 65 72 72 6f 72 20 61 72 67  s, and error arg
5080: 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20  s */.    cmdPtr 
5090: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
50a0: 62 6a 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  bj(statePtr->vcm
50b0: 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  d);.    Tcl_List
50c0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
50d0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
50e0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
50f0: 6a 28 22 61 6c 70 6e 22 2c 20 2d 31 29 29 3b 0a  j("alpn", -1));.
5100: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
5110: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
5120: 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20  erp, cmdPtr,..  
5130: 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
5140: 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  bj(Tcl_GetChanne
5150: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
5160: 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20  self), -1));.   
5170: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5180: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5190: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
51a0: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 6f 6e 73  wStringObj((cons
51b0: 74 20 63 68 61 72 20 2a 29 20 2a 6f 75 74 2c 20  t char *) *out, 
51c0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
51d0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
51e0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
51f0: 72 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  r, Tcl_NewBoolea
5200: 6e 4f 62 6a 28 72 65 73 20 3d 3d 20 53 53 4c 5f  nObj(res == SSL_
5210: 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 29 29 3b  TLSEXT_ERR_OK));
5220: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
5230: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
5240: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
5250: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5260: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
5270: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
5280: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
5290: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
52a0: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
52b0: 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20  _ERR_NOACK;.    
52c0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
52d0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
52e0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
52f0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
5300: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
5310: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
5320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
5330: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
5340: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
5350: 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d   res;.}.../*. *-
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
53a0: 2d 2d 0a 20 2a 0a 20 2a 20 41 64 76 65 72 74 69  --. *. * Adverti
53b0: 73 65 20 50 72 6f 74 6f 63 6f 6c 73 20 43 61 6c  se Protocols Cal
53c0: 6c 62 61 63 6b 20 66 6f 72 20 4e 65 78 74 20 50  lback for Next P
53d0: 72 6f 74 6f 63 6f 6c 20 4e 65 67 6f 74 69 61 74  rotocol Negotiat
53e0: 69 6f 6e 20 28 4e 50 4e 29 20 69 6e 20 53 65 72  ion (NPN) in Ser
53f0: 76 65 72 48 65 6c 6c 6f 20 2d 2d 0a 20 2a 0a 20  verHello --. *. 
5400: 2a 09 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  *.called when a 
5410: 54 4c 53 20 73 65 72 76 65 72 20 6e 65 65 64 73  TLS server needs
5420: 20 61 20 6c 69 73 74 20 6f 66 20 73 75 70 70 6f   a list of suppo
5430: 72 74 65 64 20 70 72 6f 74 6f 63 6f 6c 73 20 66  rted protocols f
5440: 6f 72 20 4e 65 78 74 0a 20 2a 09 50 72 6f 74 6f  or Next. *.Proto
5450: 63 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e  col Negotiation.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5470: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
5480: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 0a 20  de effects:. *. 
5490: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a  * Return codes:.
54a0: 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52   *.SSL_TLSEXT_ER
54b0: 52 5f 4f 4b 3a 20 4e 50 4e 20 70 72 6f 74 6f 63  R_OK: NPN protoc
54c0: 6f 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65  ol selected. The
54d0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74   connection cont
54e0: 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c  inues.. *.SSL_TL
54f0: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a 20  SEXT_ERR_NOACK: 
5500: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  NPN protocol not
5510: 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20 63   selected. The c
5520: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5530: 75 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ues.. *. *------
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5580: 2f 0a 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e  /.#ifdef USE_NPN
5590: 0a 73 74 61 74 69 63 20 69 6e 74 0a 4e 50 4e 43  .static int.NPNC
55a0: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
55b0: 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74 20 75 6e  L *ssl, const un
55c0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 2a 6f 75  signed char **ou
55d0: 74 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  t, unsigned int 
55e0: 2a 6f 75 74 6c 65 6e 2c 20 76 6f 69 64 20 2a 61  *outlen, void *a
55f0: 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20  rg) {.    State 
5600: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61  *statePtr = (Sta
5610: 74 65 2a 29 61 72 67 3b 0a 0a 20 20 20 20 64 70  te*)arg;..    dp
5620: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
5630: 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d 3d  ..    if (ssl ==
5640: 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20   NULL || arg == 
5650: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
5660: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
5670: 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  OACK;.    }..   
5680: 20 2f 2a 20 53 65 74 20 70 72 6f 74 6f 63 6f 6c   /* Set protocol
5690: 73 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 69 66  s list */.    if
56a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74   (statePtr->prot
56b0: 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2a  os != NULL) {..*
56c0: 6f 75 74 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  out = statePtr->
56d0: 70 72 6f 74 6f 73 3b 0a 09 2a 6f 75 74 6c 65 6e  protos;..*outlen
56e0: 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 70 72 6f   = statePtr->pro
56f0: 74 6f 73 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65  tos_len;.    } e
5700: 6c 73 65 20 7b 0a 09 2a 6f 75 74 20 3d 20 4e 55  lse {..*out = NU
5710: 4c 4c 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 30  LL;..*outlen = 0
5720: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  ;..return SSL_TL
5730: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5740: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
5750: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5760: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0c 0a 2f  OK;.}.#endif.../
5770: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
57b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53 4e  -------. *. * SN
57c0: 49 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  I Callback for S
57d0: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
57e0: 50 65 72 66 6f 72 6d 20 73 65 72 76 65 72 2d 73  Perform server-s
57f0: 69 64 65 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  ide SNI hostname
5800: 20 73 65 6c 65 63 74 69 6f 6e 20 61 66 74 65 72   selection after
5810: 20 72 65 63 65 69 76 69 6e 67 20 53 4e 49 20 65   receiving SNI e
5820: 78 74 65 6e 73 69 6f 6e 0a 20 2a 09 69 6e 20 43  xtension. *.in C
5830: 6c 69 65 6e 74 20 48 65 6c 6c 6f 2e 20 43 61 6c  lient Hello. Cal
5840: 6c 65 64 20 61 66 74 65 72 20 68 65 6c 6c 6f 20  led after hello 
5850: 63 61 6c 6c 62 61 63 6b 20 62 75 74 20 62 65 66  callback but bef
5860: 6f 72 65 20 41 4c 50 4e 20 63 61 6c 6c 62 61 63  ore ALPN callbac
5870: 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  k.. *. * Results
5880: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20  :. *.None. *. * 
5890: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
58a0: 09 43 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20  .Calls callback 
58b0: 28 69 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a  (if defined). *.
58c0: 20 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 73 3a   * Return codes:
58d0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
58e0: 52 52 5f 4f 4b 3a 20 53 4e 49 20 68 6f 73 74 6e  RR_OK: SNI hostn
58f0: 61 6d 65 20 69 73 20 61 63 63 65 70 74 65 64 2e  ame is accepted.
5900: 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   The connection 
5910: 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53  continues.. *.SS
5920: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45  L_TLSEXT_ERR_ALE
5930: 52 54 5f 46 41 54 41 4c 3a 20 53 4e 49 20 68 6f  RT_FATAL: SNI ho
5940: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
5950: 63 65 70 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e  cepted. The conn
5960: 65 63 74 69 6f 6e 0a 20 2a 09 20 20 20 20 69 73  ection. *.    is
5970: 20 61 62 6f 72 74 65 64 2e 20 44 65 66 61 75 6c   aborted. Defaul
5980: 74 20 66 6f 72 20 61 6c 65 72 74 20 69 73 20 53  t for alert is S
5990: 53 4c 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a  SL_AD_UNRECOGNIZ
59a0: 45 44 5f 4e 41 4d 45 2e 0a 20 2a 09 53 53 4c 5f  ED_NAME.. *.SSL_
59b0: 54 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54  TLSEXT_ERR_ALERT
59c0: 5f 57 41 52 4e 49 4e 47 3a 20 53 4e 49 20 68 6f  _WARNING: SNI ho
59d0: 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61 63  stname is not ac
59e0: 63 65 70 74 65 64 2c 20 77 61 72 6e 69 6e 67 20  cepted, warning 
59f0: 61 6c 65 72 74 0a 20 2a 09 20 20 20 20 73 65 6e  alert. *.    sen
5a00: 74 20 28 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  t (not supported
5a10: 20 69 6e 20 54 4c 53 76 31 2e 33 29 2e 20 54 68   in TLSv1.3). Th
5a20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5a30: 74 69 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54  tinues.. *.SSL_T
5a40: 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3a  LSEXT_ERR_NOACK:
5a50: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
5a60: 20 6e 6f 74 20 61 63 63 65 70 74 65 64 20 61 6e   not accepted an
5a70: 64 20 6e 6f 74 20 61 63 6b 6e 6f 77 6c 65 64 67  d not acknowledg
5a80: 65 64 2c 0a 20 2a 09 20 20 20 20 65 2e 67 2e 20  ed,. *.    e.g. 
5a90: 69 66 20 53 4e 49 20 68 61 73 20 6e 6f 74 20 62  if SNI has not b
5aa0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2e 20  een configured. 
5ab0: 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  The connection c
5ac0: 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20 2a 2d  ontinues.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b10: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
5b20: 74 0a 53 4e 49 43 61 6c 6c 62 61 63 6b 28 63 6f  t.SNICallback(co
5b30: 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c 20 69 6e  nst SSL *ssl, in
5b40: 74 20 2a 61 6c 65 72 74 2c 20 76 6f 69 64 20 2a  t *alert, void *
5b50: 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74 65  arg) {.    State
5b60: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
5b70: 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54 63  ate*)arg;.    Tc
5b80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5b90: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
5ba0: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
5bb0: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69 6e   *cmdPtr;.    in
5bc0: 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 20 20 20  t code, res;.   
5bd0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 65 72   const char *ser
5be0: 76 65 72 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a  vername = NULL;.
5bf0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
5c00: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
5c10: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20  (ssl == NULL || 
5c20: 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  arg == NULL) {..
5c30: 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58  return SSL_TLSEX
5c40: 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20  T_ERR_NOACK;.   
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   }..    /* Only 
5c60: 77 6f 72 6b 73 20 66 6f 72 20 54 4c 53 20 31 2e  works for TLS 1.
5c70: 32 20 61 6e 64 20 65 61 72 6c 69 65 72 20 2a 2f  2 and earlier */
5c80: 0a 20 20 20 20 73 65 72 76 65 72 6e 61 6d 65 20  .    servername 
5c90: 3d 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65 72  = SSL_get_server
5ca0: 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58 54  name(ssl, TLSEXT
5cb0: 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f 6e  _NAMETYPE_host_n
5cc0: 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 21 73  ame);.    if (!s
5cd0: 65 72 76 65 72 6e 61 6d 65 20 7c 7c 20 73 65 72  ervername || ser
5ce0: 76 65 72 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 5c  vername[0] == '\
5cf0: 30 27 29 20 7b 0a 09 72 65 74 75 72 6e 20 53 53  0') {..return SS
5d00: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e 4f 41  L_TLSEXT_ERR_NOA
5d10: 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  CK;.    }..    i
5d20: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d  f (statePtr->vcm
5d30: 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 4e  d == (Tcl_Obj*)N
5d40: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 53  ULL) {..return S
5d50: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
5d60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5d70: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
5d80: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
5d90: 63 68 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72  chan, and server
5da0: 20 6e 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20   name args */.  
5db0: 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44    cmdPtr = Tcl_D
5dc0: 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74  uplicateObj(stat
5dd0: 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20  ePtr->vcmd);.   
5de0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
5df0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
5e00: 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65  , cmdPtr, Tcl_Ne
5e10: 77 53 74 72 69 6e 67 4f 62 6a 28 22 73 6e 69 22  wStringObj("sni"
5e20: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
5e30: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
5e40: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
5e50: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
5e60: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
5e70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
5e80: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
5e90: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
5ea0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
5eb0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
5ec0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
5ed0: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 20 2c 20  bj(servername , 
5ee0: 2d 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76  -1));..    /* Ev
5ef0: 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d  al callback comm
5f00: 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  and */.    Tcl_I
5f10: 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50  ncrRefCount(cmdP
5f20: 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63 6f  tr);.    if ((co
5f30: 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61 63  de = EvalCallbac
5f40: 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  k(interp, stateP
5f50: 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20 31  tr, cmdPtr)) > 1
5f60: 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54  ) {..res = SSL_T
5f70: 4c 53 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f  LSEXT_ERR_ALERT_
5f80: 57 41 52 4e 49 4e 47 3b 0a 09 2a 61 6c 65 72 74  WARNING;..*alert
5f90: 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52 45 43 4f   = SSL_AD_UNRECO
5fa0: 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20 2f 2a 20  GNIZED_NAME; /* 
5fb0: 4e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 62 79  Not supported by
5fc0: 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20   TLS 1.3 */.    
5fd0: 7d 20 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20  } else if (code 
5fe0: 3d 3d 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53  == 1) {..res = S
5ff0: 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b  SL_TLSEXT_ERR_OK
6000: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6010: 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54  res = SSL_TLSEXT
6020: 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54 41 4c  _ERR_ALERT_FATAL
6030: 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  ;..*alert = SSL_
6040: 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f  AD_UNRECOGNIZED_
6050: 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75 70  NAME; /* Not sup
6060: 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31 2e  ported by TLS 1.
6070: 33 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 54  3 */.    }.    T
6080: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6090: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
60a0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
60b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
60f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6c 69 65  -----. *. * Clie
6100: 6e 74 48 65 6c 6c 6f 20 48 61 6e 64 73 68 61 6b  ntHello Handshak
6110: 65 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 53  e Callback for S
6120: 65 72 76 65 72 73 20 2d 2d 0a 20 2a 0a 20 2a 09  ervers --. *. *.
6130: 55 73 65 64 20 62 79 20 73 65 72 76 65 72 20 74  Used by server t
6140: 6f 20 65 78 61 6d 69 6e 65 20 74 68 65 20 73 65  o examine the se
6150: 72 76 65 72 20 6e 61 6d 65 20 69 6e 64 69 63 61  rver name indica
6160: 74 69 6f 6e 20 28 53 4e 49 29 20 65 78 74 65 6e  tion (SNI) exten
6170: 73 69 6f 6e 0a 20 2a 09 70 72 6f 76 69 64 65 64  sion. *.provided
6180: 20 62 79 20 74 68 65 20 63 6c 69 65 6e 74 20 69   by the client i
6190: 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 6c 65 63  n order to selec
61a0: 74 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  t an appropriate
61b0: 20 63 65 72 74 69 66 69 63 61 74 65 20 74 6f 0a   certificate to.
61c0: 20 2a 09 70 72 65 73 65 6e 74 2c 20 61 6e 64 20   *.present, and 
61d0: 6d 61 6b 65 20 6f 74 68 65 72 20 63 6f 6e 66 69  make other confi
61e0: 67 75 72 61 74 69 6f 6e 20 61 64 6a 75 73 74 6d  guration adjustm
61f0: 65 6e 74 73 20 72 65 6c 65 76 61 6e 74 20 74 6f  ents relevant to
6200: 20 74 68 61 74 20 73 65 72 76 65 72 0a 20 2a 09   that server. *.
6210: 6e 61 6d 65 20 61 6e 64 20 69 74 73 20 63 6f 6e  name and its con
6220: 66 69 67 75 72 61 74 69 6f 6e 2e 20 54 68 69 73  figuration. This
6230: 20 69 6e 63 6c 75 64 65 73 20 73 77 61 70 70 69   includes swappi
6240: 6e 67 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ng out the assoc
6250: 69 61 74 65 64 0a 20 2a 09 53 53 4c 5f 43 54 58  iated. *.SSL_CTX
6260: 20 70 6f 69 6e 74 65 72 2c 20 6d 6f 64 69 66 79   pointer, modify
6270: 69 6e 67 20 74 68 65 20 73 65 72 76 65 72 27 73  ing the server's
6280: 20 6c 69 73 74 20 6f 66 20 70 65 72 6d 69 74 74   list of permitt
6290: 65 64 20 54 4c 53 20 76 65 72 73 69 6f 6e 73 2c  ed TLS versions,
62a0: 0a 20 2a 09 63 68 61 6e 67 69 6e 67 20 74 68 65  . *.changing the
62b0: 20 73 65 72 76 65 72 27 73 20 63 69 70 68 65 72   server's cipher
62c0: 20 6c 69 73 74 20 69 6e 20 72 65 73 70 6f 6e 73   list in respons
62d0: 65 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 27  e to the client'
62e0: 73 20 63 69 70 68 65 72 20 6c 69 73 74 2c 20 65  s cipher list, e
62f0: 74 63 2e 0a 20 2a 09 43 61 6c 6c 65 64 20 62 65  tc.. *.Called be
6300: 66 6f 72 65 20 53 4e 49 20 61 6e 64 20 41 4c 50  fore SNI and ALP
6310: 4e 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 2a 0a  N callbacks.. *.
6320: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
6330: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
6340: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
6350: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
6360: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
6370: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
6380: 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52  L_CLIENT_HELLO_R
6390: 45 54 52 59 3a 20 73 75 73 70 65 6e 64 20 74 68  ETRY: suspend th
63a0: 65 20 68 61 6e 64 73 68 61 6b 65 2c 20 61 6e 64  e handshake, and
63b0: 20 74 68 65 20 68 61 6e 64 73 68 61 6b 65 20 66   the handshake f
63c0: 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65 74  unction will ret
63d0: 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a  urn immediately.
63e0: 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   *.SSL_CLIENT_HE
63f0: 4c 4c 4f 5f 45 52 52 4f 52 3a 20 66 61 69 6c 75  LLO_ERROR: failu
6400: 72 65 2c 20 74 65 72 6d 69 6e 61 74 65 20 63 6f  re, terminate co
6410: 6e 6e 65 63 74 69 6f 6e 2e 20 53 65 74 20 61 6c  nnection. Set al
6420: 65 72 74 20 74 6f 20 65 72 72 6f 72 20 63 6f 64  ert to error cod
6430: 65 2e 0a 20 2a 09 53 53 4c 5f 43 4c 49 45 4e 54  e.. *.SSL_CLIENT
6440: 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3a 20  _HELLO_SUCCESS: 
6450: 73 75 63 63 65 73 73 0a 20 2a 0a 20 2a 2d 2d 2d  success. *. *---
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64a0: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
64b0: 48 65 6c 6c 6f 43 61 6c 6c 62 61 63 6b 28 53 53  HelloCallback(SS
64c0: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
64d0: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
64e0: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
64f0: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
6500: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
6510: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
6520: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
6530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
6540: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
6550: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
6560: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
6570: 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
6580: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 3b 0a 20  igned char *p;. 
6590: 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 2c 20 72     size_t len, r
65a0: 65 6d 61 69 6e 69 6e 67 3b 0a 0a 20 20 20 20 64  emaining;..    d
65b0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
65c0: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  ;..    if (state
65d0: 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63  Ptr->vcmd == (Tc
65e0: 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09  l_Obj*)NULL) {..
65f0: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6600: 54 5f 48 45 4c 4c 4f 5f 53 55 43 43 45 53 53 3b  T_HELLO_SUCCESS;
6610: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
6620: 73 73 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 53 53  ssl == (const SS
6630: 4c 20 2a 29 4e 55 4c 4c 20 7c 7c 20 61 72 67 20  L *)NULL || arg 
6640: 3d 3d 20 28 76 6f 69 64 20 2a 29 4e 55 4c 4c 29  == (void *)NULL)
6650: 20 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43   {..return SSL_C
6660: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6670: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6680: 20 47 65 74 20 6e 61 6d 65 73 20 2a 2f 0a 20 20   Get names */.  
6690: 20 20 69 66 20 28 21 53 53 4c 5f 63 6c 69 65 6e    if (!SSL_clien
66a0: 74 5f 68 65 6c 6c 6f 5f 67 65 74 30 5f 65 78 74  t_hello_get0_ext
66b0: 28 73 73 6c 2c 20 54 4c 53 45 58 54 5f 54 59 50  (ssl, TLSEXT_TYP
66c0: 45 5f 73 65 72 76 65 72 5f 6e 61 6d 65 2c 20 26  E_server_name, &
66d0: 70 2c 20 26 72 65 6d 61 69 6e 69 6e 67 29 20 7c  p, &remaining) |
66e0: 7c 20 72 65 6d 61 69 6e 69 6e 67 20 3c 3d 20 32  | remaining <= 2
66f0: 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  ) {..*alert = SS
6700: 4c 5f 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f  L_R_SSLV3_ALERT_
6710: 49 4c 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45  ILLEGAL_PARAMETE
6720: 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43  R;..return SSL_C
6730: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6740: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
6750: 20 45 78 74 72 61 63 74 20 74 68 65 20 6c 65 6e   Extract the len
6760: 67 74 68 20 6f 66 20 74 68 65 20 73 75 70 70 6c  gth of the suppl
6770: 69 65 64 20 6c 69 73 74 20 6f 66 20 6e 61 6d 65  ied list of name
6780: 73 2e 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d 20  s. */.    len = 
6790: 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20  (*(p++) << 8);. 
67a0: 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29     len += *(p++)
67b0: 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20 2b 20  ;.    if (len + 
67c0: 32 20 21 3d 20 72 65 6d 61 69 6e 69 6e 67 29 20  2 != remaining) 
67d0: 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f  {..*alert = SSL_
67e0: 52 5f 53 53 4c 56 33 5f 41 4c 45 52 54 5f 49 4c  R_SSLV3_ALERT_IL
67f0: 4c 45 47 41 4c 5f 50 41 52 41 4d 45 54 45 52 3b  LEGAL_PARAMETER;
6800: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49  ..return SSL_CLI
6810: 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b  ENT_HELLO_ERROR;
6820: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69  .    }.    remai
6830: 6e 69 6e 67 20 3d 20 6c 65 6e 3b 0a 0a 20 20 20  ning = len;..   
6840: 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69 6e 20   /* The list in 
6850: 70 72 61 63 74 69 63 65 20 6f 6e 6c 79 20 68 61  practice only ha
6860: 73 20 61 20 73 69 6e 67 6c 65 20 65 6c 65 6d 65  s a single eleme
6870: 6e 74 2c 20 73 6f 20 77 65 20 6f 6e 6c 79 20 63  nt, so we only c
6880: 6f 6e 73 69 64 65 72 20 74 68 65 20 66 69 72 73  onsider the firs
6890: 74 20 6f 6e 65 2e 20 2a 2f 0a 20 20 20 20 69 66  t one. */.    if
68a0: 20 28 72 65 6d 61 69 6e 69 6e 67 20 3d 3d 20 30   (remaining == 0
68b0: 20 7c 7c 20 2a 70 2b 2b 20 21 3d 20 54 4c 53 45   || *p++ != TLSE
68c0: 58 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74  XT_NAMETYPE_host
68d0: 5f 6e 61 6d 65 29 20 7b 0a 09 2a 61 6c 65 72 74  _name) {..*alert
68e0: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
68f0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6900: 52 4f 52 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c  ROR;..return SSL
6910: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
6920: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
6930: 65 6d 61 69 6e 69 6e 67 2d 2d 3b 0a 0a 20 20 20  emaining--;..   
6940: 20 2f 2a 20 4e 6f 77 20 77 65 20 63 61 6e 20 66   /* Now we can f
6950: 69 6e 61 6c 6c 79 20 70 75 6c 6c 20 6f 75 74 20  inally pull out 
6960: 74 68 65 20 62 79 74 65 20 61 72 72 61 79 20 77  the byte array w
6970: 69 74 68 20 74 68 65 20 61 63 74 75 61 6c 20 68  ith the actual h
6980: 6f 73 74 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  ostname. */.    
6990: 69 66 20 28 72 65 6d 61 69 6e 69 6e 67 20 3c 3d  if (remaining <=
69a0: 20 32 29 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20   2) {..*alert = 
69b0: 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52  SSL_R_TLSV1_ALER
69c0: 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52  T_INTERNAL_ERROR
69d0: 3b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c  ;..return SSL_CL
69e0: 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52  IENT_HELLO_ERROR
69f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20  ;.    }.    len 
6a00: 3d 20 28 2a 28 70 2b 2b 29 20 3c 3c 20 38 29 3b  = (*(p++) << 8);
6a10: 0a 20 20 20 20 6c 65 6e 20 2b 3d 20 2a 28 70 2b  .    len += *(p+
6a20: 2b 29 3b 0a 20 20 20 20 69 66 20 28 6c 65 6e 20  +);.    if (len 
6a30: 2b 20 32 20 3e 20 72 65 6d 61 69 6e 69 6e 67 29  + 2 > remaining)
6a40: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
6a50: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6a60: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6a70: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6a80: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6a90: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6aa0: 6e 67 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 73 65  ng = len;.    se
6ab0: 72 76 65 72 6e 61 6d 65 20 3d 20 28 63 6f 6e 73  rvername = (cons
6ac0: 74 20 63 68 61 72 20 2a 29 70 3b 0a 0a 20 20 20  t char *)p;..   
6ad0: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61   /* Create comma
6ae0: 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20  nd to eval with 
6af0: 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 73 65  fn, chan, and se
6b00: 72 76 65 72 20 6e 61 6d 65 20 61 72 67 73 20 2a  rver name args *
6b10: 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d 20 54  /.    cmdPtr = T
6b20: 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
6b30: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b  statePtr->vcmd);
6b40: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
6b50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
6b60: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
6b70: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
6b80: 68 65 6c 6c 6f 22 2c 20 2d 31 29 29 3b 0a 20 20  hello", -1));.  
6b90: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
6ba0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
6bb0: 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20 20  p, cmdPtr,..    
6bc0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
6bd0: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e  (Tcl_GetChannelN
6be0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
6bf0: 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  lf), -1));.    T
6c00: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6c10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6c20: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6c30: 74 72 69 6e 67 4f 62 6a 28 73 65 72 76 65 72 6e  tringObj(servern
6c40: 61 6d 65 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  ame, (Tcl_Size) 
6c50: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45  len));..    /* E
6c60: 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d  val callback com
6c70: 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  mand */.    Tcl_
6c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  IncrRefCount(cmd
6c90: 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 28 63  Ptr);.    if ((c
6ca0: 6f 64 65 20 3d 20 45 76 61 6c 43 61 6c 6c 62 61  ode = EvalCallba
6cb0: 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  ck(interp, state
6cc0: 50 74 72 2c 20 63 6d 64 50 74 72 29 29 20 3e 20  Ptr, cmdPtr)) > 
6cd0: 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  1) {..res = SSL_
6ce0: 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54  CLIENT_HELLO_RET
6cf0: 52 59 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53  RY;..*alert = SS
6d00: 4c 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f  L_R_TLSV1_ALERT_
6d10: 55 53 45 52 5f 43 41 4e 43 45 4c 4c 45 44 3b 0a  USER_CANCELLED;.
6d20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
6d30: 6f 64 65 20 3d 3d 20 31 29 20 7b 0a 09 72 65 73  ode == 1) {..res
6d40: 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45   = SSL_CLIENT_HE
6d50: 4c 4c 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20  LLO_SUCCESS;.   
6d60: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
6d70: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6d80: 4f 5f 45 52 52 4f 52 3b 0a 09 2a 61 6c 65 72 74  O_ERROR;..*alert
6d90: 20 3d 20 53 53 4c 5f 52 5f 54 4c 53 56 31 5f 41   = SSL_R_TLSV1_A
6da0: 4c 45 52 54 5f 49 4e 54 45 52 4e 41 4c 5f 45 52  LERT_INTERNAL_ER
6db0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ROR;.    }.    T
6dc0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
6dd0: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 72 65 74  cmdPtr);.    ret
6de0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 2a  urn res;.}.../**
6df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e00: 2a 2a 2f 0a 2f 2a 20 43 6f 6d 6d 61 6e 64 73 20  **/./* Commands 
6e10: 20 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a          */./****
6e20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6e30: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  /../*. *--------
6e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
6e80: 2a 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 20  * CiphersObjCmd 
6e90: 2d 2d 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c  -- list availabl
6ea0: 65 20 63 69 70 68 65 72 73 0a 20 2a 0a 20 2a 09  e ciphers. *. *.
6eb0: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
6ec0: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
6ed0: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 63  cess the "tls::c
6ee0: 69 70 68 65 72 73 22 20 63 6f 6d 6d 61 6e 64 0a  iphers" command.
6ef0: 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c   *.to list avail
6f00: 61 62 6c 65 20 63 69 70 68 65 72 73 2c 20 62 61  able ciphers, ba
6f10: 73 65 64 20 75 70 6f 6e 20 70 72 6f 74 6f 63 6f  sed upon protoco
6f20: 6c 20 73 65 6c 65 63 74 65 64 2e 0a 20 2a 0a 20  l selected.. *. 
6f30: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
6f40: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
6f50: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
6f60: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
6f70: 09 63 6f 6e 73 74 72 75 63 74 73 20 61 6e 64 20  .constructs and 
6f80: 64 65 73 74 72 6f 79 73 20 53 53 4c 20 63 6f 6e  destroys SSL con
6f90: 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20 2a  text (CTX). *. *
6fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6fe0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63  ---. */.static c
6ff0: 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 74 6f  onst char *proto
7000: 63 6f 6c 73 5b 5d 20 3d 20 7b 0a 09 22 73 73 6c  cols[] = {.."ssl
7010: 32 22 2c 20 22 73 73 6c 33 22 2c 20 22 74 6c 73  2", "ssl3", "tls
7020: 31 22 2c 20 22 74 6c 73 31 2e 31 22 2c 20 22 74  1", "tls1.1", "t
7030: 6c 73 31 2e 32 22 2c 20 22 74 6c 73 31 2e 33 22  ls1.2", "tls1.3"
7040: 2c 20 4e 55 4c 4c 0a 7d 3b 0a 65 6e 75 6d 20 70  , NULL.};.enum p
7050: 72 6f 74 6f 63 6f 6c 20 7b 0a 20 20 20 20 54 4c  rotocol {.    TL
7060: 53 5f 53 53 4c 32 2c 20 54 4c 53 5f 53 53 4c 33  S_SSL2, TLS_SSL3
7070: 2c 20 54 4c 53 5f 54 4c 53 31 2c 20 54 4c 53 5f  , TLS_TLS1, TLS_
7080: 54 4c 53 31 5f 31 2c 20 54 4c 53 5f 54 4c 53 31  TLS1_1, TLS_TLS1
7090: 5f 32 2c 20 54 4c 53 5f 54 4c 53 31 5f 33 2c 20  _2, TLS_TLS1_3, 
70a0: 54 4c 53 5f 4e 4f 4e 45 0a 7d 3b 0a 0a 73 74 61  TLS_NONE.};..sta
70b0: 74 69 63 20 69 6e 74 0a 43 69 70 68 65 72 73 4f  tic int.CiphersO
70c0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
70d0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
70e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
70f0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
7100: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
7110: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  ) {.    Tcl_Obj 
7120: 2a 6f 62 6a 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  *objPtr = NULL;.
7130: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
7140: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53 4c   = NULL;.    SSL
7150: 20 2a 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20   *ssl = NULL;.  
7160: 20 20 53 54 41 43 4b 5f 4f 46 28 53 53 4c 5f 43    STACK_OF(SSL_C
7170: 49 50 48 45 52 29 20 2a 73 6b 3b 0a 20 20 20 20  IPHER) *sk;.    
7180: 63 68 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d  char buf[BUFSIZ]
7190: 3b 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 2c  ;.    int index,
71a0: 20 76 65 72 62 6f 73 65 20 3d 20 30 2c 20 75 73   verbose = 0, us
71b0: 65 5f 73 75 70 70 6f 72 74 65 64 20 3d 20 30 3b  e_supported = 0;
71c0: 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d  .    const SSL_M
71d0: 45 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20  ETHOD *method;. 
71e0: 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74     (void) client
71f0: 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Data;..    dprin
7200: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
7210: 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3c 20 32     if ((objc < 2
7220: 29 20 7c 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29  ) || (objc > 4))
7230: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
7240: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
7250: 6f 62 6a 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20  objv, "protocol 
7260: 3f 76 65 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f  ?verbose? ?suppo
7270: 72 74 65 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e  rted?");..return
7280: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
7290: 7d 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65  }.    if (Tcl_Ge
72a0: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
72b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70  terp, objv[1], p
72c0: 72 6f 74 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f  rotocols, "proto
72d0: 63 6f 6c 22 2c 20 30 2c 20 26 69 6e 64 65 78 29  col", 0, &index)
72e0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
72f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7300: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 28  .    }.    if ((
7310: 6f 62 6a 63 20 3e 20 32 29 20 26 26 20 54 63 6c  objc > 2) && Tcl
7320: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
7330: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
7340: 32 5d 2c 20 26 76 65 72 62 6f 73 65 29 20 21 3d  2], &verbose) !=
7350: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7360: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7370: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7380: 63 20 3e 20 33 29 20 26 26 20 54 63 6c 5f 47 65  c > 3) && Tcl_Ge
7390: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
73a0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
73b0: 20 26 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29   &use_supported)
73c0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72   != TCL_OK) {..r
73d0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
73e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
73f0: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
7400: 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
7410: 6d 20 70 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78  m protocol)index
7420: 29 20 7b 0a 09 63 61 73 65 20 54 4c 53 5f 53 53  ) {..case TLS_SS
7430: 4c 32 3a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  L2:.#if OPENSSL_
7440: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
7450: 3d 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c  = 0x10100000L ||
7460: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32   defined(NO_SSL2
7470: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7480: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20  NSSL_NO_SSL2).. 
7490: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
74a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
74b0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
74c0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
74d0: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
74e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
74f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7500: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7510: 6f 64 20 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f  od = SSLv2_metho
7520: 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64  d(); break;.#end
7530: 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c  if..case TLS_SSL
7540: 33 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  3:.#if defined(N
7550: 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e  O_SSL3) || defin
7560: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ed(OPENSSL_NO_SS
7570: 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  L3) || defined(O
7580: 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d  PENSSL_NO_SSL3_M
7590: 45 54 48 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f  ETHOD)..    Tcl_
75a0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
75b0: 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69  erp, protocols[i
75c0: 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63  ndex], ": protoc
75d0: 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  ol not supported
75e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
75f0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
7600: 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a  CL_ERROR;.#else.
7610: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53 53  .    method = SS
7620: 4c 76 33 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72  Lv3_method(); br
7630: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73  eak;.#endif..cas
7640: 65 20 54 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20  e TLS_TLS1:.#if 
7650: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
7660: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7670: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20  SSL_NO_TLS1) || 
7680: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
7690: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
76a0: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
76b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72  esult(interp, pr
76c0: 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20  otocols[index], 
76d0: 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  ": protocol not 
76e0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
76f0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
7700: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7710: 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65  R;.#else..    me
7720: 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74  thod = TLSv1_met
7730: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7740: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7750: 4c 53 31 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_1:.#if defin
7760: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
7770: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7780: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64  _NO_TLS1_1) || d
7790: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
77a0: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
77b0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
77c0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
77d0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
77e0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
77f0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
7800: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7810: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7820: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7830: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f  ethod = TLSv1_1_
7840: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7850: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7860: 53 5f 54 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65  S_TLS1_2:.#if de
7870: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29  fined(NO_TLS1_2)
7880: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7890: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  SSL_NO_TLS1_2) |
78a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
78b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
78c0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
78d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
78e0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
78f0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
7900: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
7910: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7920: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7930: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7940: 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c 53 76 31    method = TLSv1
7950: 5f 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65  _2_method(); bre
7960: 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65  ak;.#endif..case
7970: 20 54 4c 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66   TLS_TLS1_3:.#if
7980: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
7990: 5f 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f  _3) || defined(O
79a0: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
79b0: 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  )..    Tcl_Appen
79c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
79d0: 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d  protocols[index]
79e0: 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  , ": protocol no
79f0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
7a00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
7a10: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
7a20: 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20  ROR;.#else..    
7a30: 6d 65 74 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74  method = TLS_met
7a40: 68 6f 64 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f  hod();..    SSL_
7a50: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
7a60: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54  o_version(ctx, T
7a70: 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a  LS1_3_VERSION);.
7a80: 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
7a90: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
7aa0: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
7ab0: 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72  ERSION);..    br
7ac0: 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66  eak;.#endif..def
7ad0: 61 75 6c 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f  ault:..    metho
7ae0: 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29  d = TLS_method()
7af0: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;..    break;.  
7b00: 20 20 7d 0a 0a 20 20 20 20 63 74 78 20 3d 20 53    }..    ctx = S
7b10: 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f  SL_CTX_new(metho
7b20: 64 29 3b 0a 20 20 20 20 69 66 20 28 63 74 78 20  d);.    if (ctx 
7b30: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
7b40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
7b50: 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  erp, GET_ERR_REA
7b60: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
7b70: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
7b80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
7b90: 0a 20 20 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e  .    ssl = SSL_n
7ba0: 65 77 28 63 74 78 29 3b 0a 20 20 20 20 69 66 20  ew(ctx);.    if 
7bb0: 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  (ssl == NULL) {.
7bc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
7bd0: 74 28 69 6e 74 65 72 70 2c 20 47 45 54 5f 45 52  t(interp, GET_ER
7be0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
7bf0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
7c00: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
7c10: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
7c20: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
7c30: 20 55 73 65 20 6c 69 73 74 20 61 6e 64 20 6f 72   Use list and or
7c40: 64 65 72 20 61 73 20 77 6f 75 6c 64 20 62 65 20  der as would be 
7c50: 73 65 6e 74 20 69 6e 20 61 20 43 6c 69 65 6e 74  sent in a Client
7c60: 48 65 6c 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61  Hello or all ava
7c70: 69 6c 61 62 6c 65 20 63 69 70 68 65 72 73 20 2a  ilable ciphers *
7c80: 2f 0a 20 20 20 20 69 66 20 28 75 73 65 5f 73 75  /.    if (use_su
7c90: 70 70 6f 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d  pported) {..sk =
7ca0: 20 53 53 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72   SSL_get1_suppor
7cb0: 74 65 64 5f 63 69 70 68 65 72 73 28 73 73 6c 29  ted_ciphers(ssl)
7cc0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
7cd0: 73 6b 20 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70  sk = SSL_get_cip
7ce0: 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d  hers(ssl);.    }
7cf0: 0a 0a 20 20 20 20 69 66 20 28 73 6b 20 21 3d 20  ..    if (sk != 
7d00: 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 21 76 65  NULL) {..if (!ve
7d10: 72 62 6f 73 65 29 20 7b 0a 09 20 20 20 20 63 6f  rbose) {..    co
7d20: 6e 73 74 20 63 68 61 72 20 2a 63 70 3b 0a 09 20  nst char *cp;.. 
7d30: 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
7d40: 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
7d50: 4c 4c 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69  LL);..    for (i
7d60: 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
7d70: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28  _SSL_CIPHER_num(
7d80: 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f  sk); i++) {...co
7d90: 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a  nst SSL_CIPHER *
7da0: 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45  c = sk_SSL_CIPHE
7db0: 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a  R_value(sk, i);.
7dc0: 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29  ..if (c == NULL)
7dd0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a   continue;..../*
7de0: 20 63 69 70 68 65 72 20 6e 61 6d 65 20 6f 72 20   cipher name or 
7df0: 28 4e 4f 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d  (NONE) */...cp =
7e00: 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
7e10: 6e 61 6d 65 28 63 29 3b 0a 09 09 69 66 20 28 63  name(c);...if (c
7e20: 70 20 3d 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b  p == NULL) break
7e30: 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;...Tcl_ListObjA
7e40: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
7e50: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
7e60: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
7e70: 68 61 72 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b  har *) cp, -1));
7e80: 0a 09 20 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65  ..    }...} else
7e90: 20 7b 0a 09 20 20 20 20 6f 62 6a 50 74 72 20 3d   {..    objPtr =
7ea0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
7eb0: 6a 28 22 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f  j("",0);..    fo
7ec0: 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20  r (int i = 0; i 
7ed0: 3c 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  < sk_SSL_CIPHER_
7ee0: 6e 75 6d 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a  num(sk); i++) {.
7ef0: 09 09 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48  ..const SSL_CIPH
7f00: 45 52 20 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43  ER *c = sk_SSL_C
7f10: 49 50 48 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20  IPHER_value(sk, 
7f20: 69 29 3b 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e  i);...if (c == N
7f30: 55 4c 4c 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a  ULL) continue;..
7f40: 09 09 2f 2a 20 74 65 78 74 75 61 6c 20 64 65 73  ../* textual des
7f50: 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20  cription of the 
7f60: 63 69 70 68 65 72 20 2a 2f 0a 09 09 69 66 20 28  cipher */...if (
7f70: 53 53 4c 5f 43 49 50 48 45 52 5f 64 65 73 63 72  SSL_CIPHER_descr
7f80: 69 70 74 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73  iption(c, buf, s
7f90: 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d 20 4e  izeof(buf)) != N
7fa0: 55 4c 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c  ULL) {...    Tcl
7fb0: 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a  _AppendToObj(obj
7fc0: 50 74 72 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53  Ptr, buf, (Tcl_S
7fd0: 69 7a 65 29 20 73 74 72 6c 65 6e 28 62 75 66 29  ize) strlen(buf)
7fe0: 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
7ff0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f      Tcl_AppendTo
8000: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b  Obj(objPtr, "UNK
8010: 4e 4f 57 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d  NOWN\n", 8);...}
8020: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28  ..    }..}..if (
8030: 75 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 7b  use_supported) {
8040: 0a 09 20 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50  ..    sk_SSL_CIP
8050: 48 45 52 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d  HER_free(sk);..}
8060: 0a 20 20 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66  .    }.    SSL_f
8070: 72 65 65 28 73 73 6c 29 3b 0a 20 20 20 20 53 53  ree(ssl);.    SS
8080: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
8090: 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
80a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
80b0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
80c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
80d0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 0a 20 2a 0a 20 2a 20 50 72  -------. *. * Pr
8120: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d  otocolsObjCmd --
8130: 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20   list available 
8140: 70 72 6f 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09  protocols. *. *.
8150: 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 69  This procedure i
8160: 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f  s invoked to pro
8170: 63 65 73 73 20 74 68 65 20 22 74 6c 73 3a 3a 70  cess the "tls::p
8180: 72 6f 74 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e  rotocols" comman
8190: 64 0a 20 2a 09 74 6f 20 6c 69 73 74 20 61 76 61  d. *.to list ava
81a0: 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73  ilable protocols
81b0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
81c0: 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
81d0: 63 6c 20 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a  cl result list..
81e0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
81f0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
8200: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8240: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
8250: 69 6e 74 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  int.ProtocolsObj
8260: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63  Cmd(ClientData c
8270: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49  lientData, Tcl_I
8280: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
8290: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a  nt objc, Tcl_Obj
82a0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20   *const objv[]) 
82b0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  {.    Tcl_Obj *o
82c0: 62 6a 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64  bjPtr;.    (void
82d0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20  ) clientData;.. 
82e0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
82f0: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f  ed");..    if (o
8300: 62 6a 63 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c  bjc != 1) {..Tcl
8310: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
8320: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
8330: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
8340: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
8350: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
8360: 72 28 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72  r();..    objPtr
8370: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
8380: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66  j(0, NULL);..#if
8390: 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
83a0: 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30  _NUMBER < 0x1010
83b0: 30 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65  0000L && !define
83c0: 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64  d(NO_SSL2) && !d
83d0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
83e0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f  O_SSL2).    Tcl_
83f0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8400: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
8410: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
8420: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
8430: 54 4c 53 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b  TLS_SSL2], -1));
8440: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
8450: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
8460: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
8470: 4c 5f 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  L_NO_SSL3) && !d
8480: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8490: 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20  O_SSL3_METHOD). 
84a0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
84b0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
84c0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
84d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
84e0: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d  tocols[TLS_SSL3]
84f0: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8500: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8510: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
8520: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
8530: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8540: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45  ENSSL_NO_TLS1_ME
8550: 54 48 4f 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69  THOD).    Tcl_Li
8560: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
8570: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  nt(interp, objPt
8580: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
8590: 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c  Obj(protocols[TL
85a0: 53 5f 54 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23  S_TLS1], -1));.#
85b0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
85c0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26  ed(NO_TLS1_1) &&
85d0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
85e0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  L_NO_TLS1_1) && 
85f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
8600: 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f  _NO_TLS1_1_METHO
8610: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8620: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8630: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8640: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
8650: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
8660: 4c 53 31 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65  LS1_1], -1));.#e
8670: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8680: 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20  d(NO_TLS1_2) && 
8690: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
86a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  _NO_TLS1_2) && !
86b0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
86c0: 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44  NO_TLS1_2_METHOD
86d0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
86e0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
86f0: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8700: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8710: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c  protocols[TLS_TL
8720: 53 31 5f 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e  S1_2], -1));.#en
8730: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
8740: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
8750: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8760: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 54  NO_TLS1_3).    T
8770: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
8780: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
8790: 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  objPtr, Tcl_NewS
87a0: 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f  tringObj(protoco
87b0: 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20  ls[TLS_TLS1_3], 
87c0: 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  -1));.#endif..  
87d0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
87e0: 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
87f0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
8800: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
8810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8850: 2d 2d 2d 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68  ---. *. * Handsh
8860: 61 6b 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  akeObjCmd --. *.
8870: 20 2a 09 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20   *.This command 
8880: 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69 66  is used to verif
8890: 79 20 77 68 65 74 68 65 72 20 74 68 65 20 68 61  y whether the ha
88a0: 6e 64 73 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c  ndshake is compl
88b0: 65 74 65 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20  ete. *.or not.. 
88c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
88d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
88e0: 72 65 73 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20  result. 1 means 
88f0: 68 61 6e 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65  handshake comple
8900: 74 65 2c 20 30 20 6d 65 61 6e 73 20 70 65 6e 64  te, 0 means pend
8910: 69 6e 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ing.. *. * Side 
8920: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20  effects:. *.May 
8930: 66 6f 72 63 65 20 53 53 4c 20 6e 65 67 6f 74 69  force SSL negoti
8940: 61 74 69 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c  ation to take pl
8950: 61 63 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ace.. *. *------
8960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
89a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 48 61 6e  /.static int Han
89b0: 64 73 68 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69  dshakeObjCmd(Cli
89c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
89d0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ta, Tcl_Interp *
89e0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63  interp, int objc
89f0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74  , Tcl_Obj *const
8a00: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54   objv[]) {.    T
8a10: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b  cl_Channel chan;
8a20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
8a30: 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74 20 61 20  hannel to set a 
8a40: 6d 6f 64 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20  mode on. */.    
8a50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
8a60: 20 20 20 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e          /* clien
8a70: 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20  t state for ssl 
8a80: 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f  socket */.    co
8a90: 6e 73 74 20 63 68 61 72 20 2a 65 72 72 53 74 72  nst char *errStr
8aa0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
8ab0: 20 72 65 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e   ret = 1;.    in
8ac0: 74 20 65 72 72 20 3d 20 30 3b 0a 20 20 20 20 28  t err = 0;.    (
8ad0: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
8ae0: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
8af0: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
8b00: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a  f (objc != 2) {.
8b10: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
8b20: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
8b30: 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  v, "channel");..
8b40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8b50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
8b60: 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
8b70: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
8b80: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
8b90: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
8ba0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
8bb0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
8bc0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
8bd0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
8be0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8bf0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
8c00: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
8c10: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
8c20: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
8c30: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
8c40: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
8c50: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e  if (Tcl_GetChann
8c60: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20  elType(chan) != 
8c70: 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28  Tls_ChannelType(
8c80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
8c90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8ca0: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
8cb0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
8cc0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 20  ame(chan),..    
8cd0: 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
8ce0: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
8cf0: 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
8d00: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
8d10: 70 2c 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53  p, "TLS", "HANDS
8d20: 48 41 4b 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22  HAKE", "CHANNEL"
8d30: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
8d40: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
8d50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8d60: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50      }.    stateP
8d70: 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 54 63  tr = (State *)Tc
8d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74  l_GetChannelInst
8d90: 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a  anceData(chan);.
8da0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
8db0: 6c 6c 69 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f  lling Tls_WaitFo
8dc0: 72 43 6f 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20  rConnect");.    
8dd0: 72 65 74 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f  ret = Tls_WaitFo
8de0: 72 43 6f 6e 6e 65 63 74 28 73 74 61 74 65 50 74  rConnect(statePt
8df0: 72 2c 20 26 65 72 72 2c 20 31 29 3b 0a 20 20 20  r, &err, 1);.   
8e00: 20 64 70 72 69 6e 74 66 28 22 54 6c 73 5f 57 61   dprintf("Tls_Wa
8e10: 69 74 46 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74  itForConnect ret
8e20: 75 72 6e 65 64 3a 20 25 69 22 2c 20 72 65 74 29  urned: %i", ret)
8e30: 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 74 20 3c  ;..    if (ret <
8e40: 20 30 20 26 26 20 28 28 73 74 61 74 65 50 74 72   0 && ((statePtr
8e50: 2d 3e 66 6c 61 67 73 20 26 20 54 4c 53 5f 54 43  ->flags & TLS_TC
8e60: 4c 5f 41 53 59 4e 43 29 20 26 26 20 28 65 72 72  L_ASYNC) && (err
8e70: 20 3d 3d 20 45 41 47 41 49 4e 29 29 29 20 7b 0a   == EAGAIN))) {.
8e80: 09 64 70 72 69 6e 74 66 28 22 41 73 79 6e 63 20  .dprintf("Async 
8e90: 73 65 74 20 61 6e 64 20 65 72 72 20 3d 20 45 41  set and err = EA
8ea0: 47 41 49 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30  GAIN");..ret = 0
8eb0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
8ec0: 28 72 65 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e  (ret < 0) {..lon
8ed0: 67 20 72 65 73 75 6c 74 3b 0a 09 65 72 72 53 74  g result;..errSt
8ee0: 72 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 65 72  r = statePtr->er
8ef0: 72 3b 0a 09 54 63 6c 5f 52 65 73 65 74 52 65 73  r;..Tcl_ResetRes
8f00: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 54 63  ult(interp);..Tc
8f10: 6c 5f 53 65 74 45 72 72 6e 6f 28 65 72 72 29 3b  l_SetErrno(err);
8f20: 0a 0a 09 69 66 20 28 21 65 72 72 53 74 72 20 7c  ...if (!errStr |
8f30: 7c 20 28 2a 65 72 72 53 74 72 20 3d 3d 20 30 29  | (*errStr == 0)
8f40: 29 20 7b 0a 09 20 20 20 20 65 72 72 53 74 72 20  ) {..    errStr 
8f50: 3d 20 54 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72  = Tcl_PosixError
8f60: 28 69 6e 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54  (interp);..}...T
8f70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
8f80: 69 6e 74 65 72 70 2c 20 22 68 61 6e 64 73 68 61  interp, "handsha
8f90: 6b 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 65 72  ke failed: ", er
8fa0: 72 53 74 72 2c 20 28 63 68 61 72 20 2a 29 20 4e  rStr, (char *) N
8fb0: 55 4c 4c 29 3b 0a 09 69 66 20 28 28 72 65 73 75  ULL);..if ((resu
8fc0: 6c 74 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72  lt = SSL_get_ver
8fd0: 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65  ify_result(state
8fe0: 50 74 72 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35  Ptr->ssl)) != X5
8ff0: 30 39 5f 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20  09_V_OK) {..    
9000: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9010: 28 69 6e 74 65 72 70 2c 20 22 20 64 75 65 20 74  (interp, " due t
9020: 6f 20 5c 22 22 2c 20 58 35 30 39 5f 76 65 72 69  o \"", X509_veri
9030: 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74  fy_cert_error_st
9040: 72 69 6e 67 28 72 65 73 75 6c 74 29 2c 20 22 5c  ring(result), "\
9050: 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  "", (char *) NUL
9060: 4c 29 3b 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45  L);..}..Tcl_SetE
9070: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
9080: 20 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41   "TLS", "HANDSHA
9090: 4b 45 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  KE", "FAILED", (
90a0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
90b0: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
90c0: 6e 67 20 54 43 4c 5f 45 52 52 4f 52 20 77 69 74  ng TCL_ERROR wit
90d0: 68 20 68 61 6e 64 73 68 61 6b 65 20 66 61 69 6c  h handshake fail
90e0: 65 64 3a 20 25 73 22 2c 20 65 72 72 53 74 72 29  ed: %s", errStr)
90f0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9100: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ROR;.    } else 
9110: 7b 0a 09 69 66 20 28 65 72 72 20 21 3d 20 30 29  {..if (err != 0)
9120: 20 7b 0a 09 20 20 20 20 64 70 72 69 6e 74 66 28   {..    dprintf(
9130: 22 47 6f 74 20 61 6e 20 65 72 72 6f 72 20 77 69  "Got an error wi
9140: 74 68 20 61 20 63 6f 6d 70 6c 65 74 65 64 20 68  th a completed h
9150: 61 6e 64 73 68 61 6b 65 3a 20 65 72 72 20 3d 20  andshake: err = 
9160: 25 69 22 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72  %i", err);..}..r
9170: 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20  et = 1;.    }.. 
9180: 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
9190: 72 6e 69 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74  rning TCL_OK wit
91a0: 68 20 64 61 74 61 20 5c 22 25 69 5c 22 22 2c 20  h data \"%i\"", 
91b0: 72 65 74 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ret);.    Tcl_Se
91c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
91d0: 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
91e0: 28 72 65 74 29 29 3b 0a 20 20 20 20 72 65 74 75  (ret));.    retu
91f0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
9200: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
9210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d  -------. *. * Im
9250: 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a  portObjCmd --. *
9260: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
9270: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
9280: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73   process the "ss
9290: 6c 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a  l" command. *. *
92a0: 09 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64  .The ssl command
92b0: 20 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72   pushes SSL over
92c0: 20 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63   a (newly connec
92d0: 74 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a  ted) tcp socket.
92e0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
92f0: 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
9300: 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53   result.. *. * S
9310: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
9320: 4d 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62  May modify the b
9330: 65 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f  ehavior of an IO
9340: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d   channel.. *. *-
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  --. */.static in
93a0: 74 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43  t.ImportObjCmd(C
93b0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
93c0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
93d0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
93e0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
93f0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
9400: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
9410: 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
9420: 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
9430: 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74   on. */.    Stat
9440: 65 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a  e *statePtr;../*
9450: 20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f   client state fo
9460: 72 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a  r ssl socket */.
9470: 20 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78      SSL_CTX *ctx
9480: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9490: 6c 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d  l_Obj *script..=
94a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
94b0: 62 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20  bj *password..= 
94c0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
94d0: 6a 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b  j *vcmd..= NULL;
94e0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
94f0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61   upperChannelTra
9500: 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43  nslation, upperC
9510: 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20  hannelBlocking, 
9520: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
9530: 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e  ding, upperChann
9540: 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69  elEOFChar;.    i
9550: 6e 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f  nt idx;.    Tcl_
9560: 53 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e  Size len;.    in
9570: 74 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f  t flags...= TLS_
9580: 54 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e  TCL_INIT;.    in
9590: 74 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09  t server...= 0;.
95a0: 2f 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e  /* is connection
95b0: 20 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74   incoming or out
95c0: 67 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68  going? */.    ch
95d0: 61 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e  ar *keyfile..= N
95e0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63  ULL;.    char *c
95f0: 65 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b  ertfile..= NULL;
9600: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
9610: 61 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b  ar *key..= NULL;
9620: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65  .    Tcl_Size ke
9630: 79 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20  y_len..= 0;.    
9640: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63  unsigned char *c
9650: 65 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ert..= NULL;.   
9660: 20 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c   Tcl_Size cert_l
9670: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61  en..= 0;.    cha
9680: 72 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55  r *ciphers..= NU
9690: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69  LL;.    char *ci
96a0: 70 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55  phersuites..= NU
96b0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41  LL;.    char *CA
96c0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
96d0: 20 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09    char *CApath..
96e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
96f0: 20 2a 43 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c   *CAstore..= NUL
9700: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70  L;.    char *DHp
9710: 61 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20  arams..= NULL;. 
9720: 20 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09     char *model..
9730: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61  .= NULL;.    cha
9740: 72 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d  r *servername..=
9750: 20 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61   NULL;./* hostna
9760: 6d 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61  me for Server Na
9770: 6d 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f  me Indication */
9780: 0a 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69  .    char *sessi
9790: 6f 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  on_id..= NULL;. 
97a0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e     Tcl_Obj *alpn
97b0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e  ..= NULL;.    in
97c0: 74 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33  t ssl2 = 0, ssl3
97d0: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c   = 0;.    int tl
97e0: 73 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d  s1 = 1, tls1_1 =
97f0: 20 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20   1, tls1_2 = 1, 
9800: 74 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20  tls1_3 = 1;.    
9810: 69 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c  int proto = 0, l
9820: 65 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  evel = -1;.    i
9830: 6e 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72  nt verify = 0, r
9840: 65 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75  equire = 0, requ
9850: 65 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61  est = 1, post_ha
9860: 6e 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20  ndshake = 0;.   
9870: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
9880: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
9890: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
98a0: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31   defined(NO_TLS1
98b0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
98c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20  NSSL_NO_TLS1).  
98d0: 20 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64    tls1 = 0;.#end
98e0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
98f0: 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66  O_TLS1_1) || def
9900: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
9910: 54 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31  TLS1_1).    tls1
9920: 5f 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  _1 = 0;.#endif.#
9930: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
9940: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
9950: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
9960: 5f 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d  _2).    tls1_2 =
9970: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64   0;.#endif.#if d
9980: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
9990: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
99a0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
99b0: 20 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a      tls1_3 = 0;.
99c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28  #endif..    if (
99d0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
99e0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
99f0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
9a00: 63 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73  channel ?options
9a10: 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
9a20: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
9a30: 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72     ERR_clear_err
9a40: 6f 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20  or();..    chan 
9a50: 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  = Tcl_GetChannel
9a60: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
9a70: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
9a80: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28   NULL);.    if (
9a90: 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61  chan == (Tcl_Cha
9aa0: 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72  nnel) NULL) {..r
9ab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9ac0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d  .    }..    /* M
9ad0: 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72  ake sure to oper
9ae0: 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f  ate on the topmo
9af0: 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20  st channel */.  
9b00: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
9b10: 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29  TopChannel(chan)
9b20: 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20  ;..    for (idx 
9b30: 3d 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b  = 2; idx < objc;
9b40: 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20   idx++) {..char 
9b50: 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  *opt = Tcl_GetSt
9b60: 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b  ring(objv[idx]);
9b70: 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d  ...if (opt[0] !=
9b80: 20 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b   '-')..    break
9b90: 3b 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70  ;...OPTOBJ("-alp
9ba0: 6e 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53  n", alpn);..OPTS
9bb0: 54 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70  TR("-cadir", CAp
9bc0: 61 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ath);..OPTSTR("-
9bd0: 63 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29  cafile", CAfile)
9be0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 73 74  ;..OPTSTR("-cast
9bf0: 6f 72 65 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a  ore", CAstore);.
9c00: 09 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22  .OPTBYTE("-cert"
9c10: 2c 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e  , cert, cert_len
9c20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72  );..OPTSTR("-cer
9c30: 74 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65  tfile", certfile
9c40: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70  );..OPTSTR("-cip
9c50: 68 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a  her", ciphers);.
9c60: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c70: 73 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f  s", ciphers);..O
9c80: 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75  PTSTR("-ciphersu
9c90: 69 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69  ites", ciphersui
9ca0: 74 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d  tes);..OPTOBJ("-
9cb0: 63 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74  command", script
9cc0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70  );..OPTSTR("-dhp
9cd0: 61 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73  arams", DHparams
9ce0: 29 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65  );..OPTBYTE("-ke
9cf0: 79 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e  y", key, key_len
9d00: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79  );..OPTSTR("-key
9d10: 66 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b  file", keyfile);
9d20: 0a 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c  ..OPTSTR("-model
9d30: 22 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f  ", model);..OPTO
9d40: 42 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20  BJ("-password", 
9d50: 70 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42  password);..OPTB
9d60: 4f 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73  OOL("-post_hands
9d70: 68 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64  hake", post_hand
9d80: 73 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c  shake);..OPTBOOL
9d90: 28 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71  ("-request", req
9da0: 75 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  uest);..OPTBOOL(
9db0: 22 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75  "-require", requ
9dc0: 69 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d  ire);..OPTINT("-
9dd0: 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c  security_level",
9de0: 20 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f   level);..OPTBOO
9df0: 4c 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72  L("-server", ser
9e00: 76 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d  ver);..OPTSTR("-
9e10: 73 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72  servername", ser
9e20: 76 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54  vername);..OPTST
9e30: 52 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c  R("-session_id",
9e40: 20 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f   session_id);..O
9e50: 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20  PTBOOL("-ssl2", 
9e60: 73 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  ssl2);..OPTBOOL(
9e70: 22 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a  "-ssl3", ssl3);.
9e80: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22  .OPTBOOL("-tls1"
9e90: 2c 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f  , tls1);..OPTBOO
9ea0: 4c 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73  L("-tls1.1", tls
9eb0: 31 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  1_1);..OPTBOOL("
9ec0: 2d 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32  -tls1.2", tls1_2
9ed0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9ee0: 73 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a  s1.3", tls1_3);.
9ef0: 09 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61  .OPTOBJ("-valida
9f00: 74 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64  tecommand", vcmd
9f10: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d  );..OPTOBJ("-vcm
9f20: 64 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54  d", vcmd);...OPT
9f30: 42 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d  BAD("option", "-
9f40: 61 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63  alpn, -cadir, -c
9f50: 61 66 69 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c  afile, -castore,
9f60: 20 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c   -cert, -certfil
9f70: 65 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70  e, -cipher, -cip
9f80: 68 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d  hersuites, -comm
9f90: 61 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20  and, -dhparams, 
9fa0: 2d 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20  -key, -keyfile, 
9fb0: 2d 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72  -model, -passwor
9fc0: 64 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61  d, -post_handsha
9fd0: 6b 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72  ke, -request, -r
9fe0: 65 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74  equire, -securit
9ff0: 79 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72  y_level, -server
a000: 2c 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d  , -servername, -
a010: 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c  session_id, -ssl
a020: 32 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c  2, -ssl3, -tls1,
a030: 20 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e   -tls1.1, -tls1.
a040: 32 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d  2, -tls1.3, or -
a050: 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22  validatecommand"
a060: 29 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
a070: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
a080: 20 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76   if (request)..v
a090: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
a0a0: 49 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20  IFY_CLIENT_ONCE 
a0b0: 7c 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45  | SSL_VERIFY_PEE
a0c0: 52 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  R;.    if (reque
a0d0: 73 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76  st && require).v
a0e0: 65 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52  erify |= SSL_VER
a0f0: 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
a100: 45 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66  EER_CERT;.    if
a110: 20 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73   (request && pos
a120: 74 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72  t_handshake).ver
a130: 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46  ify |= SSL_VERIF
a140: 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
a150: 3b 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79  ;.    if (verify
a160: 20 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d   == 0)..verify =
a170: 20 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45   SSL_VERIFY_NONE
a180: 3b 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20  ;..    proto |= 
a190: 28 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54  (ssl2 ? TLS_PROT
a1a0: 4f 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20  O_SSL2 : 0);.   
a1b0: 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20   proto |= (ssl3 
a1c0: 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  ? TLS_PROTO_SSL3
a1d0: 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f   : 0);.    proto
a1e0: 20 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f   |= (tls1 ? TLS_
a1f0: 50 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b  PROTO_TLS1 : 0);
a200: 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74  .    proto |= (t
a210: 6c 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54  ls1_1 ? TLS_PROT
a220: 4f 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20  O_TLS1_1 : 0);. 
a230: 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73     proto |= (tls
a240: 31 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f  1_2 ? TLS_PROTO_
a250: 54 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20  TLS1_2 : 0);.   
a260: 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f   proto |= (tls1_
a270: 33 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  3 ? TLS_PROTO_TL
a280: 53 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20  S1_3 : 0);..    
a290: 2f 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c  /* reset to NULL
a2a0: 20 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67   if blank string
a2b0: 20 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20   provided */.   
a2c0: 20 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63   if (cert && !*c
a2d0: 65 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65  ert)..        ce
a2e0: 72 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rt.        = NUL
a2f0: 4c 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26  L;.    if (key &
a300: 26 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20  & !*key)..      
a310: 20 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20    key.        = 
a320: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65  NULL;.    if (ce
a330: 72 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74  rtfile && !*cert
a340: 66 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65  file)         ce
a350: 72 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20  rtfile.= NULL;. 
a360: 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26     if (keyfile &
a370: 26 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65  & !*keyfile)..ke
a380: 79 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20  yfile.        = 
a390: 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69  NULL;.    if (ci
a3a0: 70 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65  phers && !*ciphe
a3b0: 72 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68  rs).        ciph
a3c0: 65 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55  ers.        = NU
a3d0: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68  LL;.    if (ciph
a3e0: 65 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69  ersuites && !*ci
a3f0: 70 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68  phersuites) ciph
a400: 65 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55  ersuites    = NU
a410: 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69  LL;.    if (CAfi
a420: 6c 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09  le && !*CAfile).
a430: 20 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20          CAfile. 
a440: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a450: 20 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26     if (CApath &&
a460: 20 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20   !*CApath).     
a470: 20 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20     CApath.      
a480: 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66    = NULL;.    if
a490: 20 28 43 41 73 74 6f 72 65 20 26 26 20 21 2a 43   (CAstore && !*C
a4a0: 41 73 74 6f 72 65 29 09 20 20 20 20 20 20 20 20  Astore).        
a4b0: 43 41 73 74 6f 72 65 09 20 20 20 20 20 20 20 20  CAstore.        
a4c0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a4d0: 44 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48  DHparams && !*DH
a4e0: 70 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20  params).        
a4f0: 44 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20  DHparams        
a500: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20  = NULL;..    /* 
a510: 6e 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f  new SSL state */
a520: 0a 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d  .    statePtr..=
a530: 20 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c   (State *) ckall
a540: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69  oc((unsigned) si
a550: 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20  zeof(State));.  
a560: 20 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74    memset(statePt
a570: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61  r, 0, sizeof(Sta
a580: 74 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65  te));..    state
a590: 50 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61  Ptr->flags.= fla
a5a0: 67 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72  gs;.    statePtr
a5b0: 2d 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72  ->interp.= inter
a5c0: 70 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  p;.    statePtr-
a5d0: 3e 77 61 6e 74 09 3d 20 30 3b 0a 20 20 20 20 73  >want.= 0;.    s
a5e0: 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 09  tatePtr->vflags.
a5f0: 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73 74  = verify;.    st
a600: 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22 22  atePtr->err.= ""
a610: 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61  ;..    /* alloca
a620: 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 20  te script */.   
a630: 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a 09   if (script) {..
a640: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a650: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69  ringFromObj(scri
a660: 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28  pt, &len);..if (
a670: 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74  len) {..    stat
a680: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d  ePtr->callback =
a690: 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54 63   script;..    Tc
a6a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a6b0: 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63  tatePtr->callbac
a6c0: 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  k);..}.    }..  
a6d0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61    /* allocate pa
a6e0: 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66  ssword */.    if
a6f0: 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 28   (password) {..(
a700: 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72  void) Tcl_GetStr
a710: 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77  ingFromObj(passw
a720: 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ord, &len);..if 
a730: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a740: 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 20  tePtr->password 
a750: 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20 20  = password;..   
a760: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
a770: 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73  t(statePtr->pass
a780: 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a  word);..}.    }.
a790: 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
a7a0: 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e   validate comman
a7b0: 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63 6d  d */.    if (vcm
a7c0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a7d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a7e0: 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09  j(vcmd, &len);..
a7f0: 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20  if (len) {..    
a800: 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d  statePtr->vcmd =
a810: 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f   vcmd;..    Tcl_
a820: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  IncrRefCount(sta
a830: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d  tePtr->vcmd);..}
a840: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
a850: 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b  model != NULL) {
a860: 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20  ..int mode;../* 
a870: 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22 20  Get the "model" 
a880: 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e  context */..chan
a890: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
a8a0: 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c  l(interp, model,
a8b0: 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63 68   &mode);..if (ch
a8c0: 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e  an == (Tcl_Chann
a8d0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20  el) NULL) {..   
a8e0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
a8f0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
a900: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
a910: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
a920: 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73  .../*.. * Make s
a930: 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f  ure to operate o
a940: 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68  n the topmost ch
a950: 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e  annel.. */..chan
a960: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
a970: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20  nnel(chan);..if 
a980: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
a990: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
a9a0: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
a9b0: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
a9c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
a9d0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
a9e0: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
a9f0: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
aa00: 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61  ": not a TLS cha
aa10: 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20  nnel", (char *) 
aa20: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
aa30: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
aa40: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
aa50: 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c  ORT", "CHANNEL",
aa60: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61   "INVALID", (cha
aa70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
aa80: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
aa90: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
aaa0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
aab0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
aac0: 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65 20  ..ctx = ((State 
aad0: 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  *)Tcl_GetChannel
aae0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
aaf0: 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20  n))->ctx;.    } 
ab00: 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74 78  else {..if ((ctx
ab10: 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61 74   = CTX_Init(stat
ab20: 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70 72  ePtr, server, pr
ab30: 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65  oto, keyfile, ce
ab40: 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72  rtfile, key, cer
ab50: 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20  t, key_len,..   
ab60: 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74   cert_len, CApat
ab70: 68 2c 20 43 41 73 74 6f 72 65 2c 20 43 41 66 69  h, CAstore, CAfi
ab80: 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69 70  le, ciphers, cip
ab90: 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65 6c  hersuites, level
aba0: 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d 20  , DHparams)) == 
abb0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73  NULL) {..    Tls
abc0: 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f  _Free((tls_free_
abd0: 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72  type *) statePtr
abe0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54  );..    return T
abf0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20  CL_ERROR;..}.   
ac00: 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72   }..    statePtr
ac10: 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20  ->ctx = ctx;..  
ac20: 20 20 2f 2a 20 50 72 65 73 65 72 76 65 20 63 68    /* Preserve ch
ac30: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a  annel config */.
ac40: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
ac50: 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65  nit(&upperChanne
ac60: 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20  lTranslation);. 
ac70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
ac80: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
ac90: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
aca0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
acb0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43  upperChannelEOFC
acc0: 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  har);.    Tcl_DS
acd0: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
ace0: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
acf0: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
ad00: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
ad10: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68  p, chan, "-eofch
ad20: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ar", &upperChann
ad30: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
ad40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
ad50: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
ad60: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  n, "-encoding", 
ad70: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
ad80: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
ad90: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
ada0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
adb0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26  -translation", &
adc0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
add0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
ade0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
adf0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
ae00: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75   "-blocking", &u
ae10: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
ae20: 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e  ing);..    /* En
ae30: 73 75 72 65 20 74 68 65 20 63 68 61 6e 6e 65 6c  sure the channel
ae40: 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61 72 79   works in binary
ae50: 20 6d 6f 64 65 20 28 66 6f 72 20 74 68 65 20 65   mode (for the e
ae60: 6e 63 72 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f  ncryption not to
ae70: 20 67 65 74 20 67 6f 6f 66 65 64 20 75 70 29 2e   get goofed up).
ae80: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   */.    Tcl_SetC
ae90: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
aea0: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61  erp, chan, "-tra
aeb0: 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61  nslation", "bina
aec0: 72 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  ry");.    Tcl_Se
aed0: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
aee0: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62  nterp, chan, "-b
aef0: 6c 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22  locking", "true"
af00: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74  );..    /* Creat
af10: 65 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65  e stacked channe
af20: 6c 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66  l */.    dprintf
af30: 28 22 43 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20  ("Consuming Tcl 
af40: 63 68 61 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c  channel %s", Tcl
af50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
af60: 63 68 61 6e 29 29 3b 0a 20 20 20 20 73 74 61 74  chan));.    stat
af70: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c  ePtr->self = Tcl
af80: 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  _StackChannel(in
af90: 74 65 72 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65  terp, Tls_Channe
afa0: 6c 54 79 70 65 28 29 2c 20 28 43 6c 69 65 6e 74  lType(), (Client
afb0: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 0a  Data) statePtr,.
afc0: 09 28 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c  .(TCL_READABLE |
afd0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20   TCL_WRITABLE), 
afe0: 63 68 61 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e  chan);.    dprin
aff0: 74 66 28 22 43 72 65 61 74 65 64 20 63 68 61 6e  tf("Created chan
b000: 6e 65 6c 20 6e 61 6d 65 64 20 25 73 22 2c 20 54  nel named %s", T
b010: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
b020: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
b030: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74  ));.    if (stat
b040: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54  ePtr->self == (T
b050: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c  cl_Channel) NULL
b060: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75  ) {../*.. * No u
b070: 73 65 20 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75  se of Tcl_Eventu
b080: 61 6c 6c 79 46 72 65 65 20 62 65 63 61 75 73 65  allyFree because
b090: 20 6e 6f 20 70 6f 73 73 69 62 6c 65 20 54 63 6c   no possible Tcl
b0a0: 5f 50 72 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a  _Preserve... */.
b0b0: 09 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66  .Tls_Free((tls_f
b0c0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b0d0: 65 50 74 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72  ePtr);..Tcl_DStr
b0e0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b0f0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
b100: 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46  );..Tcl_DStringF
b110: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
b120: 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c  lEncoding);..Tcl
b130: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b140: 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61  perChannelEOFCha
b150: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  r);..Tcl_DString
b160: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b170: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65  elBlocking);..re
b180: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
b190: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
b1a0: 73 74 6f 72 65 20 63 68 61 6e 6e 65 6c 20 63 6f  store channel co
b1b0: 6e 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  nfig */.    Tcl_
b1c0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  SetChannelOption
b1d0: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74  (interp, statePt
b1e0: 72 2d 3e 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73  r->self, "-trans
b1f0: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
b200: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
b210: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
b220: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
b230: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
b240: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d  nterp, statePtr-
b250: 3e 73 65 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e  >self, "-encodin
b260: 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  g", Tcl_DStringV
b270: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
b280: 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20  elEncoding));.  
b290: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c    Tcl_SetChannel
b2a0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73  Option(interp, s
b2b0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22  tatePtr->self, "
b2c0: 2d 65 6f 66 63 68 61 72 22 2c 20 54 63 6c 5f 44  -eofchar", Tcl_D
b2d0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
b2e0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
b2f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43  ));.    Tcl_SetC
b300: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b310: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b320: 65 6c 66 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22  elf, "-blocking"
b330: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
b340: 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ue(&upperChannel
b350: 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20  Blocking));.    
b360: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b370: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61  &upperChannelTra
b380: 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54  nslation);.    T
b390: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
b3a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
b3b0: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44  ding);.    Tcl_D
b3c0: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b3d0: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
b3e0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b3f0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b400: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20  nelBlocking);.. 
b410: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
b420: 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a   Initialization.
b430: 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74       */.    stat
b440: 65 50 74 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f  ePtr->ssl = SSL_
b450: 6e 65 77 28 73 74 61 74 65 50 74 72 2d 3e 63 74  new(statePtr->ct
b460: 78 29 3b 0a 20 20 20 20 69 66 20 28 21 73 74 61  x);.    if (!sta
b470: 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f  tePtr->ssl) {../
b480: 2a 20 53 53 4c 20 6c 69 62 72 61 72 79 20 65 72  * SSL library er
b490: 72 6f 72 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65  ror */..Tcl_Appe
b4a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b4b0: 20 22 63 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74   "couldn't const
b4c0: 72 75 63 74 20 73 73 6c 20 73 65 73 73 69 6f 6e  ruct ssl session
b4d0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
b4e0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
b4f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
b500: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
b510: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
b520: 4f 52 54 22 2c 20 22 49 4e 49 54 22 2c 20 22 46  ORT", "INIT", "F
b530: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
b540: 20 4e 55 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65   NULL);..Tls_Fre
b550: 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65  e((tls_free_type
b560: 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09   *) statePtr);..
b570: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b580: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b590: 53 65 74 20 68 6f 73 74 20 73 65 72 76 65 72 20  Set host server 
b5a0: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 66 20 28  name */.    if (
b5b0: 73 65 72 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f  servername) {../
b5c0: 2a 20 53 65 74 73 20 74 68 65 20 73 65 72 76 65  * Sets the serve
b5d0: 72 20 6e 61 6d 65 20 69 6e 64 69 63 61 74 69 6f  r name indicatio
b5e0: 6e 20 28 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e  n (SNI) in Clien
b5f0: 74 48 65 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e  tHello extension
b600: 20 2a 2f 0a 09 2f 2a 20 50 65 72 20 52 46 43 20   */../* Per RFC 
b610: 36 30 36 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69  6066, hostname i
b620: 73 20 61 20 41 53 43 49 49 20 65 6e 63 6f 64 65  s a ASCII encode
b630: 64 20 73 74 72 69 6e 67 2c 20 74 68 6f 75 67 68  d string, though
b640: 20 52 46 43 20 34 33 36 36 20 73 61 79 73 20 55   RFC 4366 says U
b650: 54 46 2d 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53  TF-8. */..if (!S
b660: 53 4c 5f 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f  SL_set_tlsext_ho
b670: 73 74 5f 6e 61 6d 65 28 73 74 61 74 65 50 74 72  st_name(statePtr
b680: 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d  ->ssl, servernam
b690: 65 29 20 26 26 20 72 65 71 75 69 72 65 29 20 7b  e) && require) {
b6a0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
b6b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
b6c0: 53 65 74 20 53 4e 49 20 65 78 74 65 6e 73 69 6f  Set SNI extensio
b6d0: 6e 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54  n failed: ", GET
b6e0: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
b6f0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b700: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72      Tcl_SetError
b710: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
b720: 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 53  S", "IMPORT", "S
b730: 4e 49 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  NI", "FAILED", (
b740: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
b750: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
b760: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
b770: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
b780: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b790: 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73  ..}.../* Set hos
b7a0: 74 6e 61 6d 65 20 66 6f 72 20 70 65 65 72 20 63  tname for peer c
b7b0: 65 72 74 69 66 69 63 61 74 65 20 68 6f 73 74 6e  ertificate hostn
b7c0: 61 6d 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e  ame verification
b7d0: 20 69 6e 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20   in clients...  
b7e0: 20 44 6f 6e 27 74 20 75 73 65 20 53 53 4c 5f 73   Don't use SSL_s
b7f0: 65 74 31 5f 68 6f 73 74 20 73 69 6e 63 65 20 69  et1_host since i
b800: 74 20 68 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e  t has limitation
b810: 73 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  s. */..if (!SSL_
b820: 61 64 64 31 5f 68 6f 73 74 28 73 74 61 74 65 50  add1_host(stateP
b830: 74 72 2d 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e  tr->ssl, servern
b840: 61 6d 65 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ame)) {..    Tcl
b850: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
b860: 74 65 72 70 2c 20 22 53 65 74 20 44 4e 53 20 68  terp, "Set DNS h
b870: 6f 73 74 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20  ostname failed: 
b880: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
b890: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
b8a0: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
b8b0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
b8c0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
b8d0: 54 22 2c 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20  T", "HOSTNAME", 
b8e0: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b8f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b900: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
b910: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
b920: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b930: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
b940: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
b950: 75 6d 65 20 73 65 73 73 69 6f 6e 20 69 64 20 2a  ume session id *
b960: 2f 0a 20 20 20 20 69 66 20 28 73 65 73 73 69 6f  /.    if (sessio
b970: 6e 5f 69 64 20 26 26 20 73 74 72 6c 65 6e 28 73  n_id && strlen(s
b980: 65 73 73 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53  ession_id) <= SS
b990: 4c 5f 4d 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45  L_MAX_SID_CTX_LE
b9a0: 4e 47 54 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f  NGTH) {../* SSL_
b9b0: 73 65 74 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f  set_session() */
b9c0: 0a 09 69 66 20 28 21 53 53 4c 5f 53 45 53 53 49  ..if (!SSL_SESSI
b9d0: 4f 4e 5f 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65  ON_set1_id_conte
b9e0: 78 74 28 53 53 4c 5f 67 65 74 5f 73 65 73 73 69  xt(SSL_get_sessi
b9f0: 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  on(statePtr->ssl
ba00: 29 2c 0a 09 09 28 63 6f 6e 73 74 20 75 6e 73 69  ),...(const unsi
ba10: 67 6e 65 64 20 63 68 61 72 20 2a 29 20 73 65 73  gned char *) ses
ba20: 73 69 6f 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e  sion_id, (unsign
ba30: 65 64 20 69 6e 74 29 20 73 74 72 6c 65 6e 28 73  ed int) strlen(s
ba40: 65 73 73 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09  ession_id))) {..
ba50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ba60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 52 65  sult(interp, "Re
ba70: 73 75 6d 65 20 73 65 73 73 69 6f 6e 20 66 61 69  sume session fai
ba80: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
ba90: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
baa0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
bab0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bac0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bad0: 49 4d 50 4f 52 54 22 2c 20 22 53 45 53 53 49 4f  IMPORT", "SESSIO
bae0: 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63  N", "FAILED", (c
baf0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
bb00: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
bb10: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
bb20: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
bb30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bb40: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
bb50: 20 45 6e 61 62 6c 65 20 41 70 70 6c 69 63 61 74   Enable Applicat
bb60: 69 6f 6e 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63  ion-Layer Protoc
bb70: 6f 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20  ol Negotiation. 
bb80: 45 78 61 6d 70 6c 65 73 20 61 72 65 3a 20 68 74  Examples are: ht
bb90: 74 70 2f 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e  tp/1.0,..http/1.
bba0: 31 2c 20 68 32 2c 20 68 33 2c 20 66 74 70 2c 20  1, h2, h3, ftp, 
bbb0: 69 6d 61 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70  imap, pop3, xmpp
bbc0: 2d 63 6c 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65  -client, xmpp-se
bbd0: 72 76 65 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c  rver, mqtt, irc,
bbe0: 20 65 74 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20   etc. */.    if 
bbf0: 28 61 6c 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e  (alpn) {../* Con
bc00: 76 65 72 74 20 61 20 54 43 4c 20 6c 69 73 74 20  vert a TCL list 
bc10: 69 6e 74 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d  into a protocol-
bc20: 6c 69 73 74 20 69 6e 20 77 69 72 65 2d 66 6f 72  list in wire-for
bc30: 6d 61 74 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64  mat */..unsigned
bc40: 20 63 68 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a   char *protos, *
bc50: 70 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  p;..unsigned int
bc60: 20 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b   protos_len = 0;
bc70: 0a 09 54 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20  ..Tcl_Size cnt, 
bc80: 69 3b 0a 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f  i;..int j;..Tcl_
bc90: 4f 62 6a 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66  Obj **list;...if
bca0: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74   (Tcl_ListObjGet
bcb0: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c  Elements(interp,
bcc0: 20 61 6c 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69   alpn, &cnt, &li
bcd0: 73 74 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  st) != TCL_OK) {
bce0: 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28  ..    Tls_Free((
bcf0: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
bd00: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20   statePtr);..   
bd10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bd20: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72  R;..}.../* Deter
bd30: 6d 69 6e 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  mine the memory 
bd40: 72 65 71 75 69 72 65 64 20 66 6f 72 20 74 68 65  required for the
bd50: 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a   protocol-list *
bd60: 2f 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20 69  /..for (i = 0; i
bd70: 20 3c 20 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09   < cnt; i++) {..
bd80: 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
bd90: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d  gFromObj(list[i]
bda0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66  , &len);..    if
bdb0: 20 28 6c 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09   (len > 255) {..
bdc0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
bdd0: 74 28 69 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20  t(interp, "ALPN 
bde0: 70 72 6f 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74  protocol names t
bdf0: 6f 6f 20 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20  oo long", (char 
be00: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f  *) NULL);...Tcl_
be10: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
be20: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
be30: 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46  ORT", "ALPN", "F
be40: 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29  AILED", (char *)
be50: 20 4e 55 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72   NULL);...Tls_Fr
be60: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
be70: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
be80: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
be90: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
bea0: 70 72 6f 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20  protos_len += 1 
beb0: 2b 20 28 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a  + (int) len;..}.
bec0: 0a 09 2f 2a 20 42 75 69 6c 64 20 74 68 65 20 63  ../* Build the c
bed0: 6f 6d 70 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c  omplete protocol
bee0: 2d 6c 69 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73  -list */..protos
bef0: 20 3d 20 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f   = ckalloc(proto
bf00: 73 5f 6c 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74  s_len);../* prot
bf10: 6f 63 6f 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69  ocol-lists consi
bf20: 73 74 20 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67  st of 8-bit leng
bf30: 74 68 2d 70 72 65 66 69 78 65 64 2c 20 62 79 74  th-prefixed, byt
bf40: 65 20 73 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f  e strings */..fo
bf50: 72 20 28 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72  r (j = 0, p = pr
bf60: 6f 74 6f 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a  otos; j < cnt; j
bf70: 2b 2b 29 20 7b 0a 09 20 20 20 20 63 68 61 72 20  ++) {..    char 
bf80: 2a 73 74 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  *str = Tcl_GetSt
bf90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74  ringFromObj(list
bfa0: 5b 6a 5d 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20  [j], &len);..   
bfb0: 20 2a 70 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65   *p++ = (unsigne
bfc0: 64 20 63 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20  d char) len;..  
bfd0: 20 20 6d 65 6d 63 70 79 28 70 2c 20 73 74 72 2c    memcpy(p, str,
bfe0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a   (size_t) len);.
bff0: 09 20 20 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09  .    p += len;..
c000: 7d 0a 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61  }.../* SSL_set_a
c010: 6c 70 6e 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73  lpn_protos makes
c020: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 70   a copy of the p
c030: 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a  rotocol-list */.
c040: 09 2f 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 66  ./* Note: This f
c050: 75 6e 63 74 69 6f 6e 20 72 65 76 65 72 73 65 73  unction reverses
c060: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
c070: 65 20 63 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a  e convention */.
c080: 09 69 66 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70  .if (SSL_set_alp
c090: 6e 5f 70 72 6f 74 6f 73 28 73 74 61 74 65 50 74  n_protos(statePt
c0a0: 72 2d 3e 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20  r->ssl, protos, 
c0b0: 70 72 6f 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09  protos_len)) {..
c0c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
c0d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65  sult(interp, "Se
c0e0: 74 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73  t ALPN protocols
c0f0: 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f   failed: ", GET_
c100: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
c110: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
c120: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
c130: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
c140: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c  ", "IMPORT", "AL
c150: 50 4e 22 2c 20 22 46 41 49 4c 45 44 22 2c 20 28  PN", "FAILED", (
c160: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
c170: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
c180: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
c190: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 63  tatePtr);..    c
c1a0: 6b 66 72 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09  kfree(protos);..
c1b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c1c0: 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74  RROR;..}.../* St
c1d0: 6f 72 65 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69  ore protocols li
c1e0: 73 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d  st */..statePtr-
c1f0: 3e 70 72 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73  >protos = protos
c200: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
c210: 74 6f 73 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73  tos_len = protos
c220: 5f 6c 65 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65  _len;.    } else
c230: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72   {..statePtr->pr
c240: 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74  otos = NULL;..st
c250: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
c260: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  en = 0;.    }.. 
c270: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c     /*.     * SSL
c280: 20 43 61 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20   Callbacks.     
c290: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 61  */.    SSL_set_a
c2a0: 70 70 5f 64 61 74 61 28 73 74 61 74 65 50 74 72  pp_data(statePtr
c2b0: 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73  ->ssl, (void *)s
c2c0: 74 61 74 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69  tatePtr);./* poi
c2d0: 6e 74 20 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f  nt back to us */
c2e0: 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 76 65 72  .    SSL_set_ver
c2f0: 69 66 79 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ify(statePtr->ss
c300: 6c 2c 20 76 65 72 69 66 79 2c 20 56 65 72 69 66  l, verify, Verif
c310: 79 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20  yCallback);.    
c320: 2f 2a 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79  /*SSL_set_verify
c330: 5f 64 65 70 74 68 28 53 53 4c 5f 73 65 74 5f 76  _depth(SSL_set_v
c340: 65 72 69 66 79 5f 64 65 70 74 68 2c 20 30 29 3b  erify_depth, 0);
c350: 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 69  */.    SSL_set_i
c360: 6e 66 6f 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61  nfo_callback(sta
c370: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f  tePtr->ssl, Info
c380: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20  Callback);..    
c390: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20  /* Callback for 
c3a0: 6f 62 73 65 72 76 69 6e 67 20 70 72 6f 74 6f 63  observing protoc
c3b0: 6f 6c 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23  ol messages */.#
c3c0: 69 66 6e 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e  ifndef OPENSSL_N
c3d0: 4f 5f 53 53 4c 5f 54 52 41 43 45 0a 20 20 20 20  O_SSL_TRACE.    
c3e0: 2f 2a 20 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f  /* void SSL_CTX_
c3f0: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c400: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c410: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c420: 65 50 74 72 29 3b 0a 20 20 20 20 76 6f 69 64 20  ePtr);.    void 
c430: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f  SSL_CTX_set_msg_
c440: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c450: 72 2d 3e 63 74 78 2c 20 4d 65 73 73 61 67 65 43  r->ctx, MessageC
c460: 61 6c 6c 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20  allback); */.   
c470: 20 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c   SSL_set_msg_cal
c480: 6c 62 61 63 6b 5f 61 72 67 28 73 74 61 74 65 50  lback_arg(stateP
c490: 74 72 2d 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a  tr->ssl, (void *
c4a0: 29 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20  )statePtr);.    
c4b0: 53 53 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  SSL_set_msg_call
c4c0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 73  back(statePtr->s
c4d0: 73 6c 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  sl, MessageCallb
c4e0: 61 63 6b 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ack);.#endif..  
c4f0: 20 20 2f 2a 20 43 72 65 61 74 65 20 54 63 6c 5f    /* Create Tcl_
c500: 43 68 61 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64  Channel BIO Hand
c510: 6c 65 72 20 2a 2f 0a 20 20 20 20 73 74 61 74 65  ler */.    state
c520: 50 74 72 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f  Ptr->p_bio.= BIO
c530: 5f 6e 65 77 5f 74 63 6c 28 73 74 61 74 65 50 74  _new_tcl(statePt
c540: 72 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b  r, BIO_NOCLOSE);
c550: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 62  .    statePtr->b
c560: 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f  io.= BIO_new(BIO
c570: 5f 66 5f 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20  _f_ssl());..    
c580: 69 66 20 28 73 65 72 76 65 72 29 20 7b 0a 09 2f  if (server) {../
c590: 2a 20 53 65 72 76 65 72 20 63 61 6c 6c 62 61 63  * Server callbac
c5a0: 6b 73 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ks */..SSL_CTX_s
c5b0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
c5c0: 6e 61 6d 65 5f 61 72 67 28 73 74 61 74 65 50 74  name_arg(statePt
c5d0: 72 2d 3e 63 74 78 2c 20 28 76 6f 69 64 20 2a 29  r->ctx, (void *)
c5e0: 73 74 61 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f  statePtr);..SSL_
c5f0: 43 54 58 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73  CTX_set_tlsext_s
c600: 65 72 76 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61  ervername_callba
c610: 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  ck(statePtr->ctx
c620: 2c 20 53 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a  , SNICallback);.
c630: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
c640: 65 6e 74 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61  ent_hello_cb(sta
c650: 74 65 50 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c  tePtr->ctx, Hell
c660: 6f 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  oCallback, (void
c670: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 09 69   *)statePtr);..i
c680: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
c690: 74 6f 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  tos != NULL) {..
c6a0: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
c6b0: 61 6c 70 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73  alpn_select_cb(s
c6c0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c  tatePtr->ctx, AL
c6d0: 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  PNCallback, (voi
c6e0: 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 23  d *)statePtr);.#
c6f0: 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20  ifdef USE_NPN.. 
c700: 20 20 20 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d     if (tls1_2 ==
c710: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
c720: 30 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73  0) {...SSL_CTX_s
c730: 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61  et_next_protos_a
c740: 64 76 65 72 74 69 73 65 64 5f 63 62 28 73 74 61  dvertised_cb(sta
c750: 74 65 50 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43  tePtr->ctx, NPNC
c760: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c770: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20  )statePtr);..   
c780: 20 7d 0a 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f   }.#endif..}.../
c790: 2a 20 45 6e 61 62 6c 65 20 73 65 72 76 65 72 20  * Enable server 
c7a0: 74 6f 20 73 65 6e 64 20 63 65 72 74 20 72 65 71  to send cert req
c7b0: 75 65 73 74 20 61 66 74 65 72 20 68 61 6e 64 73  uest after hands
c7c0: 68 61 6b 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e  hake (TLS 1.3 on
c7d0: 6c 79 29 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69  ly) */../* A wri
c7e0: 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73  te operation mus
c7f0: 74 20 74 61 6b 65 20 70 6c 61 63 65 20 66 6f 72  t take place for
c800: 20 74 68 65 20 43 65 72 74 69 66 69 63 61 74 65   the Certificate
c810: 20 52 65 71 75 65 73 74 20 74 6f 20 62 65 0a 09   Request to be..
c820: 20 20 20 73 65 6e 74 20 74 6f 20 74 68 65 20 63     sent to the c
c830: 6c 69 65 6e 74 2c 20 74 68 69 73 20 63 61 6e 20  lient, this can 
c840: 62 65 20 64 6f 6e 65 20 77 69 74 68 20 53 53 4c  be done with SSL
c850: 5f 64 6f 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e  _do_handshake().
c860: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
c870: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
c880: 6b 65 20 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a  ke && tls1_3) {.
c890: 09 20 20 20 20 53 53 4c 5f 76 65 72 69 66 79 5f  .    SSL_verify_
c8a0: 63 6c 69 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64  client_post_hand
c8b0: 73 68 61 6b 65 28 73 74 61 74 65 50 74 72 2d 3e  shake(statePtr->
c8c0: 73 73 6c 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65  ssl);..}.../* Se
c8d0: 74 20 73 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f  t server mode */
c8e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ..statePtr->flag
c8f0: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52  s |= TLS_TCL_SER
c900: 56 45 52 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63  VER;..SSL_set_ac
c910: 63 65 70 74 5f 73 74 61 74 65 28 73 74 61 74 65  cept_state(state
c920: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
c930: 20 65 6c 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65   else {../* Clie
c940: 6e 74 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a  nt callbacks */.
c950: 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
c960: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72  if (statePtr->pr
c970: 6f 74 6f 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20  otos != NULL && 
c980: 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26 20 74  tls1_2 == 0 && t
c990: 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20  ls1_3 == 0) {.. 
c9a0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e     SSL_CTX_set_n
c9b0: 65 78 74 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74  ext_proto_select
c9c0: 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e 63 74  _cb(statePtr->ct
c9d0: 78 2c 20 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c  x, ALPNCallback,
c9e0: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c9f0: 72 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09  r);..}.#endif...
ca00: 2f 2a 20 53 65 73 73 69 6f 6e 20 63 61 63 68 69  /* Session cachi
ca10: 6e 67 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73  ng */..SSL_CTX_s
ca20: 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
ca30: 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
ca40: 63 74 78 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41  ctx, SSL_SESS_CA
ca50: 43 48 45 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c  CHE_CLIENT | SSL
ca60: 5f 53 45 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49  _SESS_CACHE_NO_I
ca70: 4e 54 45 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a  NTERNAL_STORE);.
ca80: 09 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65  .SSL_CTX_sess_se
ca90: 74 5f 6e 65 77 5f 63 62 28 73 74 61 74 65 50 74  t_new_cb(statePt
caa0: 72 2d 3e 63 74 78 2c 20 53 65 73 73 69 6f 6e 43  r->ctx, SessionC
cab0: 61 6c 6c 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45  allback);.../* E
cac0: 6e 61 62 6c 65 20 70 6f 73 74 20 68 61 6e 64 73  nable post hands
cad0: 68 61 6b 65 20 41 75 74 68 65 6e 74 69 63 61 74  hake Authenticat
cae0: 69 6f 6e 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54  ion extension. T
caf0: 4c 53 20 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74  LS 1.3 only, not
cb00: 20 68 74 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20   http/2. */..if 
cb10: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
cb20: 5f 68 61 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20  _handshake) {.. 
cb30: 20 20 20 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f     SSL_set_post_
cb40: 68 61 6e 64 73 68 61 6b 65 5f 61 75 74 68 28 73  handshake_auth(s
cb50: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29  tatePtr->ssl, 1)
cb60: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c  ;..}.../* Set cl
cb70: 69 65 6e 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53  ient mode */..SS
cb80: 4c 5f 73 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74  L_set_connect_st
cb90: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ate(statePtr->ss
cba0: 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  l);.    }..    /
cbb0: 2a 20 53 65 74 20 42 49 4f 20 66 6f 72 20 72 65  * Set BIO for re
cbc0: 61 64 20 61 6e 64 20 77 72 69 74 65 20 6f 70 65  ad and write ope
cbd0: 72 61 74 69 6f 6e 73 20 6f 6e 20 53 53 4c 20 6f  rations on SSL o
cbe0: 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 53 53 4c  bject */.    SSL
cbf0: 5f 73 65 74 5f 62 69 6f 28 73 74 61 74 65 50 74  _set_bio(statePt
cc00: 72 2d 3e 73 73 6c 2c 20 73 74 61 74 65 50 74 72  r->ssl, statePtr
cc10: 2d 3e 70 5f 62 69 6f 2c 20 73 74 61 74 65 50 74  ->p_bio, statePt
cc20: 72 2d 3e 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42  r->p_bio);.    B
cc30: 49 4f 5f 73 65 74 5f 73 73 6c 28 73 74 61 74 65  IO_set_ssl(state
cc40: 50 74 72 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50  Ptr->bio, stateP
cc50: 74 72 2d 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43  tr->ssl, BIO_NOC
cc60: 4c 4f 53 45 29 3b 0a 20 20 20 20 42 49 4f 5f 73  LOSE);.    BIO_s
cc70: 65 74 5f 73 73 6c 5f 6d 6f 64 65 28 73 74 61 74  et_ssl_mode(stat
cc80: 65 50 74 72 2d 3e 62 69 6f 2c 20 28 6c 6f 6e 67  ePtr->bio, (long
cc90: 29 20 21 73 65 72 76 65 72 29 3b 0a 0a 20 20 20  ) !server);..   
cca0: 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f   /*.     * End o
ccb0: 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20 20 20  f SSL Init.     
ccc0: 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  */.    dprintf("
ccd0: 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c 20 54  Returning %s", T
cce0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
ccf0: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  e(statePtr->self
cd00: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  ));.    Tcl_SetR
cd10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
cd20: 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68  har *) Tcl_GetCh
cd30: 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50  annelName(stateP
cd40: 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56  tr->self), TCL_V
cd50: 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72  OLATILE);..    r
cd60: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
cd70: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
cd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cdb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
cdc0: 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20   UnimportObjCmd 
cdd0: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72  --. *. *.This pr
cde0: 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f 6b  ocedure is invok
cdf0: 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74 68 65  ed to remove the
ce00: 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c   topmost channel
ce10: 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52   filter.. *. * R
ce20: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
ce30: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
ce40: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
ce50: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
ce60: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
ce70: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
ce80: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
ce90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ceb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
ced0: 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70  static int.Unimp
cee0: 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  ortObjCmd(Client
cef0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
cf00: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
cf10: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
cf20: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
cf30: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
cf40: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 2c 20 70 61  Channel chan, pa
cf50: 72 65 6e 74 3b 09 2f 2a 20 54 68 65 20 73 74 61  rent;./* The sta
cf60: 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 72 6c 79  cked and underly
cf70: 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a  ing channels */.
cf80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
cf90: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
cfa0: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
cfb0: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
cfc0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
cfd0: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
cfe0: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
cff0: 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a  t res = TCL_OK;.
d000: 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e      (void) clien
d010: 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72 69  tData;..    dpri
d020: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
d030: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20      if (objc != 
d040: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
d050: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d060: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
d070: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
d080: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d090: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 63 68    /* Validate ch
d0a0: 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  annel name */.  
d0b0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
d0c0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
d0d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
d0e0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
d0f0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
d100: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
d110: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
d120: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
d130: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
d140: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
d150: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
d160: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
d170: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
d180: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 70 61 72  l(chan);.    par
d190: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61  ent = Tcl_GetSta
d1a0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e  ckedChannel(chan
d1b0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  );..    /* Verif
d1c0: 79 20 69 73 20 61 20 73 74 61 63 6b 65 64 20 63  y is a stacked c
d1d0: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66  hannel */.    if
d1e0: 20 28 70 61 72 65 6e 74 20 3d 3d 20 4e 55 4c 4c   (parent == NULL
d1f0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
d200: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
d210: 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20  ad channel \"", 
d220: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61  Tcl_GetChannelNa
d230: 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a  me(chan),..."\":
d240: 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20 63   not a stacked c
d250: 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
d260: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
d270: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
d280: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55  nterp, "TLS", "U
d290: 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e  NIMPORT", "CHANN
d2a0: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
d2b0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
d2c0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
d2d0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  R;.    }..    /*
d2e0: 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64 69   Flush any pendi
d2f0: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 69  ng data */.    i
d300: 66 20 28 54 63 6c 5f 4f 75 74 70 75 74 42 75 66  f (Tcl_OutputBuf
d310: 66 65 72 65 64 28 63 68 61 6e 29 20 3e 20 30 20  fered(chan) > 0 
d320: 26 26 20 54 63 6c 5f 46 6c 75 73 68 28 63 68 61  && Tcl_Flush(cha
d330: 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  n) != TCL_OK) {.
d340: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
d350: 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 27 74  t(interp, "can't
d360: 20 66 6c 75 73 68 20 63 68 61 6e 6e 65 6c 22 2c   flush channel",
d370: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d380: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d390: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d3a0: 2a 20 49 6e 69 74 20 73 74 6f 72 61 67 65 20 2a  * Init storage *
d3b0: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
d3c0: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
d3d0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
d3e0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d3f0: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
d400: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
d410: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
d420: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  (&upperChannelEO
d430: 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f  FChar);.    Tcl_
d440: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
d450: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d460: 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73  g);..    /* Pres
d470: 65 72 76 65 20 63 75 72 72 65 6e 74 20 63 68 61  erve current cha
d480: 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  nnel config */. 
d490: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
d4a0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d4b0: 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  chan, "-blocking
d4c0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d4d0: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54  Blocking);.    T
d4e0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_GetChannelOpt
d4f0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
d500: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26  , "-encoding", &
d510: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
d520: 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47  ding);.    Tcl_G
d530: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d540: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
d550: 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65 72  eofchar", &upper
d560: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d570: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
d580: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d590: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
d5a0: 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68  ation", &upperCh
d5b0: 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e  annelTranslation
d5c0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61  );..    /* Unsta
d5d0: 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a  ck the channel *
d5e0: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e  /.    if (Tcl_Un
d5f0: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74  stackChannel(int
d600: 65 72 70 2c 20 63 68 61 6e 29 20 21 3d 20 54 43  erp, chan) != TC
d610: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 73 20 3d 20 54  L_OK) {..res = T
d620: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d630: 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65 20  .    /* Restore 
d640: 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a  channel config *
d650: 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  /.    Tcl_SetCha
d660: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d670: 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6e 63  p, parent, "-enc
d680: 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72  oding", Tcl_DStr
d690: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
d6a0: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29  hannelEncoding))
d6b0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
d6c0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d6d0: 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6f 66  p, parent, "-eof
d6e0: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
d6f0: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
d700: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
d710: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
d720: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
d730: 20 70 61 72 65 6e 74 2c 20 22 2d 74 72 61 6e 73   parent, "-trans
d740: 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74  lation", Tcl_DSt
d750: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d760: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d770: 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  on));.    Tcl_Se
d780: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d790: 6e 74 65 72 70 2c 20 70 61 72 65 6e 74 2c 20 22  nterp, parent, "
d7a0: 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f  -blocking", Tcl_
d7b0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70  DStringValue(&up
d7c0: 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69  perChannelBlocki
d7d0: 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c  ng));..    /* Cl
d7e0: 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63  ean-up */.    Tc
d7f0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
d800: 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73  pperChannelTrans
d810: 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c  lation);.    Tcl
d820: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
d830: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
d840: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ng);.    Tcl_DSt
d850: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
d860: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a  hannelEOFChar);.
d870: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
d880: 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  ree(&upperChanne
d890: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
d8a0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a  return res;.}...
d8b0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
d8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43  --------. *. * C
d900: 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74  TX_Init -- const
d910: 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20 69  ruct a SSL_CTX i
d920: 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65  nstance. *. * Re
d930: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69  sults:. *.A vali
d940: 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e  d SSL_CTX instan
d950: 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20  ce or NULL.. *. 
d960: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
d970: 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53 53   *.constructs SS
d980: 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29 0a  L context (CTX).
d990: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
d9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
d9e0: 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54  tic SSL_CTX *.CT
d9f0: 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73 74  X_Init(State *st
da00: 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53 65  atePtr, int isSe
da10: 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c  rver, int proto,
da20: 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20   char *keyfile, 
da30: 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a  char *certfile,.
da40: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
da50: 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64  r *key, unsigned
da60: 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63 6c   char *cert, Tcl
da70: 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54  _Size key_len, T
da80: 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e  cl_Size cert_len
da90: 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c 0a  , char *CApath,.
daa0: 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f 72      char *CAstor
dab0: 65 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65 2c  e, char *CAfile,
dac0: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20   char *ciphers, 
dad0: 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74  char *ciphersuit
dae0: 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63  es, int level, c
daf0: 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20 7b  har *DHparams) {
db00: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
db10: 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65 50  *interp = stateP
db20: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
db30: 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  SSL_CTX *ctx = N
db40: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ULL;.    Tcl_DSt
db50: 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e 74  ring ds;.    int
db60: 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74 20   off = 0, abort 
db70: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61  = 0;.    int loa
db80: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20  d_private_key;. 
db90: 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54     const SSL_MET
dba0: 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20  HOD *method;..  
dbb0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
dbc0: 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 70  d");..    if (!p
dbd0: 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70  roto) {..Tcl_App
dbe0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dbf0: 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74  , "no valid prot
dc00: 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c 20  ocol selected", 
dc10: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dc20: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
dc30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61    }..    /* crea
dc40: 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a  te SSL context *
dc50: 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
dc60: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20  RSION_NUMBER >= 
dc70: 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64  0x10100000L || d
dc80: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20  efined(NO_SSL2) 
dc90: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
dca0: 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20  SL_NO_SSL2).    
dcb0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dcc0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
dcd0: 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  2)) {..Tcl_Appen
dce0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dcf0: 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL2 protocol n
dd00: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
dd10: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
dd20: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
dd30: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
dd40: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c  fined(NO_SSL3) |
dd50: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
dd60: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69  L_NO_SSL3).    i
dd70: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
dd80: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
dd90: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
dda0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
ddb0: 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f  SSL3 protocol no
ddc0: 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63  t supported", (c
ddd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
dde0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
ddf0: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  }.#endif.#if def
de00: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
de10: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
de20: 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69 66  _NO_TLS1).    if
de30: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
de40: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29   TLS_PROTO_TLS1)
de50: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
de60: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
de70: 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.0 protocol 
de80: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
de90: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dea0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
deb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
dec0: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31  efined(NO_TLS1_1
ded0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
dee0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a  NSSL_NO_TLS1_1).
def0: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
df00: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
df10: 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c  _TLS1_1)) {..Tcl
df20: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
df30: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20 70  terp, "TLS 1.1 p
df40: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
df50: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
df60: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
df70: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
df80: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e  if.#if defined(N
df90: 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66  O_TLS1_2) || def
dfa0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dfb0: 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20 28  TLS1_2).    if (
dfc0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dfd0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29  LS_PROTO_TLS1_2)
dfe0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
dff0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54  esult(interp, "T
e000: 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20  LS 1.2 protocol 
e010: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
e020: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
e030: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
e040: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
e050: 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33  efined(NO_TLS1_3
e060: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
e070: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a  NSSL_NO_TLS1_3).
e080: 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44 28      if (ENABLED(
e090: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e0a0: 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c  _TLS1_3)) {..Tcl
e0b0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e0c0: 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20 70  terp, "TLS 1.3 p
e0d0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
e0e0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
e0f0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
e100: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  NULL;.    }.#end
e110: 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  if.    if (proto
e120: 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65   == 0) {../* Use
e130: 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09   full range */..
e140: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f  SSL_CTX_set_min_
e150: 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74  proto_version(ct
e160: 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  x, 0);..SSL_CTX_
e170: 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65  set_max_proto_ve
e180: 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20  rsion(ctx, 0);. 
e190: 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68     }..    switch
e1a0: 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f   (proto) {.#if O
e1b0: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
e1c0: 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30  UMBER < 0x101000
e1d0: 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28  00L && !defined(
e1e0: 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66  NO_SSL2) && !def
e1f0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e200: 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20 54  SSL2).    case T
e210: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09  LS_PROTO_SSL2:..
e220: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e230: 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65 72  r ? SSLv2_server
e240: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
e250: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
e260: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e270: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e280: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
e290: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
e2a0: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
e2b0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
e2c0: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
e2d0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  e TLS_PROTO_SSL3
e2e0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e2f0: 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65 72  rver ? SSLv3_ser
e300: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53  ver_method() : S
e310: 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  SLv3_client_meth
e320: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e330: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e340: 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64  d(NO_TLS1) && !d
e350: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e360: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
e370: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e380: 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  LS1_METHOD).    
e390: 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  case TLS_PROTO_T
e3a0: 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69  LS1:..method = i
e3b0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31 5f  sServer ? TLSv1_
e3c0: 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20  server_method() 
e3d0: 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d  : TLSv1_client_m
e3e0: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
e3f0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e400: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20  ined(NO_TLS1_1) 
e410: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e420: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26  SSL_NO_TLS1_1) &
e430: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e440: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54  SL_NO_TLS1_1_MET
e450: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
e460: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a  S_PROTO_TLS1_1:.
e470: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e480: 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72  er ? TLSv1_1_ser
e490: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e4a0: 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_1_client_me
e4b0: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
e4c0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e4d0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  ned(NO_TLS1_2) &
e4e0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e4f0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26  SL_NO_TLS1_2) &&
e500: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e510: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48  L_NO_TLS1_2_METH
e520: 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53  OD).    case TLS
e530: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09  _PROTO_TLS1_2:..
e540: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e550: 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72 76  r ? TLSv1_2_serv
e560: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e570: 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74  Sv1_2_client_met
e580: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
e590: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e5a0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26  ed(NO_TLS1_3) &&
e5b0: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e5c0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
e5d0: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
e5e0: 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20  TLS1_3:../* Use 
e5f0: 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74 68  the generic meth
e600: 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e  od and constrain
e610: 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63 6f  t range after co
e620: 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65 64  ntext is created
e630: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
e640: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
e650: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e660: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
e670: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e680: 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  if.    default:.
e690: 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68 69  ./* Negotiate hi
e6a0: 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65 20  ghest available 
e6b0: 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20  SSL/TLS version 
e6c0: 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  */..method = isS
e6d0: 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76  erver ? TLS_serv
e6e0: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e6f0: 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  S_client_method(
e700: 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  );.#if OPENSSL_V
e710: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20  ERSION_NUMBER < 
e720: 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20 21  0x10100000L && !
e730: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
e740: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e750: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f  NSSL_NO_SSL2)..o
e760: 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70  ff |= (ENABLED(p
e770: 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f  roto, TLS_PROTO_
e780: 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53 53  SSL2)   ? 0 : SS
e790: 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a  L_OP_NO_SSLv2);.
e7a0: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e7b0: 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20  ned(NO_SSL3) && 
e7c0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e7d0: 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c  _NO_SSL3)..off |
e7e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e7f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33  , TLS_PROTO_SSL3
e800: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
e810: 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64  _NO_SSLv3);.#end
e820: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e830: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
e840: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e850: 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  TLS1)..off |= (E
e860: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e870: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20  S_PROTO_TLS1)   
e880: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e890: 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23  TLSv1);.#endif.#
e8a0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e8b0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
e8c0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e8d0: 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_1)..off |= (E
e8e0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e8f0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20  S_PROTO_TLS1_1) 
e900: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e910: 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66  TLSv1_1);.#endif
e920: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e930: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
e940: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e950: 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20  TLS1_2)..off |= 
e960: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
e970: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
e980: 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e  ) ? 0 : SSL_OP_N
e990: 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64  O_TLSv1_2);.#end
e9a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e9b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e9c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e9d0: 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c  O_TLS1_3)..off |
e9e0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e9f0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
ea00: 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  _3) ? 0 : SSL_OP
ea10: 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65  _NO_TLSv1_3);.#e
ea20: 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20  ndif..break;.   
ea30: 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61   }..    ERR_clea
ea40: 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20  r_error();..    
ea50: 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65  ctx = SSL_CTX_ne
ea60: 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20 69  w(method);.    i
ea70: 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74 75  f (!ctx) {..retu
ea80: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a  rn NULL;.    }..
ea90: 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28 53      if (getenv(S
eaa0: 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b  SLKEYLOGFILE)) {
eab0: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65  ..SSL_CTX_set_ke
eac0: 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74  ylog_callback(ct
ead0: 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63  x, KeyLogCallbac
eae0: 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21  k);.    }..#if !
eaf0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
eb00: 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  3) && !defined(O
eb10: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33  PENSSL_NO_TLS1_3
eb20: 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20  ).    if (proto 
eb30: 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  == TLS_PROTO_TLS
eb40: 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f  1_3) {..SSL_CTX_
eb50: 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65  set_min_proto_ve
eb60: 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f  rsion(ctx, TLS1_
eb70: 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c  3_VERSION);..SSL
eb80: 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f  _CTX_set_max_pro
eb90: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
eba0: 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b  TLS1_3_VERSION);
ebb0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
ebc0: 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70 68     /* Force ciph
ebd0: 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64  er selection ord
ebe0: 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f 0a  er by server */.
ebf0: 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76 65      if (!isServe
ec00: 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65  r) {..SSL_CTX_se
ec10: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
ec20: 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45 52  SL_OP_CIPHER_SER
ec30: 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29 3b  VER_PREFERENCE);
ec40: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e  .    }..#if OPEN
ec50: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
ec60: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
ec70: 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64  .    OpenSSL_add
ec80: 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28  _all_algorithms(
ec90: 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65  ); /* Load ciphe
eca0: 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20 2a  rs and digests *
ecb0: 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53 53  /.#endif..    SS
ecc0: 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64 61  L_CTX_set_app_da
ecd0: 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29 69  ta(ctx, (void*)i
ece0: 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d  nterp);./* remem
ecf0: 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72 65  ber the interpre
ed00: 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ter */.    SSL_C
ed10: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
ed20: 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b  tx, SSL_OP_ALL);
ed30: 09 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 53  ./* Enable all S
ed40: 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e  SL bug workaroun
ed50: 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54  ds */.    SSL_CT
ed60: 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74  X_set_options(ct
ed70: 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d  x, SSL_OP_NO_COM
ed80: 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 69  PRESSION);./* Di
ed90: 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f  sable compressio
eda0: 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f 72  n even if suppor
edb0: 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  ted */.    SSL_C
edc0: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
edd0: 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 44 69  tx, off);../* Di
ede0: 73 61 62 6c 65 20 73 70 65 63 69 66 69 65 64 20  sable specified 
edf0: 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e  protocol version
ee00: 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c  s */..    /* All
ee10: 6f 77 20 77 72 69 74 65 73 20 74 6f 20 72 65 70  ow writes to rep
ee20: 6f 72 74 20 73 75 63 63 65 73 73 20 77 68 65 6e  ort success when
ee30: 20 6c 65 73 73 20 74 68 61 6e 20 61 6c 6c 20 72   less than all r
ee40: 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 65 6e  ecords have been
ee50: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20   written */.    
ee60: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65  SSL_CTX_set_mode
ee70: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45  (ctx, SSL_MODE_E
ee80: 4e 41 42 4c 45 5f 50 41 52 54 49 41 4c 5f 57 52  NABLE_PARTIAL_WR
ee90: 49 54 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 69  ITE);..    /* Di
eea0: 73 61 62 6c 65 20 61 74 74 65 6d 70 74 73 20 74  sable attempts t
eeb0: 6f 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73 73  o try to process
eec0: 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64   the next record
eed0: 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 74 75   instead of retu
eee0: 72 6e 69 6e 67 20 61 66 74 65 72 20 61 0a 20 20  rning after a.  
eef0: 20 20 20 20 20 6e 6f 6e 2d 61 70 70 20 72 65 63       non-app rec
ef00: 6f 72 64 2e 20 41 76 6f 69 64 73 20 68 61 6e 67  ord. Avoids hang
ef10: 73 20 69 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f  s in blocking mo
ef20: 64 65 2c 20 77 68 65 6e 20 75 73 69 6e 67 20 53  de, when using S
ef30: 53 4c 5f 72 65 61 64 28 29 20 61 6e 64 20 61 0a  SL_read() and a.
ef40: 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 6c 69         non-appli
ef50: 63 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 77 61  cation record wa
ef60: 73 20 73 65 6e 74 20 77 69 74 68 6f 75 74 20 61  s sent without a
ef70: 6e 79 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64  ny application d
ef80: 61 74 61 2e 20 2a 2f 0a 20 20 20 20 2f 2a 53 53  ata. */.    /*SS
ef90: 4c 5f 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65  L_CTX_clear_mode
efa0: 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41  (ctx, SSL_MODE_A
efb0: 55 54 4f 5f 52 45 54 52 59 29 3b 2a 2f 0a 0a 20  UTO_RETRY);*/.. 
efc0: 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f     SSL_CTX_sess_
efd0: 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28 63  set_cache_size(c
efe0: 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f  tx, 128);..    /
eff0: 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69 6e  * Set user defin
f000: 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70 68  ed ciphers, ciph
f010: 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20 73  er suites, and s
f020: 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
f030: 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65 72  .    if ((cipher
f040: 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53  s != NULL) && !S
f050: 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68 65  SL_CTX_set_ciphe
f060: 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70 68  r_list(ctx, ciph
f070: 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  ers)) {..Tcl_App
f080: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f090: 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20 66  , "Set ciphers f
f0a0: 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20  ailed: No valid 
f0b0: 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20  ciphers", (char 
f0c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43  *) NULL);..SSL_C
f0d0: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72  TX_free(ctx);..r
f0e0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
f0f0: 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  }.    if ((ciphe
f100: 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29  rsuites != NULL)
f110: 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65 74   && !SSL_CTX_set
f120: 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63 74  _ciphersuites(ct
f130: 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73 29  x, ciphersuites)
f140: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
f150: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
f160: 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65 73  et cipher suites
f170: 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69   failed: No vali
f180: 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61  d ciphers", (cha
f190: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c  r *) NULL);..SSL
f1a0: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
f1b0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
f1c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20    }..    /* set 
f1d0: 61 75 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20  automatic curve 
f1e0: 73 65 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20  selection */.   
f1f0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 65 63 64   SSL_CTX_set_ecd
f200: 68 5f 61 75 74 6f 28 63 74 78 2c 20 31 29 3b 0a  h_auto(ctx, 1);.
f210: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
f220: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f230: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
f240: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
f250: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
f260: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
f270: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
f280: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
f290: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
f2a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
f2b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
f2c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f2d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
f2e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
f2f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
f300: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
f310: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
f320: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
f330: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
f340: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
f350: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
f360: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
f370: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
f380: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
f390: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66  ngInit(&ds);.#if
f3a0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
f3b0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
f3c0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
f3d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f3e0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
f3f0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
f400: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
f410: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
f420: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f430: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
f440: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
f450: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
f460: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f470: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
f480: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  o;...    bio = B
f490: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
f4a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
f4b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
f4c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
f4d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f4e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f4f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
f500: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
f510: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
f520: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f530: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
f540: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
f550: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
f560: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
f570: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
f580: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
f590: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
f5a0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
f5b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f5c0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
f5d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
f5e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
f5f0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
f600: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
f610: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
f620: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f630: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f640: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f650: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
f660: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
f670: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65  h);..    DH_free
f680: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  (dh);...} else {
f690: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
f6a0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
f6b0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
f6c0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
f6d0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
f6e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
f6f0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
f700: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
f710: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f720: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
f730: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
f740: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
f750: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f760: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f770: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f780: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f790: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
f7a0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
f7b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
f7c0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
f7d0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
f7e0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
f7f0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
f800: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
f810: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f820: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
f830: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
f840: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
f850: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
f860: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
f870: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f880: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f890: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f8a0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
f8b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
f8c0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
f8d0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
f8e0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f8f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f900: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f910: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
f920: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f930: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65  e(&ds);..    } e
f940: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20  lse if (cert != 
f950: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
f960: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09  ivate_key = 1;..
f970: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f980: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31  certificate_ASN1
f990: 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 74  (ctx, (int) cert
f9a0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30  _len, cert) <= 0
f9b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
f9c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f9d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f9e0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
f9f0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
fa00: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
fa10: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
fa20: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
fa30: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
fa40: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
fa50: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
fa60: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
fa70: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
fa80: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
fa90: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
faa0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
fab0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
fac0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
fad0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  0..    Tcl_Appen
fae0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
faf0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
fb00: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
fb10: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
fb20: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54  ile, ": ",...GET
fb30: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
fb40: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
fb50: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
fb60: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
fb70: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
fb80: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
fb90: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65   set our private
fba0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
fbb0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
fbc0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  ) {..if (keyfile
fbd0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20   == NULL && key 
fbe0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
fbf0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
fc00: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79  le;..}...if (key
fc10: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
fc20: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20  .    /* get the 
fc30: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
fc40: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
fc50: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
fc60: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
fc70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65   == NULL) {...ke
fc80: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
fc90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
fca0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
fcb0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63  rivateKey_file(c
fcc0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c  tx, F2N(keyfile,
fcd0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
fce0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
fcf0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
fd00: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
fd10: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
fd20: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
fd30: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
fd40: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
fd50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
fd60: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
fd70: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
fd80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
fd90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
fda0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
fdb0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09  keyfile, " ",...
fdc0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53      GET_ERR_REAS
fdd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
fde0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
fdf0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
fe00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
fe10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
fe20: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20  gFree(&ds);...} 
fe30: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20  else if (key != 
fe40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
fe50: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
fe60: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50  vateKey_ASN1(EVP
fe70: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20  _PKEY_RSA, ctx, 
fe80: 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c  key, (int) key_l
fe90: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a  en) <= 0) {.../*
fea0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
feb0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
fec0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
fed0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
fee0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
fef0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
ff00: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
ff10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ff20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
ff30: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47  public key: ", G
ff40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
ff50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
ff60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
ff70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
ff80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
ff90: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
ffa0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
ffb0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
ffc0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
ffd0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
ffe0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
fff0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
10000 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
10010 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
10020 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
10030 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
10040 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
10050 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
10060 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
10070 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
10080 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
10090 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
100a0 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
100b0 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68 65  * Set to use the
100c0 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
100d0 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
100e0 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
100f0 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
10100 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20 54  icates..     * T
10110 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65  he default CA ce
10120 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63  rtificates direc
10130 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20 63  tory is called c
10140 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66 61  erts in the defa
10150 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20  ult OpenSSL.    
10160 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74   * directory. It
10170 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 41   contains the CA
10180 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e   certificates in
10190 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74   PEM format, wit
101a0 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  h one certificat
101b0 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69 6c  e per.     * fil
101c0 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70 61  e. The verify pa
101d0 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e  th and store can
101e0 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
101f0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44  y the SSL_CERT_D
10200 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a  IR env var. The.
10210 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20 43       * default C
10220 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66  A certificates f
10230 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65  ile is called ce
10240 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65  rt.pem in the de
10250 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69  fault OpenSSL di
10260 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20  rectory..     * 
10270 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20  The verify file 
10280 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
10290 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
102a0 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20  T_FILE env var. 
102b0 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
102c0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
102d0 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
102e0 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20  )) {..abort++;. 
102f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
10300 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43  rrides for the C
10310 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  A verify path an
10320 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a  d file */.    {.
10330 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
10340 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
10350 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41  0000000L..if (CA
10360 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  path != NULL || 
10370 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
10380 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
10390 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c  ng ds1;..    Tcl
103a0 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
103b0 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53  1);...    if (!S
103c0 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
103d0 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
103e0 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
103f0 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  s), F2N(CApath, 
10400 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72  &ds1))) {...abor
10410 74 2b 2b 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55  t++;...return NU
10420 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  LL;..    }..    
10430 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
10440 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44  &ds);..    Tcl_D
10450 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31 29  StringFree(&ds1)
10460 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
10470 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
10480 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
10490 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
104a0 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
104b0 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74  e */..    /* htt
104c0 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65  ps://sourceforge
104d0 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f  .net/p/tls/bugs/
104e0 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58  57/ */..    /* X
104f0 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65  XX:TODO: Let the
10500 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61 6c   user supply val
10510 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61 64  ues here instead
10520 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   of something th
10530 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65  at exists on the
10540 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09   filesystem */..
10550 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35 30      STACK_OF(X50
10560 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d  9_NAME) *certNam
10570 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c  es = SSL_load_cl
10580 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e  ient_CA_file(F2N
10590 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a  (CAfile, &ds));.
105a0 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61 6d  .    if (certNam
105b0 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  es != NULL) {...
105c0 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65  SSL_CTX_set_clie
105d0 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c 20  nt_CA_list(ctx, 
105e0 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20  certNames);..   
105f0 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72   }..    Tcl_DStr
10600 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d  ingFree(&ds);..}
10610 0a 0a 23 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20  ..#else../* Set 
10620 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69  directory contai
10630 6e 69 6e 67 20 43 41 20 63 65 72 74 69 66 69 63  ning CA certific
10640 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d  ates in PEM form
10650 61 74 2e 20 2a 2f 0a 09 69 66 20 28 43 41 70 61  at. */..if (CApa
10660 74 68 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  th != NULL) {.. 
10670 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
10680 6c 6f 61 64 5f 76 65 72 69 66 79 5f 64 69 72 28  load_verify_dir(
10690 63 74 78 2c 20 46 32 4e 28 43 41 70 61 74 68 2c  ctx, F2N(CApath,
106a0 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72   &ds))) {...abor
106b0 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
106c0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
106d0 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  (&ds);..}.../* S
106e0 65 74 20 55 52 49 20 66 6f 72 20 74 6f 20 61 20  et URI for to a 
106f0 73 74 6f 72 65 2c 20 77 68 69 63 68 20 6d 61 79  store, which may
10700 20 62 65 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e   be a single con
10710 74 61 69 6e 65 72 20 6f 72 20 61 20 63 61 74 61  tainer or a cata
10720 6c 6f 67 20 6f 66 20 63 6f 6e 74 61 69 6e 65 72  log of container
10730 73 2e 20 2a 2f 0a 09 69 66 20 28 43 41 73 74 6f  s. */..if (CAsto
10740 72 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  re != NULL) {.. 
10750 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f     if (!SSL_CTX_
10760 6c 6f 61 64 5f 76 65 72 69 66 79 5f 73 74 6f 72  load_verify_stor
10770 65 28 63 74 78 2c 20 46 32 4e 28 43 41 73 74 6f  e(ctx, F2N(CAsto
10780 72 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61  re, &ds))) {...a
10790 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09  bort++;..    }..
107a0 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
107b0 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f  ree(&ds);..}.../
107c0 2a 20 53 65 74 20 66 69 6c 65 20 6f 66 20 43 41  * Set file of CA
107d0 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e   certificates in
107e0 20 50 45 4d 20 66 6f 72 6d 61 74 2e 20 20 2a 2f   PEM format.  */
107f0 0a 09 69 66 20 28 43 41 66 69 6c 65 20 21 3d 20  ..if (CAfile != 
10800 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
10810 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
10820 65 72 69 66 79 5f 66 69 6c 65 28 63 74 78 2c 20  erify_file(ctx, 
10830 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
10840 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a  )) {...abort++;.
10850 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
10860 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
10870 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20 6c  ;...    /* Set l
10880 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73 65  ist of CAs to se
10890 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68 65  nd to client whe
108a0 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 63  n requesting a c
108b0 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61 74  lient certificat
108c0 65 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f  e */..    STACK_
108d0 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
108e0 65 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c  ertNames = SSL_l
108f0 6f 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69  oad_client_CA_fi
10900 6c 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26  le(F2N(CAfile, &
10910 64 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63  ds));..    if (c
10920 65 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c  ertNames != NULL
10930 29 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65  ) {...SSL_CTX_se
10940 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74  t_client_CA_list
10950 28 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29  (ctx, certNames)
10960 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
10970 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
10980 73 29 3b 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20  s);..}.#endif.  
10990 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63    }.    return c
109a0 74 78 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tx;.}.../*. *---
109b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109f0 0a 20 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a  . *. * StatusObj
10a00 43 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65  Cmd -- return ce
10a10 72 74 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f  rtificate for co
10a20 6e 6e 65 63 74 65 64 20 70 65 65 72 20 69 6e 66  nnected peer inf
10a30 6f 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  o.. *. * Results
10a40 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
10a50 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20  Tcl result.. *. 
10a60 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
10a70 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d   *.None.. *. *--
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ac0 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
10ad0 0a 53 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c  .StatusObjCmd(Cl
10ae0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
10af0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
10b00 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
10b10 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
10b20 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
10b30 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b  State *statePtr;
10b40 0a 20 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b  .    X509 *peer;
10b50 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  .    Tcl_Obj *ob
10b60 6a 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68  jPtr;.    Tcl_Ch
10b70 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20  annel chan;.    
10b80 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d  char *channelNam
10b90 65 2c 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20  e, *ciphers;.   
10ba0 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63   int mode;.    c
10bb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
10bc0 61 72 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75  ar *proto;.    u
10bd0 6e 73 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b  nsigned int len;
10be0 0a 20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65  .    int nid, re
10bf0 73 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  s;.    (void) cl
10c00 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
10c10 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
10c20 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
10c30 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20  < 2 || objc > 3 
10c40 7c 7c 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26  || (objc == 3 &&
10c50 20 21 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74   !strcmp(Tcl_Get
10c60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10c70 20 22 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09   "-local"))) {..
10c80 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
10c90 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
10ca0 2c 20 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e  , "?-local? chan
10cb0 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
10cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
10cd0 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e  .    /* Get chan
10ce0 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68  nel Id */.    ch
10cf0 61 6e 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f  annelName = Tcl_
10d00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28  GetString(objv[(
10d10 6f 62 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20  objc == 2 ? 1 : 
10d20 32 29 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d  2)]);.    chan =
10d30 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
10d40 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e  interp, channelN
10d50 61 6d 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20  ame, &mode);.   
10d60 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63   if (chan == (Tc
10d70 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
10d80 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
10d90 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
10da0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f   /* Make sure to
10db0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
10dc0 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20  topmost channel 
10dd0 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  */.    chan = Tc
10de0 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28  l_GetTopChannel(
10df0 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54  chan);.    if (T
10e00 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70  cl_GetChannelTyp
10e10 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43  e(chan) != Tls_C
10e20 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a  hannelType()) {.
10e30 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
10e40 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63  t(interp, "bad c
10e50 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f  hannel \"", Tcl_
10e60 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63  GetChannelName(c
10e70 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74  han),..."\": not
10e80 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c   a TLS channel",
10e90 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
10ea0 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
10eb0 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
10ec0 2c 20 22 53 54 41 54 55 53 22 2c 20 22 43 48 41  , "STATUS", "CHA
10ed0 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
10ee0 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
10ef0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
10f00 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ROR;.    }.    s
10f10 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
10f20 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
10f30 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
10f40 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65  han);..    /* Ge
10f50 74 20 63 65 72 74 69 66 69 63 61 74 65 20 66 6f  t certificate fo
10f60 72 20 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a  r peer or self *
10f70 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  /.    if (objc =
10f80 3d 20 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53  = 2) {..peer = S
10f90 53 4c 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74  SL_get_peer_cert
10fa0 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74 72  ificate(statePtr
10fb0 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
10fc0 73 65 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  se {..peer = SSL
10fd0 5f 67 65 74 5f 63 65 72 74 69 66 69 63 61 74 65  _get_certificate
10fe0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
10ff0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65  .    }.    /* Ge
11000 74 20 58 35 30 39 20 63 65 72 74 69 66 69 63 61  t X509 certifica
11010 74 65 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69  te info */.    i
11020 66 20 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50  f (peer) {..objP
11030 74 72 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39  tr = Tls_NewX509
11040 4f 62 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72  Obj(interp, peer
11050 2c 20 31 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20  , 1);..if (objc 
11060 3d 3d 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30  == 2) {..    X50
11070 39 5f 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20  9_free(peer);.. 
11080 20 20 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a     peer = NULL;.
11090 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .}.    } else {.
110a0 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65  .objPtr = Tcl_Ne
110b0 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c  wListObj(0, NULL
110c0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
110d0 20 50 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20   Peer name */.  
110e0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
110f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70  terp, objPtr, "p
11100 65 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  eername", SSL_ge
11110 74 30 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74  t0_peername(stat
11120 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b  ePtr->ssl), -1);
11130 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54  .    LAPPEND_INT
11140 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11150 20 22 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65   "sbits", SSL_ge
11160 74 5f 63 69 70 68 65 72 5f 62 69 74 73 28 73 74  t_cipher_bits(st
11170 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c  atePtr->ssl, NUL
11180 4c 29 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72  L));..    cipher
11190 73 20 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67  s = (char*)SSL_g
111a0 65 74 5f 63 69 70 68 65 72 28 73 74 61 74 65 50  et_cipher(stateP
111b0 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41  tr->ssl);.    LA
111c0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
111d0 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
111e0 72 22 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29  r", ciphers, -1)
111f0 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
11200 20 74 68 65 20 58 35 30 39 20 63 65 72 74 69 66   the X509 certif
11210 69 63 61 74 65 20 70 72 65 73 65 6e 74 65 64 20  icate presented 
11220 62 79 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20  by the peer */. 
11230 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
11240 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11250 76 65 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09  verifyResult",..
11260 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74  X509_verify_cert
11270 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53  _error_string(SS
11280 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73  L_get_verify_res
11290 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ult(statePtr->ss
112a0 6c 29 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  l)), -1);..    /
112b0 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f  * Verify mode */
112c0 0a 20 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f  .    mode = SSL_
112d0 67 65 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28  get_verify_mode(
112e0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
112f0 20 20 20 20 69 66 20 28 6d 6f 64 65 20 26 26 20      if (mode && 
11300 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29  SSL_VERIFY_NONE)
11310 20 7b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28   {..LAPPEND_STR(
11320 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
11330 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e  "verifyMode", "n
11340 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  one", -1);.    }
11350 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a   else {..Tcl_Obj
11360 20 2a 6c 69 73 74 4f 62 6a 50 74 72 20 3d 20 54   *listObjPtr = T
11370 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
11380 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64   NULL);..if (mod
11390 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
113a0 50 45 45 52 29 20 7b 0a 09 20 20 20 20 54 63 6c  PEER) {..    Tcl
113b0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
113c0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69  ement(interp, li
113d0 73 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  stObjPtr, Tcl_Ne
113e0 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 65 65 72  wStringObj("peer
113f0 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
11400 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52  (mode && SSL_VER
11410 49 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50  IFY_FAIL_IF_NO_P
11420 45 45 52 5f 43 45 52 54 29 20 7b 0a 09 20 20 20  EER_CERT) {..   
11430 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11440 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11450 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
11460 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11470 66 61 69 6c 20 69 66 20 6e 6f 20 70 65 65 72 20  fail if no peer 
11480 63 65 72 74 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a  cert", -1));..}.
11490 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
114a0 5f 56 45 52 49 46 59 5f 43 4c 49 45 4e 54 5f 4f  _VERIFY_CLIENT_O
114b0 4e 43 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  NCE) {..    Tcl_
114c0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
114d0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
114e0 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
114f0 53 74 72 69 6e 67 4f 62 6a 28 22 63 6c 69 65 6e  StringObj("clien
11500 74 20 6f 6e 63 65 22 2c 20 2d 31 29 29 3b 0a 09  t once", -1));..
11510 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53  }..if (mode && S
11520 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f 48  SL_VERIFY_POST_H
11530 41 4e 44 53 48 41 4b 45 29 20 7b 0a 09 20 20 20  ANDSHAKE) {..   
11540 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
11550 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
11560 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
11570 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
11580 70 6f 73 74 20 68 61 6e 64 73 68 61 6b 65 22 2c  post handshake",
11590 20 2d 31 29 29 3b 0a 09 7d 0a 09 4c 41 50 50 45   -1));..}..LAPPE
115a0 4e 44 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f  ND_OBJ(interp, o
115b0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f  bjPtr, "verifyMo
115c0 64 65 22 2c 20 6c 69 73 74 4f 62 6a 50 74 72 29  de", listObjPtr)
115d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56  .    }..    /* V
115e0 65 72 69 66 79 20 6d 6f 64 65 20 64 65 70 74 68  erify mode depth
115f0 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
11600 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
11610 74 72 2c 20 22 76 65 72 69 66 79 44 65 70 74 68  tr, "verifyDepth
11620 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ", SSL_get_verif
11630 79 5f 64 65 70 74 68 28 73 74 61 74 65 50 74 72  y_depth(statePtr
11640 2d 3e 73 73 6c 29 29 3b 0a 0a 20 20 20 20 2f 2a  ->ssl));..    /*
11650 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
11660 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
11670 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
11680 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
11690 20 20 20 20 53 53 4c 5f 67 65 74 30 5f 61 6c 70      SSL_get0_alp
116a0 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61 74 65  n_selected(state
116b0 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f  Ptr->ssl, &proto
116c0 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  , &len);.    LAP
116d0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
116e0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
116f0 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
11700 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 3b  (Tcl_Size) len);
11710 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11720 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11730 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c   "protocol", SSL
11740 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28 73 74 61  _get_version(sta
11750 74 65 50 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29  tePtr->ssl), -1)
11760 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 20  ;..    /* Valid 
11770 66 6f 72 20 6e 6f 6e 2d 52 53 41 20 73 69 67 6e  for non-RSA sign
11780 61 74 75 72 65 20 61 6e 64 20 54 4c 53 20 31 2e  ature and TLS 1.
11790 33 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a  3 */.    if (obj
117a0 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
117b0 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
117c0 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
117d0 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
117e0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
117f0 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69  res = SSL_get_si
11800 67 6e 61 74 75 72 65 5f 6e 69 64 28 73 74 61 74  gnature_nid(stat
11810 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29  ePtr->ssl, &nid)
11820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
11830 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30 3b 7d  !res) {nid = 0;}
11840 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11850 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11860 20 22 73 69 67 6e 61 74 75 72 65 48 61 73 68 41   "signatureHashA
11870 6c 67 6f 72 69 74 68 6d 22 2c 20 4f 42 4a 5f 6e  lgorithm", OBJ_n
11880 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b  id2ln(nid), -1);
11890 0a 0a 20 20 20 20 2f 2a 20 41 64 64 65 64 20 69  ..    /* Added i
118a0 6e 20 4f 70 65 6e 53 53 4c 20 31 2e 31 2e 31 61  n OpenSSL 1.1.1a
118b0 20 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   */.#if OPENSSL_
118c0 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e  VERSION_NUMBER >
118d0 20 30 78 31 30 31 30 31 30 30 30 4c 0a 20 20 20   0x10101000L.   
118e0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
118f0 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
11900 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
11910 74 79 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74  type_nid(statePt
11920 72 2d 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20  r->ssl, &nid);. 
11930 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73     } else {..res
11940 20 3d 20 53 53 4c 5f 67 65 74 5f 73 69 67 6e 61   = SSL_get_signa
11950 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
11960 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
11970 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  d);.    }.    if
11980 20 28 21 72 65 73 29 20 7b 6e 69 64 20 3d 20 30   (!res) {nid = 0
11990 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  ;}.    LAPPEND_S
119a0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
119b0 72 2c 20 22 73 69 67 6e 61 74 75 72 65 54 79 70  r, "signatureTyp
119c0 65 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  e", OBJ_nid2ln(n
119d0 69 64 29 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  id), -1);.#endif
119e0 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ..    Tcl_SetObj
119f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f  Result(interp, o
11a00 62 6a 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75  bjPtr);.    retu
11a10 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
11a20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
11a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 6f  -------. *. * Co
11a70 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
11a80 6d 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 6f 6e  md -- return con
11a90 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 66 72 6f  nection info fro
11aa0 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20 2a 0a 20 2a  m OpenSSL.. *. *
11ab0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 6c   Results:. *.A l
11ac0 69 73 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  ist of connectio
11ad0 6e 20 69 6e 66 6f 0a 20 20 2a 0a 20 2a 2d 2d 2d  n info.  *. *---
11ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b20 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  . */..static int
11b30 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f   ConnectionInfoO
11b40 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
11b50 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
11b60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11b70 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
11b80 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
11b90 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  ) {.    Tcl_Chan
11ba0 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20 54 68  nel chan;../* Th
11bb0 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73 65 74  e channel to set
11bc0 20 61 20 6d 6f 64 65 20 6f 6e 20 2a 2f 0a 20 20   a mode on */.  
11bd0 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
11be0 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74 20 73 74  r;../* client st
11bf0 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b  ate for ssl sock
11c00 65 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  et */.    Tcl_Ob
11c10 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6c 69 73 74  j *objPtr, *list
11c20 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53  Ptr;.    const S
11c30 53 4c 20 2a 73 73 6c 3b 0a 20 20 20 20 63 6f 6e  SL *ssl;.    con
11c40 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63  st SSL_CIPHER *c
11c50 69 70 68 65 72 3b 0a 20 20 20 20 63 6f 6e 73 74  ipher;.    const
11c60 20 53 53 4c 5f 53 45 53 53 49 4f 4e 20 2a 73 65   SSL_SESSION *se
11c70 73 73 69 6f 6e 3b 0a 20 20 20 20 63 6f 6e 73 74  ssion;.    const
11c80 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 20 20 20   EVP_MD *md;.   
11c90 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
11ca0 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
11cb0 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
11cc0 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
11cd0 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
11ce0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
11cf0 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
11d00 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
11d10 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  OR;.    }..    c
11d20 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
11d30 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
11d40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
11d50 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
11d60 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
11d70 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
11d80 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
11d90 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
11da0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
11db0 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
11dc0 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
11dd0 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
11de0 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
11df0 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
11e00 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
11e10 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
11e20 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
11e30 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11e40 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
11e50 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
11e60 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
11e70 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
11e80 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
11e90 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
11ea0 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
11eb0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
11ec0 53 22 2c 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22  S", "CONNECTION"
11ed0 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e  , "CHANNEL", "IN
11ee0 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29  VALID", (char *)
11ef0 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20   NULL);..return 
11f00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11f10 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54  ..    objPtr = T
11f20 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
11f30 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20   NULL);..    /* 
11f40 43 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20  Connection info 
11f50 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 20  */.    statePtr 
11f60 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
11f70 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
11f80 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 20 20 20  eData(chan);.   
11f90 20 73 73 6c 20 3d 20 73 74 61 74 65 50 74 72 2d   ssl = statePtr-
11fa0 3e 73 73 6c 3b 0a 20 20 20 20 69 66 20 28 73 73  >ssl;.    if (ss
11fb0 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f  l != NULL) {..co
11fc0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
11fd0 72 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67  r *proto;..unsig
11fe0 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09  ned int ulen;...
11ff0 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f  /* Initializatio
12000 6e 20 66 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c  n finished */..L
12010 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12020 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69  rp, objPtr, "ini
12030 74 5f 66 69 6e 69 73 68 65 64 22 2c 20 53 53 4c  t_finished", SSL
12040 5f 69 73 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65  _is_init_finishe
12050 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 63 6f  d(ssl));.../* co
12060 6e 6e 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a  nnection state *
12070 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
12080 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12090 73 74 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74  state", SSL_stat
120a0 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73  e_string_long(ss
120b0 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65  l), -1);.../* Ge
120c0 74 20 53 4e 49 20 72 65 71 75 65 73 74 65 64 20  t SNI requested 
120d0 73 65 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  server name */..
120e0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
120f0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72  rp, objPtr, "ser
12100 76 65 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65  vername", SSL_ge
12110 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c  t_servername(ssl
12120 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50  , TLSEXT_NAMETYP
12130 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31  E_host_name), -1
12140 29 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74  );.../* Report t
12150 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74  he selected prot
12160 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74  ocol as a result
12170 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74   of the negotiat
12180 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30  ion */..SSL_get0
12190 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
121a0 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70  tatePtr->ssl, &p
121b0 72 6f 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c  roto, &ulen);..L
121c0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
121d0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e  p, objPtr, "alpn
121e0 22 2c 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f  ", (char *)proto
121f0 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65  , (Tcl_Size) ule
12200 6e 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f  n);.../* Get pro
12210 74 6f 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e  tocol */..LAPPEN
12220 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12230 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
12240 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
12250 6e 28 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f  n(ssl), -1);.../
12260 2a 20 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20  * Renegotiation 
12270 61 6c 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50  allowed */..LAPP
12280 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
12290 20 6f 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f   objPtr, "renego
122a0 74 69 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22  tiation_allowed"
122b0 2c 20 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65  , SSL_get_secure
122c0 5f 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73  _renegotiation_s
122d0 75 70 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73  upport((SSL *) s
122e0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73  sl));.../* Get s
122f0 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f  ecurity level */
12300 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12310 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73  terp, objPtr, "s
12320 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
12330 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79  SSL_get_security
12340 5f 6c 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09  _level(ssl));...
12350 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20  /* Session info 
12360 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
12370 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12380 20 22 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64   "session_reused
12390 22 2c 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72  ", SSL_session_r
123a0 65 75 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f  eused(ssl));.../
123b0 2a 20 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f  * Is server info
123c0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
123d0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
123e0 2c 20 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53  , "is_server", S
123f0 53 4c 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c  SL_is_server(ssl
12400 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53  ));.../* Is DTLS
12410 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
12420 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
12430 2c 20 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c  , "is_dtls", SSL
12440 5f 69 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a  _is_dtls(ssl));.
12450 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
12460 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
12470 78 33 30 32 30 30 30 30 30 4c 0a 09 2f 2a 20 49  x30200000L../* I
12480 73 20 51 55 49 43 20 2a 2f 0a 09 4c 41 50 50 45  s QUIC */..LAPPE
12490 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
124a0 6f 62 6a 50 74 72 2c 20 22 69 73 5f 71 75 69 63  objPtr, "is_quic
124b0 22 2c 20 53 53 4c 5f 69 73 5f 71 75 69 63 28 73  ", SSL_is_quic(s
124c0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c  sl));.../* Is TL
124d0 53 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f  S */..LAPPEND_BO
124e0 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  OL(interp, objPt
124f0 72 2c 20 22 69 73 5f 74 6c 73 22 2c 20 53 53 4c  r, "is_tls", SSL
12500 5f 69 73 5f 74 6c 73 28 73 73 6c 29 29 3b 0a 23  _is_tls(ssl));.#
12510 65 6e 64 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 20  endif.../* DANE 
12520 54 4c 53 20 61 75 74 68 65 6e 74 69 63 61 74 69  TLS authenticati
12530 6f 6e 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  on */..LAPPEND_B
12540 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
12550 74 72 2c 20 22 64 61 6e 65 5f 61 75 74 68 22 2c  tr, "dane_auth",
12560 20 53 53 4c 5f 67 65 74 30 5f 64 61 6e 65 28 28   SSL_get0_dane((
12570 53 53 4c 20 2a 29 73 73 6c 29 20 21 3d 20 4e 55  SSL *)ssl) != NU
12580 4c 4c 29 3b 0a 0a 09 2f 2a 20 57 61 69 74 69 6e  LL);.../* Waitin
12590 67 20 66 6f 72 20 61 73 79 6e 63 20 2a 2f 0a 09  g for async */..
125a0 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
125b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 77 61  erp, objPtr, "wa
125c0 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 22  iting_for_async"
125d0 2c 20 53 53 4c 5f 77 61 69 74 69 6e 67 5f 66 6f  , SSL_waiting_fo
125e0 72 5f 61 73 79 6e 63 28 28 53 53 4c 20 2a 29 73  r_async((SSL *)s
125f0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d  sl));.../* Time-
12600 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  out */..LAPPEND_
12610 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
12620 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c  Ptr, "time-out",
12630 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74   SSL_get_default
12640 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a  _timeout(ssl));.
12650 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 66 69 63  ../* Is Certific
12660 61 74 65 20 54 72 61 6e 73 70 61 72 65 6e 63 79  ate Transparency
12670 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62   validation enab
12680 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  led */..LAPPEND_
12690 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
126a0 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64  Ptr, "ct_enabled
126b0 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61  ", SSL_ct_is_ena
126c0 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 20 20 20  bled(ssl));.    
126d0 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
126e0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
126f0 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
12700 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
12710 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
12720 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
12730 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
12740 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
12750 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20   alg_bits;.../* 
12760 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  Cipher name */..
12770 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12780 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
12790 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  her", SSL_CIPHER
127a0 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
127b0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43  ), -1);.../* RFC
127c0 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
127d0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
127e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
127f0 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
12800 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e   SSL_CIPHER_stan
12810 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
12820 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65  ), -1);.../* Ope
12830 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70  nSSL name of cip
12840 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
12850 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12860 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d  tr, "openssl_nam
12870 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68  e", OPENSSL_ciph
12880 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48  er_name(SSL_CIPH
12890 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
128a0 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
128b0 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73  ../* number of s
128c0 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20  ecret bits used 
128d0 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62  for cipher */..b
128e0 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  its = SSL_CIPHER
128f0 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72  _get_bits(cipher
12900 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c  , &alg_bits);..L
12910 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12920 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72  p, objPtr, "secr
12930 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b  et_bits", bits);
12940 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12950 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
12960 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20  lgorithm_bits", 
12970 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61  alg_bits);../* a
12980 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61  lg_bits is actua
12990 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74  l key secret bit
129a0 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61  s. If use bits a
129b0 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72  nd secret (algor
129c0 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65  ithm) bits diffe
129d0 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20  r,..   the rest 
129e0 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20  of the bits are 
129f0 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20  fixed, i.e. for 
12a00 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63  limited export c
12a10 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35  iphers (bits < 5
12a20 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63  6) */.../* Indic
12a30 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54  ates which SSL/T
12a40 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  LS protocol vers
12a50 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65  ion first define
12a60 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  d the cipher */.
12a70 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12a80 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69  erp, objPtr, "mi
12a90 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f  n_version", SSL_
12aa0 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69  CIPHER_get_versi
12ab0 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  on(cipher), -1);
12ac0 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44  .../* Cipher NID
12ad0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
12ae0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12af0 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63   "cipherNID", (c
12b00 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
12b10 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
12b20 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65  cipher_nid(ciphe
12b30 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
12b40 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
12b50 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49  bjPtr, "digestNI
12b60 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
12b70 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
12b80 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64  R_get_digest_nid
12b90 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12ba0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12bb0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65  erp, objPtr, "ke
12bc0 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28  yExchangeNID", (
12bd0 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
12be0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
12bf0 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29  _kx_nid(cipher))
12c00 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
12c10 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12c20 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74  tr, "authenticat
12c30 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ionNID", (char *
12c40 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
12c50 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f  CIPHER_get_auth_
12c60 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12c70 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20  );.../* message 
12c80 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63  authentication c
12c90 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20  ode - Cipher is 
12ca0 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f  AEAD (e.g. GCM o
12cb0 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31  r ChaCha20/Poly1
12cc0 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09  305) or not */..
12cd0 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64  /* Authenticated
12ce0 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68   Encryption with
12cf0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
12d00 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f   (AEAD) check */
12d10 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
12d20 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12d30 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c  cipher_is_aead",
12d40 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61   SSL_CIPHER_is_a
12d50 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  ead(cipher));...
12d60 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64  /* Digest used d
12d70 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c  uring the SSL/TL
12d80 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e  S handshake when
12d90 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65   using the ciphe
12da0 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f  r. */..md = SSL_
12db0 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73  CIPHER_get_hands
12dc0 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68  hake_digest(ciph
12dd0 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  er);..LAPPEND_ST
12de0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12df0 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  , "handshake_dig
12e00 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56  est", (char *)EV
12e10 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d  P_MD_name(md), -
12e20 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65  1);.../* Get Ope
12e30 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44  nSSL-specific ID
12e40 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f  , not IANA ID */
12e50 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12e60 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12e70 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29  ipher_id", (int)
12e80 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
12e90 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
12ea0 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73  * Two-byte ID us
12eb0 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72  ed in the TLS pr
12ec0 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69  otocol of the gi
12ed0 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  ven cipher */..L
12ee0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12ef0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
12f00 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20  ocol_id", (int) 
12f10 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70  SSL_CIPHER_get_p
12f20 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65  rotocol_id(ciphe
12f30 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61  r));.../* Textua
12f40 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  l description of
12f50 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09   the cipher */..
12f60 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
12f70 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65  escription(ciphe
12f80 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  r, buf, sizeof(b
12f90 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
12fa0 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
12fb0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12fc0 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20   "description", 
12fd0 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20  buf, -1);..}.   
12fe0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69   }..    /* Sessi
12ff0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
13000 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74  ession = SSL_get
13010 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20  _session(ssl);. 
13020 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21     if (session !
13030 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
13040 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13050 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ticket;..size_t 
13060 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20  len2;..unsigned 
13070 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74  int ulen;..const
13080 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
13090 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f  session_id, *pro
130a0 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  to;..unsigned ch
130b0 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
130c0 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
130d0 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
130e0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
130f0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
13100 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
13110 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
13120 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
13130 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
13140 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
13150 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
13160 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
13170 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
13180 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
13190 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
131a0 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
131b0 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
131c0 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
131d0 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74  the NPN negotiat
131e0 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  ion */.#ifdef US
131f0 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f  E_NPN..SSL_get0_
13200 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74  next_proto_negot
13210 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74  iated(ssl, &prot
13220 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  o, &ulen);..LAPP
13230 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13240 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28  objPtr, "npn", (
13250 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
13260 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
13270 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
13280 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
13290 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
132a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
132b0 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c  "resumable", SSL
132c0 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75  _SESSION_is_resu
132d0 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b  mable(session));
132e0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74  .../* Session st
132f0 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64  art time (second
13300 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a  s since epoch) *
13310 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
13320 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13330 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53  "start_time", SS
13340 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
13350 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  me(session));...
13360 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
13370 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74   - SSL_CTX_get_t
13380 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e  imeout (in secon
13390 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
133a0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
133b0 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20  Ptr, "timeout", 
133c0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
133d0 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
133e0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
133f0 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64  id - TLSv1.2 and
13400 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09   below only */..
13410 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
13420 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
13430 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
13440 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
13450 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13460 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73   "session_id", s
13470 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
13480 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
13490 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78  * Session contex
134a0 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  t */..session_id
134b0 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
134c0 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73  et0_id_context(s
134d0 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
134e0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
134f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13500 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74  "session_context
13510 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
13520 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
13530 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
13540 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e  cket - client on
13550 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ly */..SSL_SESSI
13560 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
13570 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
13580 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
13590 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
135a0 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
135b0 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65  n_ticket", ticke
135c0 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
135d0 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n2);.../* Sessio
135e0 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d  n ticket lifetim
135f0 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e  e hint (in secon
13600 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
13610 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
13620 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c  Ptr, "lifetime",
13630 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
13640 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
13650 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b  _hint(session));
13660 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70  .../* Ticket app
13670 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45   data */.#if OPE
13680 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13690 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
136a0 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  L..SSL_SESSION_g
136b0 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61  et0_ticket_appda
136c0 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20  ta((SSL_SESSION 
136d0 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  *) session, &tic
136e0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
136f0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
13700 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
13710 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20  cket_app_data", 
13720 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
13730 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66  e) len2);.#endif
13740 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72  .../* Get master
13750 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20   key */..len2 = 
13760 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
13770 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69  master_key(sessi
13780 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f  on, buffer, SSL_
13790 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
137a0 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44  ENGTH);..LAPPEND
137b0 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
137c0 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f  objPtr, "master_
137d0 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54  key", buffer, (T
137e0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
137f0 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e  ../* Compression
13800 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64   id */..unsigned
13810 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45   int id = SSL_SE
13820 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65  SSION_get_compre
13830 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a  ss_id(session);.
13840 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
13850 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
13860 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69  mpression_id", i
13870 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20  d == 1 ? "zlib" 
13880 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  : "none", -1);. 
13890 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
138a0 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
138b0 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
138c0 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48  NULL) {.#ifdef H
138d0 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
138e0 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f  ION..const COMP_
138f0 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65  METHOD *comp, *e
13900 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c  xpn;..comp = SSL
13910 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d  _get_current_com
13920 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  pression(ssl);..
13930 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63  expn = SSL_get_c
13940 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e  urrent_expansion
13950 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44  (ssl);...LAPPEND
13960 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
13970 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f  Ptr, "compressio
13980 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43  n", comp ? SSL_C
13990 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d  OMP_get_name(com
139a0 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  p) : "none", -1)
139b0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
139c0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
139d0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e  expansion", expn
139e0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
139f0 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f  name(expn) : "no
13a00 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a  ne", -1);.#else.
13a10 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
13a20 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
13a30 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e  mpression", "non
13a40 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
13a50 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13a60 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
13a70 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
13a80 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
13a90 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f    /* Server info
13aa0 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20   */.    {..long 
13ab0 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67  mode = SSL_CTX_g
13ac0 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
13ad0 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
13ae0 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67  ctx);..char *msg
13af0 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53  ;...if (mode & S
13b00 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46  SL_SESS_CACHE_OF
13b10 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  F) {..    msg = 
13b20 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69  "off";..} else i
13b30 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
13b40 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29  SS_CACHE_CLIENT)
13b50 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63   {..    msg = "c
13b60 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20  lient";..} else 
13b70 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
13b80 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52  ESS_CACHE_SERVER
13b90 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
13ba0 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65  server";..} else
13bb0 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
13bc0 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29  SESS_CACHE_BOTH)
13bd0 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62   {..    msg = "b
13be0 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  oth";..} else {.
13bf0 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e  .    msg = "unkn
13c00 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  own";..}..LAPPEN
13c10 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13c20 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63  jPtr, "session_c
13c30 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c  ache_mode", msg,
13c40 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
13c50 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20   /* CA List */. 
13c60 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73     /* IF not a s
13c70 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53  erver, same as S
13c80 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f  SL_get0_peer_CA_
13c90 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20  list. If server 
13ca0 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f  same as SSL_CTX_
13cb0 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  get_client_CA_li
13cc0 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74  st */.    listPt
13cd0 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
13ce0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
13cf0 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
13d00 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20  AME) *ca_list;. 
13d10 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20     if ((ca_list 
13d20 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74  = SSL_get_client
13d30 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21  _CA_list(ssl)) !
13d40 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
13d50 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a  buffer[BUFSIZ];.
13d60 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b  .for (int i = 0;
13d70 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d   i < sk_X509_NAM
13d80 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20  E_num(ca_list); 
13d90 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39  i++) {..    X509
13da0 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
13db0 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65  _X509_NAME_value
13dc0 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20  (ca_list, i);.. 
13dd0 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09     if (name) {..
13de0 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69  .X509_NAME_oneli
13df0 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c  ne(name, buffer,
13e00 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f   BUFSIZ);...Tcl_
13e10 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13e20 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
13e30 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
13e40 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
13e50 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  1));..    }..}. 
13e60 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
13e70 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
13e80 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c  Ptr, "caList", l
13e90 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50  istPtr);.    LAP
13ea0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
13eb0 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
13ec0 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f  Count", sk_X509_
13ed0 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
13ee0 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
13ef0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
13f00 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
13f10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
13f20 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13f70 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
13f80 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
13f90 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
13fa0 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
13fb0 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
13fc0 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
13fd0 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13fe0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
13ff0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14030 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
14040 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
14050 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
14060 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
14070 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
14080 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
14090 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
140a0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
140b0 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  Ptr;.    (void) 
140c0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
140d0 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20  (void) objc;.   
140e0 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20   (void) objv;.. 
140f0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
14100 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
14110 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
14120 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
14130 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
14140 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
14150 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
14160 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  Ptr);..    retur
14170 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
14180 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
14190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141c0 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
141d0 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
141e0 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
141f0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
14200 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
14210 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
14220 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
14230 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14240 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14270 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
14280 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
14290 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
142a0 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
142b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
142c0 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
142d0 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
142e0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
142f0 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
14300 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
14310 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
14320 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
14330 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
14340 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
14350 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b     Tcl_Size cmd;
14360 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a  .    int isStr;.
14370 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
14380 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69  16384];.    (voi
14390 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
143a0 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
143b0 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
143c0 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
143d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
143e0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
143f0 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
14400 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
14410 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
14420 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
14430 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
14440 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
14450 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
14460 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
14470 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
14480 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
14490 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
144a0 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
144b0 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
144c0 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
144d0 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
144e0 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
144f0 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
14500 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
14510 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
14520 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
14530 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
14540 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
14550 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
14560 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63  **listv;..    Tc
14570 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20  l_Size listc;.. 
14580 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20     int i;...    
14590 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
145a0 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
145b0 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
145c0 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
145d0 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
145e0 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
145f0 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
14600 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
14610 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
14620 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23  l=0,days=365;..#
14630 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
14640 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
14650 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
14660 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
14670 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
14680 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
14690 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
146a0 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
146b0 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
146c0 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
146d0 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
146e0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
146f0 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
14700 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
14710 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
14720 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14730 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
14740 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
14750 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14760 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
14770 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
14780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14790 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
147a0 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
147b0 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
147c0 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
147d0 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
147e0 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
147f0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
14800 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
14810 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
14820 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
14830 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
14840 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
14850 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
14860 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
14870 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26  terp, objv[5], &
14880 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
14890 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
148a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
148b0 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
148c0 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
148d0 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
148e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
148f0 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
14900 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
14910 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
14920 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
14930 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14940 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
14950 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
14960 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
14970 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14980 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
14990 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
149a0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
149b0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
149c0 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
149d0 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
149e0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
149f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
14a00 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
14a10 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
14a20 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
14a30 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14a40 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
14a50 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
14a60 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
14a70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
14a80 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
14a90 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
14aa0 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
14ab0 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14ac0 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14ad0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14ae0 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
14af0 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
14b00 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
14b10 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
14b20 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
14b30 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
14b40 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14b50 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14b60 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14b70 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
14b80 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
14b90 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14ba0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14bb0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14bc0 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
14bd0 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
14be0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
14bf0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
14c00 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
14c10 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
14c20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
14c30 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
14c40 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14c50 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
14c60 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
14c70 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14c80 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14c90 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
14ca0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14cb0 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
14cc0 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
14cd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14ce0 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
14cf0 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
14d00 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
14d10 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14d20 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
14d30 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
14d40 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
14d50 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
14d60 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
14d70 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
14d80 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
14d90 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
14da0 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
14db0 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
14dc0 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
14dd0 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
14de0 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
14df0 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
14e00 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
14e10 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
14e20 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
14e30 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
14e40 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
14e50 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
14e60 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
14e70 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
14e80 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
14e90 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
14ea0 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
14eb0 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
14ec0 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
14ed0 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
14ee0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
14ef0 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
14f00 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
14f10 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
14f20 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
14f30 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
14f40 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
14f50 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
14f60 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14f70 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
14f80 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
14f90 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
14fa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
14fb0 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
14fc0 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
14fd0 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
14fe0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
14ff0 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
15000 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
15010 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
15020 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
15030 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
15040 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
15050 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
15060 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
15070 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
15080 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
15090 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
150a0 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
150b0 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
150c0 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
150d0 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
150e0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
150f0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
15100 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
15110 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
15120 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
15130 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
15140 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
15150 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
15160 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
15170 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
15180 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
15190 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
151a0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
151b0 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
151c0 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
151d0 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
151e0 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
151f0 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
15200 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
15210 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
15220 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
15230 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
15240 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
15250 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
15260 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
15270 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
15280 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
15290 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
152a0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
152b0 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
152c0 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
152d0 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
152e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
152f0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ROR;...}....X509
15300 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
15310 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
15320 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
15330 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
15340 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
15350 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
15360 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
15370 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
15380 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
15390 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
153a0 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
153b0 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
153c0 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
153d0 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
153e0 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
153f0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
15400 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
15410 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
15420 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
15430 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
15440 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
15450 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
15460 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
15470 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
15480 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
15490 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
154a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
154b0 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
154c0 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
154d0 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
154e0 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
154f0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
15500 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
15510 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
15520 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
15530 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
15540 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
15550 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
15560 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
15570 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
15580 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
15590 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
155a0 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
155b0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
155c0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
155d0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
155e0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
155f0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
15600 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", 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 43 4e 2c  ed char *) k_CN,
15630 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
15640 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
15650 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
15660 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
15670 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
15680 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
15690 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
156a0 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
156b0 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
156c0 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
156d0 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
156e0 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
156f0 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
15700 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
15710 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
15720 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
15730 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
15740 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
15750 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
15760 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
15770 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
15780 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
15790 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
157a0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
157b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
157c0 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
157d0 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
157e0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
157f0 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
15800 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
15810 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
15820 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
15830 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
15840 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
15850 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
15860 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
15870 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
15880 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
15890 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
158a0 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
158b0 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
158c0 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
158d0 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
158e0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
158f0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
15900 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
15910 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
15920 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
15930 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
15940 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
15950 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
15960 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
15970 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
15980 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
15990 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
159a0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
159b0 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
159c0 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
159d0 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
159e0 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
159f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
15a00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  TCL_OK;.}.../***
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a20 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
15a30 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15a50 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
15a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
15aa0 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
15ab0 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
15ac0 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
15ad0 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
15ae0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
15af0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
15b00 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
15b10 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
15b20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
15b30 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
15b40 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
15b50 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
15b60 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
15b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
15bb0 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f  id.Tls_Free(tls_
15bc0 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b  free_type *block
15bd0 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
15be0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
15bf0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
15c00 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
15c10 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
15c20 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
15c30 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
15c40 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
15c50 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15c90 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
15ca0 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
15cb0 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
15cc0 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
15cd0 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
15ce0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
15cf0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
15d00 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
15d10 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
15d20 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
15d30 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
15d40 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
15d50 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
15d60 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
15d70 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
15d80 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
15d90 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
15da0 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
15db0 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
15dc0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15df0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e00 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
15e10 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
15e20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
15e30 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15e40 22 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  ");..    /*.    
15e50 20 2a 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e   * we're assumin
15e60 67 20 68 65 72 65 20 74 68 61 74 20 77 65 27 72  g here that we'r
15e70 65 20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65  e single-threade
15e80 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d.     */.    if
15e90 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65   (statePtr->time
15ea0 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54  r != (Tcl_TimerT
15eb0 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54  oken) NULL) {..T
15ec0 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61  cl_DeleteTimerHa
15ed0 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e  ndler(statePtr->
15ee0 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74  timer);..statePt
15ef0 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b  r->timer = NULL;
15f00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
15f10 65 6d 6f 76 65 20 63 61 6c 6c 62 61 63 6b 73 20  emove callbacks 
15f20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
15f30 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b  Ptr->callback) {
15f40 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
15f50 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  nt(statePtr->cal
15f60 6c 62 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74  lback);..statePt
15f70 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55  r->callback = NU
15f80 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
15f90 20 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73   (statePtr->pass
15fa0 77 6f 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63  word) {..Tcl_Dec
15fb0 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
15fc0 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09  tr->password);..
15fd0 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
15fe0 72 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  rd = NULL;.    }
15ff0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
16000 72 2d 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f  r->vcmd) {..Tcl_
16010 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61  DecrRefCount(sta
16020 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73  tePtr->vcmd);..s
16030 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20  tatePtr->vcmd = 
16040 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
16050 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70   if (statePtr->p
16060 72 6f 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65  rotos) {..ckfree
16070 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
16080 73 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  s);..statePtr->p
16090 72 6f 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rotos = NULL;.  
160a0 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
160b0 74 65 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f  tePtr->bio) {../
160c0 2a 20 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c  * This will call
160d0 20 53 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42   SSL_shutdown. B
160e0 75 67 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64  ug 1414045 */..d
160f0 70 72 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65  printf("BIO_free
16100 5f 61 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65  _all(%p)", state
16110 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f  Ptr->bio);..BIO_
16120 66 72 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74  free_all(statePt
16130 72 2d 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50  r->bio);..stateP
16140 74 72 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a  tr->bio = NULL;.
16150 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73      }..    if (s
16160 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a  tatePtr->ssl) {.
16170 09 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72  .dprintf("SSL_fr
16180 65 65 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ee(%p)", statePt
16190 72 2d 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72  r->ssl);..SSL_fr
161a0 65 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ee(statePtr->ssl
161b0 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73  );..statePtr->ss
161c0 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  l = NULL;.    }.
161d0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
161e0 72 2d 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43  r->ctx) {..SSL_C
161f0 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  TX_free(statePtr
16200 2d 3e 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74  ->ctx);..statePt
16210 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ctx = NULL;. 
16220 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
16230 66 28 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a  f("Returning");.
16240 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
16250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16290 20 2a 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f   *. * Build Info
162a0 20 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20   Command --. *. 
162b0 2a 09 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  *.Create command
162c0 20 74 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64   to return build
162d0 20 69 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67   info for packag
162e0 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  e.. *. * Results
162f0 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
16300 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a  Tcl result. *. *
16310 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
16320 2a 09 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d  *.Created build-
16330 69 6e 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a  info command.. *
16340 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23  ---------. */..#
16390 69 66 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59  ifndef STRINGIFY
163a0 0a 23 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e  .#  define STRIN
163b0 47 49 46 59 28 78 29 20 53 54 52 49 4e 47 49 46  GIFY(x) STRINGIF
163c0 59 31 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20  Y1(x).#  define 
163d0 53 54 52 49 4e 47 49 46 59 31 28 78 29 20 23 78  STRINGIFY1(x) #x
163e0 0a 23 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69  .#endif..int.Bui
163f0 6c 64 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63  ldInfoCommand(Tc
16400 6c 5f 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70  l_Interp* interp
16410 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49  ) {.    Tcl_CmdI
16420 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69  nfo info;..    i
16430 66 20 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  f (Tcl_GetComman
16440 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a  dInfo(interp, ":
16450 3a 74 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f  :tcl::build-info
16460 22 2c 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63  ", &info)) {..Tc
16470 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
16480 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
16490 73 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20  s::build-info", 
164a0 69 6e 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76  info.objProc, (v
164b0 6f 69 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47  oid *)(...PACKAG
164c0 45 5f 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54  E_VERSION "+" ST
164d0 52 49 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53  RINGIFY(TLS_VERS
164e0 49 4f 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65  ION_UUID).#if de
164f0 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29  fined(__clang__)
16500 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c   && defined(__cl
16510 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09  ang_major__)....
16520 20 20 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54      ".clang-" ST
16530 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f  RINGIFY(__clang_
16540 6d 61 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63  major__).#if __c
16550 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31  lang_minor__ < 1
16560 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e  0....    "0".#en
16570 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e  dif....    STRIN
16580 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e  GIFY(__clang_min
16590 6f 72 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66  or__).#endif.#if
165a0 20 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73   defined(__cplus
165b0 70 6c 75 73 29 20 26 26 20 21 64 65 66 69 6e 65  plus) && !define
165c0 64 28 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20  d(__OBJC__).... 
165d0 20 20 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a     ".cplusplus".
165e0 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e  #endif.#ifndef N
165f0 44 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64  DEBUG....    ".d
16600 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66  ebug".#endif.#if
16610 20 21 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e   !defined(__clan
16620 67 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64  g__) && !defined
16630 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45  (__INTEL_COMPILE
16640 52 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  R) && defined(__
16650 47 4e 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22  GNUC__)....    "
16660 2e 67 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59  .gcc-" STRINGIFY
16670 28 5f 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f  (__GNUC__).#if _
16680 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20  _GNUC_MINOR__ < 
16690 31 30 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65  10....    "0".#e
166a0 6e 64 69 66 0a 09 09 09 20 20 20 20 53 54 52 49  ndif....    STRI
166b0 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e  NGIFY(__GNUC_MIN
166c0 4f 52 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66  OR__).#endif.#if
166d0 64 65 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50  def __INTEL_COMP
166e0 49 4c 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63  ILER....    ".ic
166f0 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f  c-" STRINGIFY(__
16700 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a  INTEL_COMPILER).
16710 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43  #endif.#ifdef TC
16720 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20  L_MEM_DEBUG.... 
16730 20 20 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23     ".memdebug".#
16740 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
16750 64 28 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20  d(_MSC_VER).... 
16760 20 20 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49     ".msvc-" STRI
16770 4e 47 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a  NGIFY(_MSC_VER).
16780 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53  #endif.#ifdef US
16790 45 5f 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22  E_NMAKE....    "
167a0 2e 6e 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23  .nmake".#endif.#
167b0 69 66 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f  ifndef TCL_CFG_O
167c0 50 54 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20  PTIMIZED....    
167d0 22 2e 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23  ".no-optimize".#
167e0 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f  endif.#ifdef __O
167f0 42 4a 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f  BJC__....    ".o
16800 62 6a 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20  bjective-c".#if 
16810 64 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70  defined(__cplusp
16820 6c 75 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75  lus)....    "plu
16830 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65  splus".#endif.#e
16840 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f  ndif.#ifdef TCL_
16850 43 46 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09  CFG_PROFILED....
16860 20 20 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23      ".profile".#
16870 65 6e 64 69 66 0a 23 69 66 64 65 66 20 50 55 52  endif.#ifdef PUR
16880 49 46 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72  IFY....    ".pur
16890 69 66 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  ify".#endif.#ifd
168a0 65 66 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a  ef STATIC_BUILD.
168b0 09 09 09 20 20 20 20 22 2e 73 74 61 74 69 63 22  ...    ".static"
168c0 0a 23 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c  .#endif...), NUL
168d0 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  L);.    }.    re
168e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
168f0 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a  ------------*. *
16930 0a 20 2a 20 54 6c 73 4c 69 62 53 68 75 74 64 6f  . * TlsLibShutdo
16940 77 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75 74  wn --. *. *.Shut
16950 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 79  down SSL library
16960 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63   once per applic
16970 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75  ation. *. * Resu
16980 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
16990 72 64 20 54 43 4c 20 72 65 73 75 6c 74 0a 20 2a  rd TCL result. *
169a0 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
169b0 3a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53  :. *.Shutdown SS
169c0 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d  L library. *. *-
169d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169e0 2d 2d 2d 2d 2d 2d 2d 2d 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 2a 0a 20 2a 2f 0a 76 6f 69 64 20  -----*. */.void 
16a10 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 43  TlsLibShutdown(C
16a20 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
16a30 44 61 74 61 29 20 7b 0a 20 20 20 20 64 70 72 69  Data) {.    dpri
16a40 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
16a50 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28      BIO_cleanup(
16a60 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
16a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16aa0 2d 2a 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49  -*. *. *.TlsLibI
16ab0 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69  nit --. *. *.Ini
16ac0 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62  tializes SSL lib
16ad0 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70  rary once per ap
16ae0 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  plication. *. * 
16af0 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74  Results:. *.A st
16b00 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c  andard Tcl resul
16b10 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  t. *. * Side eff
16b20 65 63 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c  ects:. *.Initial
16b30 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79  izes SSL library
16b40 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
16b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
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 2a 0a 20 2a  ------------*. *
16b80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73  /.static int Tls
16b90 4c 69 62 49 6e 69 74 28 29 20 7b 0a 20 20 20 20  LibInit() {.    
16ba0 73 74 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69  static int initi
16bb0 61 6c 69 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20  alized = 0;..   
16bc0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
16bd0 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 6e  ");..    if (!in
16be0 69 74 69 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a  itialized) {../*
16bf0 20 49 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48   Initialize BOTH
16c00 20 6c 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c   libcrypto and l
16c10 69 62 73 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21  ibssl. */..if (!
16c20 4f 50 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c  OPENSSL_init_ssl
16c30 28 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f  (OPENSSL_INIT_LO
16c40 41 44 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c  AD_SSL_STRINGS |
16c50 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f   OPENSSL_INIT_LO
16c60 41 44 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47  AD_CRYPTO_STRING
16c70 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c  S..    | OPENSSL
16c80 5f 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49  _INIT_ADD_ALL_CI
16c90 50 48 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f  PHERS | OPENSSL_
16ca0 49 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47  INIT_ADD_ALL_DIG
16cb0 45 53 54 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e  ESTS..    | OPEN
16cc0 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f  SSL_INIT_LOAD_CO
16cd0 4e 46 49 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  NFIG | OPENSSL_I
16ce0 4e 49 54 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29  NIT_ASYNC, NULL)
16cf0 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
16d00 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
16d10 2f 2a 20 43 72 65 61 74 65 20 42 49 4f 20 68 61  /* Create BIO ha
16d20 6e 64 6c 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e  ndlers */..BIO_n
16d30 65 77 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b  ew_tcl(NULL, 0);
16d40 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20 65 78 69  .../* Create exi
16d50 74 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 63  t handler */..Tc
16d60 6c 5f 43 72 65 61 74 65 45 78 69 74 48 61 6e 64  l_CreateExitHand
16d70 6c 65 72 28 54 6c 73 4c 69 62 53 68 75 74 64 6f  ler(TlsLibShutdo
16d80 77 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74  wn, NULL);..init
16d90 69 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20  ialized = 1;.   
16da0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
16db0 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69  L_OK;.}.../* Ini
16dc0 74 20 73 63 72 69 70 74 20 2a 2f 0a 73 74 61 74  t script */.stat
16dd0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c  ic const char tl
16de0 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d  sTclInitScript[]
16df0 20 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74   = {.#include "t
16e00 6c 73 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a  ls.tcl.h".};../*
16e10 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
16e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e50 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73  ------. *. * Tls
16e60 5f 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54  _Init --. *. *.T
16e70 68 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65  his is a package
16e80 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
16e90 70 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68  procedure, which
16ea0 20 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79   is called. *.by
16eb0 20 54 43 4c 20 77 68 65 6e 20 74 68 69 73 20 70   TCL when this p
16ec0 61 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20  ackage is to be 
16ed0 61 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  added to an inte
16ee0 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52  rpreter.. *. * R
16ef0 65 73 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 69  esults:. *.Initi
16f00 61 6c 69 7a 65 73 20 73 74 72 75 63 74 75 72 65  alizes structure
16f10 73 20 61 6e 64 20 63 72 65 61 74 65 73 20 63 6f  s and creates co
16f20 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 69  mmands.. *. * Si
16f30 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20  de effects:. *. 
16f40 43 72 65 61 74 65 20 74 68 65 20 63 6f 6d 6d 61  Create the comma
16f50 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  nds. *. *-------
16f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
16fa0 0a 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f  ..#if TCL_MAJOR_
16fb0 56 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66  VERSION > 8.#def
16fc0 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20  ine MIN_VERSION 
16fd0 22 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66  "9.0".#else.#def
16fe0 69 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20  ine MIN_VERSION 
16ff0 22 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c  "8.5".#endif..DL
17000 4c 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f  LEXPORT int Tls_
17010 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
17020 2a 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20  *interp) {..    
17030 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
17040 29 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54  );..#ifdef USE_T
17050 43 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20  CL_STUBS.    if 
17060 28 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69  (Tcl_InitStubs(i
17070 6e 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49  nterp, MIN_VERSI
17080 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20  ON, 0) == NULL) 
17090 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
170a0 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  ROR;.    }.#endi
170b0 66 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b  f.    if (Tcl_Pk
170c0 67 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c  gRequire(interp,
170d0 20 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53   "Tcl", MIN_VERS
170e0 49 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29  ION, 0) == NULL)
170f0 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
17100 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
17110 20 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28   if (TlsLibInit(
17120 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
17130 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17140 28 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20  (interp, "could 
17150 6e 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53  not initialize S
17160 53 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68  SL library", (ch
17170 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
17180 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17190 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43      }..    Tcl_C
171a0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
171b0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
171c0 63 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72  ciphers", Cipher
171d0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
171e0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
171f0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
17200 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
17210 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17220 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
17230 3a 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43  ::connection", C
17240 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a  onnectionInfoObj
17250 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
17260 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
17270 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
17280 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65  LL);.    Tcl_Cre
17290 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
172a0 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61  terp, "::tls::ha
172b0 6e 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68  ndshake", Handsh
172c0 61 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  akeObjCmd, (Clie
172d0 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
172e0 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
172f0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
17300 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17310 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
17320 6c 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70  ls::import", Imp
17330 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ortObjCmd, (Clie
17340 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
17350 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
17360 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
17370 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17380 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
17390 6c 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55  ls::unimport", U
173a0 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28  nimportObjCmd, (
173b0 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
173c0 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
173d0 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
173e0 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
173f0 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17400 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22  "::tls::unstack"
17410 2c 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64  , UnimportObjCmd
17420 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
17430 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
17440 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
17450 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
17460 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
17470 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75  p, "::tls::statu
17480 73 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64  s", StatusObjCmd
17490 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
174a0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
174b0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
174c0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
174d0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
174e0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69  p, "::tls::versi
174f0 6f 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43  on", VersionObjC
17500 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
17510 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
17520 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
17530 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
17540 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
17550 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73  erp, "::tls::mis
17560 63 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20  c", MiscObjCmd, 
17570 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
17580 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
17590 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
175a0 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
175b0 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
175c0 20 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f   "::tls::protoco
175d0 6c 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62  ls", ProtocolsOb
175e0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
175f0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
17600 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
17610 55 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64  ULL);..    Build
17620 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  InfoCommand(inte
17630 72 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e  rp);..    if (in
17640 74 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c  terp && Tcl_Eval
17650 28 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49  (interp, tlsTclI
17660 6e 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43  nitScript) != TC
17670 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
17680 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
17690 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  ..    return Tcl
176a0 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
176b0 72 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45  rp, PACKAGE_NAME
176c0 2c 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f  , PACKAGE_VERSIO
176d0 4e 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  N);.}../*. *----
176e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
176f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
17720 20 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e   *. *.Tls_SafeIn
17730 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  it --. *. *.This
17740 20 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e   is a package in
17750 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f  itialization pro
17760 63 65 64 75 72 65 20 66 6f 72 20 73 61 66 65 20  cedure for safe 
17770 69 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 52  interps.. *. * R
17780 65 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 20  esults:. *.Same 
17790 61 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27  as of 'Tls_Init'
177a0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
177b0 63 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20  cts:. *.Same as 
177c0 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a  of 'Tls_Init'. *
177d0 0a 20 2a 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 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58  ------. */.DLLEX
17820 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66  PORT int Tls_Saf
17830 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  eInit(Tcl_Interp
17840 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20   *interp) {.    
17850 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
17860 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c  );.    return Tl
17870 73 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  s_Init(interp);.
17880 7d 0a                                            }.