Hex Artifact Content

Artifact 6e62c9c8659d3faae84043b101089db7718b8e1987eb6538a07de628b3f8f7bc:


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 0a 2f 2a  rn TCL_OK;.}../*
9200: 0a 20 2a 2d 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 0a 20 2a 0a 20 2a 20 49 6d 70  ------. *. * Imp
9250: 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a  ortObjCmd --. *.
9260: 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
9270: 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  e is invoked to 
9280: 70 72 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c  process the "ssl
9290: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09  " command. *. *.
92a0: 54 68 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20  The ssl command 
92b0: 70 75 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20  pushes SSL over 
92c0: 61 20 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74  a (newly connect
92d0: 65 64 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20  ed) tcp socket. 
92e0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
92f0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
9300: 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
9310: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
9320: 61 79 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65  ay modify the be
9330: 68 61 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20  havior of an IO 
9340: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
93a0: 0a 49 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  .ImportObjCmd(Cl
93b0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
93c0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
93d0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
93e0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
93f0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
9400: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
9410: 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
9420: 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
9430: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65  on. */.    State
9440: 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
9450: 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
9460: 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
9470: 20 20 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09     SSL_CTX *ctx.
9480: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c  .= NULL;.    Tcl
9490: 5f 4f 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20  _Obj *script..= 
94a0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  NULL;.    Tcl_Ob
94b0: 6a 20 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e  j *password..= N
94c0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  ULL;.    Tcl_Obj
94d0: 20 2a 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a   *vcmd..= NULL;.
94e0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
94f0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
9500: 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68  slation, upperCh
9510: 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75  annelBlocking, u
9520: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
9530: 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65  ing, upperChanne
9540: 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e  lEOFChar;.    in
9550: 74 20 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53  t idx;.    Tcl_S
9560: 69 7a 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  ize len;.    int
9570: 20 66 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54   flags...= TLS_T
9580: 43 4c 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74  CL_INIT;.    int
9590: 20 73 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f   server...= 0;./
95a0: 2a 20 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * is connection 
95b0: 69 6e 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67  incoming or outg
95c0: 6f 69 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61  oing? */.    cha
95d0: 72 20 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55  r *keyfile..= NU
95e0: 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65  LL;.    char *ce
95f0: 72 74 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a  rtfile..= NULL;.
9600: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
9610: 72 20 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a  r *key..= NULL;.
9620: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79      Tcl_Size key
9630: 5f 6c 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75  _len..= 0;.    u
9640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65  nsigned char *ce
9650: 72 74 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  rt..= NULL;.    
9660: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
9670: 6e 09 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  n..= 0;.    char
9680: 20 2a 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c   *ciphers..= NUL
9690: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70  L;.    char *cip
96a0: 68 65 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c  hersuites..= NUL
96b0: 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66  L;.    char *CAf
96c0: 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ile..= NULL;.   
96d0: 20 63 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d   char *CApath..=
96e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
96f0: 2a 43 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c  *CAstore..= NULL
9700: 3b 0a 20 20 20 20 63 68 61 72 20 2a 44 48 70 61  ;.    char *DHpa
9710: 72 61 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  rams..= NULL;.  
9720: 20 20 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09    char *model...
9730: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9740: 20 2a 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20   *servername..= 
9750: 4e 55 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d  NULL;./* hostnam
9760: 65 20 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d  e for Server Nam
9770: 65 20 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a  e Indication */.
9780: 20 20 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f      char *sessio
9790: 6e 5f 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  n_id..= NULL;.  
97a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09    Tcl_Obj *alpn.
97b0: 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74  .= NULL;.    int
97c0: 20 73 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20   ssl2 = 0, ssl3 
97d0: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73  = 0;.    int tls
97e0: 31 20 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20  1 = 1, tls1_1 = 
97f0: 31 2c 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74  1, tls1_2 = 1, t
9800: 6c 73 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69  ls1_3 = 1;.    i
9810: 6e 74 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65  nt proto = 0, le
9820: 76 65 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e  vel = -1;.    in
9830: 74 20 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65  t verify = 0, re
9840: 71 75 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65  quire = 0, reque
9850: 73 74 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e  st = 1, post_han
9860: 64 73 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20  dshake = 0;.    
9870: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
9880: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
9890: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20  "Called");..#if 
98a0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29  defined(NO_TLS1)
98b0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
98c0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20  SSL_NO_TLS1).   
98d0: 20 74 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69   tls1 = 0;.#endi
98e0: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f  f.#if defined(NO
98f0: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
9900: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
9910: 4c 53 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f  LS1_1).    tls1_
9920: 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  1 = 0;.#endif.#i
9930: 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53  f defined(NO_TLS
9940: 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  1_2) || defined(
9950: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
9960: 32 29 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20  2).    tls1_2 = 
9970: 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  0;.#endif.#if de
9980: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
9990: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
99a0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
99b0: 20 20 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23     tls1_3 = 0;.#
99c0: 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f  endif..    if (o
99d0: 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f  bjc < 2) {..Tcl_
99e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
99f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
9a00: 68 61 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f  hannel ?options?
9a10: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  ");..return TCL_
9a20: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
9a30: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
9a40: 72 28 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d  r();..    chan =
9a50: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
9a60: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
9a70: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
9a80: 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63  NULL);.    if (c
9a90: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
9aa0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  nel) NULL) {..re
9ab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9ac0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
9ad0: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61  ke sure to opera
9ae0: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73  te on the topmos
9af0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20  t channel */.   
9b00: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54   chan = Tcl_GetT
9b10: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b  opChannel(chan);
9b20: 0a 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d  ..    for (idx =
9b30: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20   2; idx < objc; 
9b40: 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a  idx++) {..char *
9b50: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  opt = Tcl_GetStr
9b60: 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a  ing(objv[idx]);.
9b70: 0a 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20  ..if (opt[0] != 
9b80: 27 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b  '-')..    break;
9b90: 0a 0a 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e  ...OPTOBJ("-alpn
9ba0: 22 2c 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54  ", alpn);..OPTST
9bb0: 52 28 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61  R("-cadir", CApa
9bc0: 74 68 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63  th);..OPTSTR("-c
9bd0: 61 66 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b  afile", CAfile);
9be0: 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 73 74 6f  ..OPTSTR("-casto
9bf0: 72 65 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09  re", CAstore);..
9c00: 4f 50 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c  OPTBYTE("-cert",
9c10: 20 63 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29   cert, cert_len)
9c20: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74  ;..OPTSTR("-cert
9c30: 66 69 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29  file", certfile)
9c40: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68  ;..OPTSTR("-ciph
9c50: 65 72 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09  er", ciphers);..
9c60: 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72 73  OPTSTR("-ciphers
9c70: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9c80: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 75 69  TSTR("-ciphersui
9c90: 74 65 73 22 2c 20 63 69 70 68 65 72 73 75 69 74  tes", ciphersuit
9ca0: 65 73 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63  es);..OPTOBJ("-c
9cb0: 6f 6d 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29  ommand", script)
9cc0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61  ;..OPTSTR("-dhpa
9cd0: 72 61 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29  rams", DHparams)
9ce0: 3b 0a 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79  ;..OPTBYTE("-key
9cf0: 22 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  ", key, key_len)
9d00: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66  ;..OPTSTR("-keyf
9d10: 69 6c 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a  ile", keyfile);.
9d20: 09 4f 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22  .OPTSTR("-model"
9d30: 2c 20 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42  , model);..OPTOB
9d40: 4a 28 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70  J("-password", p
9d50: 61 73 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f  assword);..OPTBO
9d60: 4f 4c 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68  OL("-post_handsh
9d70: 61 6b 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73  ake", post_hands
9d80: 68 61 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  hake);..OPTBOOL(
9d90: 22 2d 72 65 71 75 65 73 74 22 2c 20 72 65 71 75  "-request", requ
9da0: 65 73 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  est);..OPTBOOL("
9db0: 2d 72 65 71 75 69 72 65 22 2c 20 72 65 71 75 69  -require", requi
9dc0: 72 65 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73  re);..OPTINT("-s
9dd0: 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20  ecurity_level", 
9de0: 6c 65 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c  level);..OPTBOOL
9df0: 28 22 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76  ("-server", serv
9e00: 65 72 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73  er);..OPTSTR("-s
9e10: 65 72 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76  ervername", serv
9e20: 65 72 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52  ername);..OPTSTR
9e30: 28 22 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20  ("-session_id", 
9e40: 73 65 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50  session_id);..OP
9e50: 54 42 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73  TBOOL("-ssl2", s
9e60: 73 6c 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  sl2);..OPTBOOL("
9e70: 2d 73 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09  -ssl3", ssl3);..
9e80: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c  OPTBOOL("-tls1",
9e90: 20 74 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c   tls1);..OPTBOOL
9ea0: 28 22 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31  ("-tls1.1", tls1
9eb0: 5f 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  _1);..OPTBOOL("-
9ec0: 74 6c 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29  tls1.2", tls1_2)
9ed0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9ee0: 31 2e 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09  1.3", tls1_3);..
9ef0: 4f 50 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74  OPTOBJ("-validat
9f00: 65 63 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29  ecommand", vcmd)
9f10: 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64  ;..OPTOBJ("-vcmd
9f20: 22 2c 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42  ", vcmd);...OPTB
9f30: 41 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61  AD("option", "-a
9f40: 6c 70 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61  lpn, -cadir, -ca
9f50: 66 69 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20  file, -castore, 
9f60: 2d 63 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65  -cert, -certfile
9f70: 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68  , -cipher, -ciph
9f80: 65 72 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61  ersuites, -comma
9f90: 6e 64 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d  nd, -dhparams, -
9fa0: 6b 65 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d  key, -keyfile, -
9fb0: 6d 6f 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64  model, -password
9fc0: 2c 20 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  , -post_handshak
9fd0: 65 2c 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65  e, -request, -re
9fe0: 71 75 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79  quire, -security
9ff0: 5f 6c 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c  _level, -server,
a000: 20 2d 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73   -servername, -s
a010: 65 73 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32  ession_id, -ssl2
a020: 2c 20 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20  , -ssl3, -tls1, 
a030: 2d 74 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32  -tls1.1, -tls1.2
a040: 2c 20 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76  , -tls1.3, or -v
a050: 61 6c 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29  alidatecommand")
a060: 3b 0a 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;...return TCL_E
a070: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a080: 69 66 20 28 72 65 71 75 65 73 74 29 09 09 76 65  if (request)..ve
a090: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
a0a0: 46 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c  FY_CLIENT_ONCE |
a0b0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
a0c0: 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65 73  ;.    if (reques
a0d0: 74 20 26 26 20 72 65 71 75 69 72 65 29 09 76 65  t && require).ve
a0e0: 72 69 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49  rify |= SSL_VERI
a0f0: 46 59 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45  FY_FAIL_IF_NO_PE
a100: 45 52 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20  ER_CERT;.    if 
a110: 28 72 65 71 75 65 73 74 20 26 26 20 70 6f 73 74  (request && post
a120: 5f 68 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69  _handshake).veri
a130: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
a140: 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b  _POST_HANDSHAKE;
a150: 0a 20 20 20 20 69 66 20 28 76 65 72 69 66 79 20  .    if (verify 
a160: 3d 3d 20 30 29 09 09 76 65 72 69 66 79 20 3d 20  == 0)..verify = 
a170: 53 53 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b  SSL_VERIFY_NONE;
a180: 0a 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28  ..    proto |= (
a190: 73 73 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  ssl2 ? TLS_PROTO
a1a0: 5f 53 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20  _SSL2 : 0);.    
a1b0: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f  proto |= (ssl3 ?
a1c0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20   TLS_PROTO_SSL3 
a1d0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a1e0: 7c 3d 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50  |= (tls1 ? TLS_P
a1f0: 52 4f 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a  ROTO_TLS1 : 0);.
a200: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a210: 73 31 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f  s1_1 ? TLS_PROTO
a220: 5f 54 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20  _TLS1_1 : 0);.  
a230: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a240: 5f 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _2 ? TLS_PROTO_T
a250: 4c 53 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_2 : 0);.    
a260: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33  proto |= (tls1_3
a270: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
a280: 31 5f 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f  1_3 : 0);..    /
a290: 2a 20 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20  * reset to NULL 
a2a0: 69 66 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20  if blank string 
a2b0: 70 72 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20  provided */.    
a2c0: 69 66 20 28 63 65 72 74 20 26 26 20 21 2a 63 65  if (cert && !*ce
a2d0: 72 74 29 09 09 20 20 20 20 20 20 20 20 63 65 72  rt)..        cer
a2e0: 74 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c  t.        = NULL
a2f0: 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 26 26  ;.    if (key &&
a300: 20 21 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20   !*key)..       
a310: 20 6b 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e   key.        = N
a320: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72  ULL;.    if (cer
a330: 74 66 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66  tfile && !*certf
a340: 69 6c 65 29 20 20 20 20 20 20 20 20 20 63 65 72  ile)         cer
a350: 74 66 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20  tfile.= NULL;.  
a360: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26    if (keyfile &&
a370: 20 21 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79   !*keyfile)..key
a380: 66 69 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e  file.        = N
a390: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70  ULL;.    if (cip
a3a0: 68 65 72 73 20 26 26 20 21 2a 63 69 70 68 65 72  hers && !*cipher
a3b0: 73 29 09 20 20 20 20 20 20 20 20 63 69 70 68 65  s).        ciphe
a3c0: 72 73 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  rs.        = NUL
a3d0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
a3e0: 72 73 75 69 74 65 73 20 26 26 20 21 2a 63 69 70  rsuites && !*cip
a3f0: 68 65 72 73 75 69 74 65 73 29 20 63 69 70 68 65  hersuites) ciphe
a400: 72 73 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c  rsuites    = NUL
a410: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c  L;.    if (CAfil
a420: 65 20 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20  e && !*CAfile). 
a430: 20 20 20 20 20 20 20 43 41 66 69 6c 65 09 20 20         CAfile.  
a440: 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20        = NULL;.  
a450: 20 20 69 66 20 28 43 41 70 61 74 68 20 26 26 20    if (CApath && 
a460: 21 2a 43 41 70 61 74 68 29 09 20 20 20 20 20 20  !*CApath).      
a470: 20 20 43 41 70 61 74 68 09 20 20 20 20 20 20 20    CApath.       
a480: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20   = NULL;.    if 
a490: 28 43 41 73 74 6f 72 65 20 26 26 20 21 2a 43 41  (CAstore && !*CA
a4a0: 73 74 6f 72 65 29 09 20 20 20 20 20 20 20 20 43  store).        C
a4b0: 41 73 74 6f 72 65 09 20 20 20 20 20 20 20 20 3d  Astore.        =
a4c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44   NULL;.    if (D
a4d0: 48 70 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70  Hparams && !*DHp
a4e0: 61 72 61 6d 73 29 09 20 20 20 20 20 20 20 20 44  arams).        D
a4f0: 48 70 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d  Hparams        =
a500: 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e   NULL;..    /* n
a510: 65 77 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a  ew SSL state */.
a520: 20 20 20 20 73 74 61 74 65 50 74 72 09 09 3d 20      statePtr..= 
a530: 28 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f  (State *) ckallo
a540: 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a  c((unsigned) siz
a550: 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20  eof(State));.   
a560: 20 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72   memset(statePtr
a570: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74  , 0, sizeof(Stat
a580: 65 29 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50  e));..    stateP
a590: 74 72 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67  tr->flags.= flag
a5a0: 73 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  s;.    statePtr-
a5b0: 3e 69 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70  >interp.= interp
a5c0: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  ;.    statePtr->
a5d0: 76 66 6c 61 67 73 09 3d 20 76 65 72 69 66 79 3b  vflags.= verify;
a5e0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 65  .    statePtr->e
a5f0: 72 72 09 3d 20 22 22 3b 0a 0a 20 20 20 20 2f 2a  rr.= "";..    /*
a600: 20 61 6c 6c 6f 63 61 74 65 20 73 63 72 69 70 74   allocate script
a610: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 63 72 69   */.    if (scri
a620: 70 74 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  pt) {..(void) Tc
a630: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a640: 62 6a 28 73 63 72 69 70 74 2c 20 26 6c 65 6e 29  bj(script, &len)
a650: 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20  ;..if (len) {.. 
a660: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63 61 6c     statePtr->cal
a670: 6c 62 61 63 6b 20 3d 20 73 63 72 69 70 74 3b 0a  lback = script;.
a680: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
a690: 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
a6a0: 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 7d 0a 20 20  callback);..}.  
a6b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f    }..    /* allo
a6c0: 63 61 74 65 20 70 61 73 73 77 6f 72 64 20 2a 2f  cate password */
a6d0: 0a 20 20 20 20 69 66 20 28 70 61 73 73 77 6f 72  .    if (passwor
a6e0: 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c  d) {..(void) Tcl
a6f0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
a700: 6a 28 70 61 73 73 77 6f 72 64 2c 20 26 6c 65 6e  j(password, &len
a710: 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09  );..if (len) {..
a720: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 70 61      statePtr->pa
a730: 73 73 77 6f 72 64 20 3d 20 70 61 73 73 77 6f 72  ssword = passwor
a740: 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  d;..    Tcl_Incr
a750: 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74  RefCount(statePt
a760: 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 7d  r->password);..}
a770: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 61  .    }..    /* a
a780: 6c 6c 6f 63 61 74 65 20 76 61 6c 69 64 61 74 65  llocate validate
a790: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
a7a0: 69 66 20 28 76 63 6d 64 29 20 7b 0a 09 28 76 6f  if (vcmd) {..(vo
a7b0: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a7c0: 67 46 72 6f 6d 4f 62 6a 28 76 63 6d 64 2c 20 26  gFromObj(vcmd, &
a7d0: 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 29 20  len);..if (len) 
a7e0: 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74 72 2d  {..    statePtr-
a7f0: 3e 76 63 6d 64 20 3d 20 76 63 6d 64 3b 0a 09 20  >vcmd = vcmd;.. 
a800: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
a810: 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63  unt(statePtr->vc
a820: 6d 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  md);..}.    }.. 
a830: 20 20 20 69 66 20 28 6d 6f 64 65 6c 20 21 3d 20     if (model != 
a840: 4e 55 4c 4c 29 20 7b 0a 09 69 6e 74 20 6d 6f 64  NULL) {..int mod
a850: 65 3b 0a 09 2f 2a 20 47 65 74 20 74 68 65 20 22  e;../* Get the "
a860: 6d 6f 64 65 6c 22 20 63 6f 6e 74 65 78 74 20 2a  model" context *
a870: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a880: 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  tChannel(interp,
a890: 20 6d 6f 64 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a   model, &mode);.
a8a0: 09 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63  .if (chan == (Tc
a8b0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29  l_Channel) NULL)
a8c0: 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65   {..    Tls_Free
a8d0: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
a8e0: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
a8f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
a900: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a  ROR;..}.../*.. *
a910: 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70   Make sure to op
a920: 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70  erate on the top
a930: 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 0a 09 20 2a  most channel.. *
a940: 2f 0a 09 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65  /..chan = Tcl_Ge
a950: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
a960: 29 3b 0a 09 69 66 20 28 54 63 6c 5f 47 65 74 43  );..if (Tcl_GetC
a970: 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29  hannelType(chan)
a980: 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54   != Tls_ChannelT
a990: 79 70 65 28 29 29 20 7b 0a 09 20 20 20 20 54 63  ype()) {..    Tc
a9a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a9b0: 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e  nterp, "bad chan
a9c0: 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74  nel \"", Tcl_Get
a9d0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e  ChannelName(chan
a9e0: 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61 20  ),..."\": not a 
a9f0: 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  TLS channel", (c
aa00: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20  har *) NULL);.. 
aa10: 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43     Tcl_SetErrorC
aa20: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53  ode(interp, "TLS
aa30: 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22 43 48  ", "IMPORT", "CH
aa40: 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44  ANNEL", "INVALID
aa50: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
aa60: 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72 65 65  );..    Tls_Free
aa70: 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20  ((tls_free_type 
aa80: 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 20  *) statePtr);.. 
aa90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
aaa0: 52 4f 52 3b 0a 09 7d 0a 09 63 74 78 20 3d 20 28  ROR;..}..ctx = (
aab0: 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74  (State *)Tcl_Get
aac0: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44  ChannelInstanceD
aad0: 61 74 61 28 63 68 61 6e 29 29 2d 3e 63 74 78 3b  ata(chan))->ctx;
aae0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69  .    } else {..i
aaf0: 66 20 28 28 63 74 78 20 3d 20 43 54 58 5f 49 6e  f ((ctx = CTX_In
ab00: 69 74 28 73 74 61 74 65 50 74 72 2c 20 73 65 72  it(statePtr, ser
ab10: 76 65 72 2c 20 70 72 6f 74 6f 2c 20 6b 65 79 66  ver, proto, keyf
ab20: 69 6c 65 2c 20 63 65 72 74 66 69 6c 65 2c 20 6b  ile, certfile, k
ab30: 65 79 2c 20 63 65 72 74 2c 20 6b 65 79 5f 6c 65  ey, cert, key_le
ab40: 6e 2c 0a 09 20 20 20 20 63 65 72 74 5f 6c 65 6e  n,..    cert_len
ab50: 2c 20 43 41 70 61 74 68 2c 20 43 41 73 74 6f 72  , CApath, CAstor
ab60: 65 2c 20 43 41 66 69 6c 65 2c 20 63 69 70 68 65  e, CAfile, ciphe
ab70: 72 73 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  rs, ciphersuites
ab80: 2c 20 6c 65 76 65 6c 2c 20 44 48 70 61 72 61 6d  , level, DHparam
ab90: 73 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  s)) == NULL) {..
aba0: 20 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c      Tls_Free((tl
abb0: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
abc0: 74 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72  tatePtr);..    r
abd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
abe0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  ..}.    }..    s
abf0: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 63  tatePtr->ctx = c
ac00: 74 78 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73  tx;..    /* Pres
ac10: 65 72 76 65 20 63 68 61 6e 6e 65 6c 20 63 6f 6e  erve channel con
ac20: 66 69 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  fig */.    Tcl_D
ac30: 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65  StringInit(&uppe
ac40: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
ac50: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
ac60: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
ac70: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
ac80: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
ac90: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
aca0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
acb0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
acc0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
acd0: 63 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c  coding);.    Tcl
ace0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
acf0: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ad00: 22 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70  "-eofchar", &upp
ad10: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ad20: 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68  );.    Tcl_GetCh
ad30: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ad40: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6e 63 6f  rp, chan, "-enco
ad50: 64 69 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61  ding", &upperCha
ad60: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ad70: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ad80: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad90: 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74  chan, "-translat
ada0: 69 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e  ion", &upperChan
adb0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b  nelTranslation);
adc0: 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e  .    Tcl_GetChan
add0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
ade0: 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69  , chan, "-blocki
adf0: 6e 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ng", &upperChann
ae00: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20  elBlocking);..  
ae10: 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20    /* Ensure the 
ae20: 63 68 61 6e 6e 65 6c 20 77 6f 72 6b 73 20 69 6e  channel works in
ae30: 20 62 69 6e 61 72 79 20 6d 6f 64 65 20 28 66 6f   binary mode (fo
ae40: 72 20 74 68 65 20 65 6e 63 72 79 70 74 69 6f 6e  r the encryption
ae50: 20 6e 6f 74 20 74 6f 20 67 65 74 20 67 6f 6f 66   not to get goof
ae60: 65 64 20 75 70 29 2e 20 2a 2f 0a 20 20 20 20 54  ed up). */.    T
ae70: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
ae80: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e  ion(interp, chan
ae90: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22  , "-translation"
aea0: 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 20  , "binary");.   
aeb0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
aec0: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68  ption(interp, ch
aed0: 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c  an, "-blocking",
aee0: 20 22 74 72 75 65 22 29 3b 0a 20 20 20 20 0a 20   "true");.    . 
aef0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61     /* Create sta
af00: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a  cked channel */.
af10: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 6f 6e      dprintf("Con
af20: 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61 6e 6e  suming Tcl chann
af30: 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65 74 43  el %s", Tcl_GetC
af40: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
af50: 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  );.    statePtr-
af60: 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63  >self = Tcl_Stac
af70: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c  kChannel(interp,
af80: 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65   Tls_ChannelType
af90: 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  (), (ClientData)
afa0: 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54 43 4c   statePtr,..(TCL
afb0: 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43 4c 5f  _READABLE | TCL_
afc0: 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61 6e 29  WRITABLE), chan)
afd0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
afe0: 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c 20 6e  reated channel n
aff0: 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f 47 65  amed %s", Tcl_Ge
b000: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61  tChannelName(sta
b010: 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b 0a 20  tePtr->self));. 
b020: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
b030: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68  >self == (Tcl_Ch
b040: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
b050: 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20 6f 66  /*.. * No use of
b060: 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c 79 46   Tcl_EventuallyF
b070: 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f 20 70  ree because no p
b080: 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72 65 73  ossible Tcl_Pres
b090: 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c 73 5f  erve... */..Tls_
b0a0: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b0b0: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b0c0: 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ;..Tcl_DStringFr
b0d0: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b0e0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 09 54  Translation);..T
b0f0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
b100: 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f  upperChannelEnco
b110: 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53 74 72  ding);..Tcl_DStr
b120: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b130: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 09  annelEOFChar);..
b140: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
b150: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
b160: 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72 6e 20  cking);..return 
b170: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
b180: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65  ..    /* Restore
b190: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20   channel config 
b1a0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  */.    Tcl_SetCh
b1b0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b1c0: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
b1d0: 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  lf, "-translatio
b1e0: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
b1f0: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
b200: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
b210: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
b220: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
b230: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
b240: 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 54  , "-encoding", T
b250: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
b260: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
b270: 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c  oding));.    Tcl
b280: 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _SetChannelOptio
b290: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50  n(interp, stateP
b2a0: 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66 63  tr->self, "-eofc
b2b0: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
b2c0: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
b2d0: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20  nnelEOFChar));. 
b2e0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
b2f0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
b300: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20  statePtr->self, 
b310: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c  "-blocking", Tcl
b320: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
b330: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
b340: 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f 44  ing));.    Tcl_D
b350: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b360: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
b370: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
b380: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
b390: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
b3a0: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
b3b0: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
b3c0: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
b3d0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
b3e0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
b3f0: 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a  ocking);..    /*
b400: 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69 74  .     * SSL Init
b410: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20  ialization.     
b420: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
b430: 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 73  >ssl = SSL_new(s
b440: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20  tatePtr->ctx);. 
b450: 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74 72     if (!statePtr
b460: 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53 4c  ->ssl) {../* SSL
b470: 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20 2a   library error *
b480: 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  /..Tcl_AppendRes
b490: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 75  ult(interp, "cou
b4a0: 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74 20  ldn't construct 
b4b0: 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c 20  ssl session: ", 
b4c0: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b4d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b4e0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b4f0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b500: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b510: 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45 44   "INIT", "FAILED
b520: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
b530: 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74 6c  );..Tls_Free((tl
b540: 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73  s_free_type *) s
b550: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72  tatePtr);..retur
b560: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b570: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 68   }..    /* Set h
b580: 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65 20  ost server name 
b590: 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76 65  */.    if (serve
b5a0: 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65 74  rname) {../* Set
b5b0: 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61 6d  s the server nam
b5c0: 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53 4e  e indication (SN
b5d0: 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c 6c  I) in ClientHell
b5e0: 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a 09  o extension */..
b5f0: 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36 2c  /* Per RFC 6066,
b600: 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20 41   hostname is a A
b610: 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74 72  SCII encoded str
b620: 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43 20  ing, though RFC 
b630: 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38 2e  4366 says UTF-8.
b640: 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73 65   */..if (!SSL_se
b650: 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e 61  t_tlsext_host_na
b660: 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  me(statePtr->ssl
b670: 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26 26  , servername) &&
b680: 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20 20   require) {..   
b690: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b6a0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 53  t(interp, "Set S
b6b0: 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61 69  NI extension fai
b6c0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
b6d0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
b6e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b6f0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
b700: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
b710: 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c 20  IMPORT", "SNI", 
b720: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b730: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b740: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
b750: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
b760: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b770: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a   TCL_ERROR;..}..
b780: 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d 65  ./* Set hostname
b790: 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69 66   for peer certif
b7a0: 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20 76  icate hostname v
b7b0: 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 63  erification in c
b7c0: 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e 27  lients...   Don'
b7d0: 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f 68  t use SSL_set1_h
b7e0: 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61 73  ost since it has
b7f0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a 2f   limitations. */
b800: 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31 5f  ..if (!SSL_add1_
b810: 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e 73  host(statePtr->s
b820: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 29  sl, servername))
b830: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
b840: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
b850: 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e 61   "Set DNS hostna
b860: 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47 45  me failed: ", GE
b870: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20  T_ERR_REASON(), 
b880: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
b890: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
b8a0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
b8b0: 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20 22  LS", "IMPORT", "
b8c0: 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49 4c  HOSTNAME", "FAIL
b8d0: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b8e0: 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46 72  LL);..    Tls_Fr
b8f0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
b900: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
b910: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
b920: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
b930: 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20 73  .    /* Resume s
b940: 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20 20  ession id */.   
b950: 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64 20   if (session_id 
b960: 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f  && strlen(sessio
b970: 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41 58  n_id) <= SSL_MAX
b980: 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48 29  _SID_CTX_LENGTH)
b990: 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73   {../* SSL_set_s
b9a0: 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66 20  ession() */..if 
b9b0: 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73 65  (!SSL_SESSION_se
b9c0: 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53 53  t1_id_context(SS
b9d0: 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73 74  L_get_session(st
b9e0: 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09 09  atePtr->ssl),...
b9f0: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
ba00: 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e 5f  char *) session_
ba10: 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  id, (unsigned in
ba20: 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69 6f  t) strlen(sessio
ba30: 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20 54  n_id))) {..    T
ba40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
ba50: 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65 20  interp, "Resume 
ba60: 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a 20  session failed: 
ba70: 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ", GET_ERR_REASO
ba80: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
ba90: 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  LL);..    Tcl_Se
baa0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
bab0: 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52  p, "TLS", "IMPOR
bac0: 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20 22  T", "SESSION", "
bad0: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
bae0: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
baf0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
bb00: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
bb10: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
bb20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
bb30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61 62    }..    /* Enab
bb40: 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d 4c  le Application-L
bb50: 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e 65  ayer Protocol Ne
bb60: 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d 70  gotiation. Examp
bb70: 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31 2e  les are: http/1.
bb80: 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68 32  0,..http/1.1, h2
bb90: 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70 2c  , h3, ftp, imap,
bba0: 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69 65   pop3, xmpp-clie
bbb0: 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72 2c  nt, xmpp-server,
bbc0: 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63 2e   mqtt, irc, etc.
bbd0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70 6e   */.    if (alpn
bbe0: 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74 20  ) {../* Convert 
bbf0: 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f 20  a TCL list into 
bc00: 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20  a protocol-list 
bc10: 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20 2a  in wire-format *
bc20: 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72  /..unsigned char
bc30: 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09 75   *protos, *p;..u
bc40: 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f 74  nsigned int prot
bc50: 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63 6c  os_len = 0;..Tcl
bc60: 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09 69  _Size cnt, i;..i
bc70: 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a  nt j;..Tcl_Obj *
bc80: 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63 6c  *list;...if (Tcl
bc90: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  _ListObjGetEleme
bca0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70 6e  nts(interp, alpn
bcb0: 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20 21  , &cnt, &list) !
bcc0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
bcd0: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
bce0: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
bcf0: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
bd00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
bd10: 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20  .../* Determine 
bd20: 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75 69  the memory requi
bd30: 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f 74  red for the prot
bd40: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66 6f  ocol-list */..fo
bd50: 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63 6e  r (i = 0; i < cn
bd60: 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54  t; i++) {..    T
bd70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
bd80: 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c 65  Obj(list[i], &le
bd90: 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e  n);..    if (len
bda0: 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c 5f   > 255) {...Tcl_
bdb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
bdc0: 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74 6f  erp, "ALPN proto
bdd0: 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c 6f  col names too lo
bde0: 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ng", (char *) NU
bdf0: 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72  LL);...Tcl_SetEr
be00: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
be10: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
be20: 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45 44   "ALPN", "FAILED
be30: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
be40: 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28 74  );...Tls_Free((t
be50: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
be60: 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65 74  statePtr);...ret
be70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
be80: 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74 6f      }..    proto
be90: 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69 6e  s_len += 1 + (in
bea0: 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a 20  t) len;..}.../* 
beb0: 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c 65  Build the comple
bec0: 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74  te protocol-list
bed0: 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63 6b   */..protos = ck
bee0: 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65 6e  alloc(protos_len
bef0: 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c 2d  );../* protocol-
bf00: 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f 66  lists consist of
bf10: 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70 72   8-bit length-pr
bf20: 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74 72  efixed, byte str
bf30: 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a 20  ings */..for (j 
bf40: 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73 3b  = 0, p = protos;
bf50: 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20 7b   j < cnt; j++) {
bf60: 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72 20  ..    char *str 
bf70: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
bf80: 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c 20  romObj(list[j], 
bf90: 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b 2b  &len);..    *p++
bfa0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
bfb0: 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65 6d  r) len;..    mem
bfc0: 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69 7a  cpy(p, str, (siz
bfd0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
bfe0: 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  p += len;..}.../
bff0: 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70  * SSL_set_alpn_p
c000: 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63 6f  rotos makes a co
c010: 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f 63  py of the protoc
c020: 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20 4e  ol-list */../* N
c030: 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74 69  ote: This functi
c040: 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65 20  on reverses the 
c050: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f 6e  return value con
c060: 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28  vention */..if (
c070: 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72 6f  SSL_set_alpn_pro
c080: 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73  tos(statePtr->ss
c090: 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74 6f  l, protos, proto
c0a0: 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 54  s_len)) {..    T
c0b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c0c0: 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c 50  interp, "Set ALP
c0d0: 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69 6c  N protocols fail
c0e0: 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52  ed: ", GET_ERR_R
c0f0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
c100: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63  ) NULL);..    Tc
c110: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
c120: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49  nterp, "TLS", "I
c130: 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c 20  MPORT", "ALPN", 
c140: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
c150: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
c160: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
c170: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
c180: 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65 65  tr);..    ckfree
c190: 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20 72  (protos);..    r
c1a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c1b0: 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20 70  ..}.../* Store p
c1c0: 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a 2f  rotocols list */
c1d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74  ..statePtr->prot
c1e0: 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73 74  os = protos;..st
c1f0: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c  atePtr->protos_l
c200: 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e 3b  en = protos_len;
c210: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73  .    } else {..s
c220: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c230: 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50 74  = NULL;..statePt
c240: 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d 20  r->protos_len = 
c250: 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
c260: 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c 6c  .     * SSL Call
c270: 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20 20  backs.     */.  
c280: 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64 61    SSL_set_app_da
c290: 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ta(statePtr->ssl
c2a0: 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50  , (void *)stateP
c2b0: 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62 61  tr);./* point ba
c2c0: 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20 20  ck to us */.    
c2d0: 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28 73  SSL_set_verify(s
c2e0: 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76 65  tatePtr->ssl, ve
c2f0: 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c 6c  rify, VerifyCall
c300: 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 53 4c  back);.    /*SSL
c310: 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74  _set_verify_dept
c320: 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79  h(SSL_set_verify
c330: 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a 20 20  _depth, 0);*/.  
c340: 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f 63    SSL_set_info_c
c350: 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72  allback(statePtr
c360: 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c 62  ->ssl, InfoCallb
c370: 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  ack);..    /* Ca
c380: 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65 72  llback for obser
c390: 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d 65  ving protocol me
c3a0: 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64 65  ssages */.#ifnde
c3b0: 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  f OPENSSL_NO_SSL
c3c0: 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76 6f  _TRACE.    /* vo
c3d0: 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d  id SSL_CTX_set_m
c3e0: 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67 28  sg_callback_arg(
c3f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 28  statePtr->ctx, (
c400: 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29  void *)statePtr)
c410: 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f 43  ;.    void SSL_C
c420: 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62  TX_set_msg_callb
c430: 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63 74  ack(statePtr->ct
c440: 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61  x, MessageCallba
c450: 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  ck); */.    SSL_
c460: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c470: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 73  _arg(statePtr->s
c480: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
c490: 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f 73  ePtr);.    SSL_s
c4a0: 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 28  et_msg_callback(
c4b0: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 4d  statePtr->ssl, M
c4c0: 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29 3b  essageCallback);
c4d0: 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
c4e0: 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e 6e  Create Tcl_Chann
c4f0: 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20 2a  el BIO Handler *
c500: 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e  /.    statePtr->
c510: 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77 5f  p_bio.= BIO_new_
c520: 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42 49  tcl(statePtr, BI
c530: 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20 20  O_NOCLOSE);.    
c540: 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d 20  statePtr->bio.= 
c550: 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73 73  BIO_new(BIO_f_ss
c560: 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  l());..    if (s
c570: 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65 72  erver) {../* Ser
c580: 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ver callbacks */
c590: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74 6c  ..SSL_CTX_set_tl
c5a0: 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65 5f  sext_servername_
c5b0: 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74  arg(statePtr->ct
c5c0: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
c5d0: 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73  Ptr);..SSL_CTX_s
c5e0: 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65 72  et_tlsext_server
c5f0: 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73 74  name_callback(st
c600: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e 49  atePtr->ctx, SNI
c610: 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c 5f  Callback);..SSL_
c620: 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f 68  CTX_set_client_h
c630: 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74 72  ello_cb(statePtr
c640: 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c 6c  ->ctx, HelloCall
c650: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c660: 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73 74  atePtr);..if (st
c670: 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21  atePtr->protos !
c680: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 53  = NULL) {..    S
c690: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e 5f  SL_CTX_set_alpn_
c6a0: 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65 50  select_cb(stateP
c6b0: 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61 6c  tr->ctx, ALPNCal
c6c0: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c6d0: 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65 66  tatePtr);.#ifdef
c6e0: 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69 66   USE_NPN..    if
c6f0: 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26 26   (tls1_2 == 0 &&
c700: 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b 0a   tls1_3 == 0) {.
c710: 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65  ..SSL_CTX_set_ne
c720: 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72 74  xt_protos_advert
c730: 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74 72  ised_cb(statePtr
c740: 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62 61  ->ctx, NPNCallba
c750: 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  ck, (void *)stat
c760: 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23 65  ePtr);..    }.#e
c770: 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e 61  ndif..}.../* Ena
c780: 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73 65  ble server to se
c790: 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74 20  nd cert request 
c7a0: 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65 20  after handshake 
c7b0: 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20 2a  (TLS 1.3 only) *
c7c0: 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f 70  /../* A write op
c7d0: 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61 6b  eration must tak
c7e0: 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65 20  e place for the 
c7f0: 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71 75  Certificate Requ
c800: 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73 65  est to be..   se
c810: 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  nt to the client
c820: 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64 6f  , this can be do
c830: 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f 68  ne with SSL_do_h
c840: 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a 09  andshake(). */..
c850: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 70  if (request && p
c860: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26 26  ost_handshake &&
c870: 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20 20   tls1_3) {..    
c880: 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65 6e  SSL_verify_clien
c890: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
c8a0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
c8b0: 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75 74  ..}.../* set aut
c8c0: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c  omatic curve sel
c8d0: 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 73  ection */..SSL_s
c8e0: 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74 61  et_ecdh_auto(sta
c8f0: 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a  tePtr->ssl, 1);.
c900: 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72 20  ../* Set server 
c910: 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50 74  mode */..statePt
c920: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f  r->flags |= TLS_
c930: 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53 4c  TCL_SERVER;..SSL
c940: 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61 74  _set_accept_stat
c950: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c960: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
c970: 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62 61  /* Client callba
c980: 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  cks */.#ifdef US
c990: 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74 65  E_NPN..if (state
c9a0: 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20 4e  Ptr->protos != N
c9b0: 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d 3d  ULL && tls1_2 ==
c9c0: 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20   0 && tls1_3 == 
c9d0: 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43 54  0) {..    SSL_CT
c9e0: 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74 6f  X_set_next_proto
c9f0: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
ca00: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
ca10: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
ca20: 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23 65  statePtr);..}.#e
ca30: 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  ndif.../* Sessio
ca40: 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53 53  n caching */..SS
ca50: 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69 6f  L_CTX_set_sessio
ca60: 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74 61  n_cache_mode(sta
ca70: 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c 5f  tePtr->ctx, SSL_
ca80: 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e  SESS_CACHE_CLIEN
ca90: 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  T | SSL_SESS_CAC
caa0: 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f 53  HE_NO_INTERNAL_S
cab0: 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  TORE);..SSL_CTX_
cac0: 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62 28  sess_set_new_cb(
cad0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
cae0: 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29 3b  essionCallback);
caf0: 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f 73  .../* Enable pos
cb00: 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74 68  t handshake Auth
cb10: 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65 6e  entication exten
cb20: 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f 6e  sion. TLS 1.3 on
cb30: 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e 20  ly, not http/2. 
cb40: 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74 20  */..if (request 
cb50: 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  && post_handshak
cb60: 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73 65  e) {..    SSL_se
cb70: 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  t_post_handshake
cb80: 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d 3e  _auth(statePtr->
cb90: 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f 2a  ssl, 1);..}.../*
cba0: 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64 65   Set client mode
cbb0: 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f 6e   */..SSL_set_con
cbc0: 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74 65  nect_state(state
cbd0: 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d  Ptr->ssl);.    }
cbe0: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 42 49 4f  ..    /* Set BIO
cbf0: 20 66 6f 72 20 72 65 61 64 20 61 6e 64 20 77 72   for read and wr
cc00: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  ite operations o
cc10: 6e 20 53 53 4c 20 6f 62 6a 65 63 74 20 2a 2f 0a  n SSL object */.
cc20: 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69 6f 28      SSL_set_bio(
cc30: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 73  statePtr->ssl, s
cc40: 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 2c 20  tatePtr->p_bio, 
cc50: 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f 29  statePtr->p_bio)
cc60: 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f 73 73  ;.    BIO_set_ss
cc70: 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 2c  l(statePtr->bio,
cc80: 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20   statePtr->ssl, 
cc90: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 0a 20  BIO_NOCLOSE);.. 
cca0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 6e 64     /*.     * End
ccb0: 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20 20 20   of SSL Init.   
ccc0: 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e 74 66    */.    dprintf
ccd0: 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73 22 2c  ("Returning %s",
cce0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
ccf0: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 65  ame(statePtr->se
cd00: 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  lf));.    Tcl_Se
cd10: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
cd20: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
cd30: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
cd40: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54 43 4c  ePtr->self), TCL
cd50: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20 20 20  _VOLATILE);..   
cd60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
cd70: 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a  ------------. *.
cdc0: 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d   * UnimportObjCm
cdd0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  d --. *. *.This 
cde0: 70 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76  procedure is inv
cdf0: 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65 20 74  oked to remove t
ce00: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
ce10: 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a 20 2a  el filter.. *. *
ce20: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
ce30: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
ce40: 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
ce50: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d  ffects:. *.May m
ce60: 6f 64 69 66 79 20 74 68 65 20 62 65 68 61 76 69  odify the behavi
ce70: 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e  or of an IO chan
ce80: 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nel.. *. *------
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 2d 2d 0a 20 2a  -------------. *
ced0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55 6e 69  /.static int.Uni
cee0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65  mportObjCmd(Clie
cef0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
cf00: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
cf10: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
cf20: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
cf30: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
cf40: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 2c 20  l_Channel chan, 
cf50: 70 61 72 65 6e 74 3b 09 2f 2a 20 54 68 65 20 73  parent;./* The s
cf60: 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65 72  tacked and under
cf70: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20 2a  lying channels *
cf80: 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  /.    Tcl_DStrin
cf90: 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  g upperChannelTr
cfa0: 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65 72  anslation, upper
cfb0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c  ChannelBlocking,
cfc0: 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63   upperChannelEnc
cfd0: 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61 6e  oding, upperChan
cfe0: 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20 20  nelEOFChar;.    
cff0: 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b  int res = TCL_OK
d000: 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
d010: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70  entData;..    dp
d020: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
d030: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21  ..    if (objc !
d040: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  = 2) {..Tcl_Wron
d050: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
d060: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e   1, objv, "chann
d070: 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  el");..return TC
d080: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
d090: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20      /* Validate 
d0a0: 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f 0a  channel name */.
d0b0: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
d0c0: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
d0d0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
d0e0: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
d0f0: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
d100: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
d110: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
d120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
d130: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
d140: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
d150: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
d160: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
d170: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
d180: 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 70  nel(chan);.    p
d190: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53  arent = Tcl_GetS
d1a0: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68  tackedChannel(ch
d1b0: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  an);..    /* Ver
d1c0: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64  ify is a stacked
d1d0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
d1e0: 69 66 20 28 70 61 72 65 6e 74 20 3d 3d 20 4e 55  if (parent == NU
d1f0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
d200: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d210: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22  "bad channel \""
d220: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  , Tcl_GetChannel
d230: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c  Name(chan),..."\
d240: 22 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64  ": not a stacked
d250: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
d260: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
d270: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
d280: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
d290: 22 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41  "UNIMPORT", "CHA
d2a0: 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22  NNEL", "INVALID"
d2b0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
d2c0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
d2d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
d2e0: 2f 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e  /* Flush any pen
d2f0: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20  ding data */.   
d300: 20 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63   if (Tcl_Flush(c
d310: 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  han) != TCL_OK) 
d320: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
d330: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
d340: 2f 2a 20 49 6e 69 74 20 73 74 6f 72 61 67 65 20  /* Init storage 
d350: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
d360: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
d370: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
d380: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
d390: 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e  gInit(&upperChan
d3a0: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20  nelBlocking);.  
d3b0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
d3c0: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  t(&upperChannelE
d3d0: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
d3e0: 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70  _DStringInit(&up
d3f0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
d400: 6e 67 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65  ng);..    /* Pre
d410: 73 65 72 76 65 20 63 75 72 72 65 6e 74 20 63 68  serve current ch
d420: 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a  annel config */.
d430: 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e      Tcl_GetChann
d440: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
d450: 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e   chan, "-blockin
d460: 67 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65  g", &upperChanne
d470: 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20  lBlocking);.    
d480: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
d490: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
d4a0: 6e 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  n, "-encoding", 
d4b0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63  &upperChannelEnc
d4c0: 6f 64 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  oding);.    Tcl_
d4d0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
d4e0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
d4f0: 2d 65 6f 66 63 68 61 72 22 2c 20 26 75 70 70 65  -eofchar", &uppe
d500: 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29  rChannelEOFChar)
d510: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
d520: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d530: 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73  p, chan, "-trans
d540: 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70 65 72 43  lation", &upperC
d550: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
d560: 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 73 74  n);..    /* Unst
d570: 61 63 6b 20 74 68 65 20 63 68 61 6e 6e 65 6c 20  ack the channel 
d580: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  */.    if (Tcl_U
d590: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
d5a0: 74 65 72 70 2c 20 63 68 61 6e 29 20 21 3d 20 54  terp, chan) != T
d5b0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 73 20 3d 20  CL_OK) {..res = 
d5c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
d5d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f 72 65  ..    /* Restore
d5e0: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20   channel config 
d5f0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  */.    Tcl_SetCh
d600: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d610: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6e  rp, parent, "-en
d620: 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  coding", Tcl_DSt
d630: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d640: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d650: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
d660: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d670: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 65 6f  rp, parent, "-eo
d680: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", 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 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
d6b0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
d6c0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
d6d0: 2c 20 70 61 72 65 6e 74 2c 20 22 2d 74 72 61 6e  , parent, "-tran
d6e0: 73 6c 61 74 69 6f 6e 22 2c 20 54 63 6c 5f 44 53  slation", Tcl_DS
d6f0: 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65  tringValue(&uppe
d700: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
d710: 69 6f 6e 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53  ion));.    Tcl_S
d720: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
d730: 69 6e 74 65 72 70 2c 20 70 61 72 65 6e 74 2c 20  interp, parent, 
d740: 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63 6c  "-blocking", Tcl
d750: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75  _DStringValue(&u
d760: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d770: 69 6e 67 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  ing));..    /* C
d780: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54  lean-up */.    T
d790: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
d7a0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
d7b0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
d7c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75  l_DStringFree(&u
d7d0: 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64  pperChannelEncod
d7e0: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
d7f0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d800: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d810: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d820: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d830: 65 6c 42 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20  elBlocking);.   
d840: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c   return res;.}..
d850: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
d860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
d8a0: 43 54 58 5f 49 6e 69 74 20 2d 2d 20 63 6f 6e 73  CTX_Init -- cons
d8b0: 74 72 75 63 74 20 61 20 53 53 4c 5f 43 54 58 20  truct a SSL_CTX 
d8c0: 69 6e 73 74 61 6e 63 65 0a 20 2a 0a 20 2a 20 52  instance. *. * R
d8d0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 76 61 6c  esults:. *.A val
d8e0: 69 64 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61  id SSL_CTX insta
d8f0: 6e 63 65 20 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a  nce or NULL.. *.
d900: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
d910: 0a 20 2a 09 63 6f 6e 73 74 72 75 63 74 73 20 53  . *.constructs S
d920: 53 4c 20 63 6f 6e 74 65 78 74 20 28 43 54 58 29  SL context (CTX)
d930: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
d940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
d980: 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 0a 43  atic SSL_CTX *.C
d990: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
d9a0: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
d9b0: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
d9c0: 2c 20 63 68 61 72 20 2a 6b 65 79 66 69 6c 65 2c  , char *keyfile,
d9d0: 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c   char *certfile,
d9e0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
d9f0: 61 72 20 2a 6b 65 79 2c 20 75 6e 73 69 67 6e 65  ar *key, unsigne
da00: 64 20 63 68 61 72 20 2a 63 65 72 74 2c 20 54 63  d char *cert, Tc
da10: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20  l_Size key_len, 
da20: 54 63 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65  Tcl_Size cert_le
da30: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
da40: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f  .    char *CAsto
da50: 72 65 2c 20 63 68 61 72 20 2a 43 41 66 69 6c 65  re, char *CAfile
da60: 2c 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c  , char *ciphers,
da70: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
da80: 74 65 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20  tes, int level, 
da90: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 29 20  char *DHparams) 
daa0: 7b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  {.    Tcl_Interp
dab0: 20 2a 69 6e 74 65 72 70 20 3d 20 73 74 61 74 65   *interp = state
dac0: 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20  Ptr->interp;.   
dad0: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20   SSL_CTX *ctx = 
dae0: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 44 53  NULL;.    Tcl_DS
daf0: 74 72 69 6e 67 20 64 73 3b 0a 20 20 20 20 69 6e  tring ds;.    in
db00: 74 20 6f 66 66 20 3d 20 30 2c 20 61 62 6f 72 74  t off = 0, abort
db10: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6c 6f   = 0;.    int lo
db20: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 3b 0a  ad_private_key;.
db30: 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45      const SSL_ME
db40: 54 48 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20  THOD *method;.. 
db50: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
db60: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 21  ed");..    if (!
db70: 70 72 6f 74 6f 29 20 7b 0a 09 54 63 6c 5f 41 70  proto) {..Tcl_Ap
db80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
db90: 70 2c 20 22 6e 6f 20 76 61 6c 69 64 20 70 72 6f  p, "no valid pro
dba0: 74 6f 63 6f 6c 20 73 65 6c 65 63 74 65 64 22 2c  tocol selected",
dbb0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
dbc0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
dbd0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 63 72 65     }..    /* cre
dbe0: 61 74 65 20 53 53 4c 20 63 6f 6e 74 65 78 74 20  ate SSL context 
dbf0: 2a 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56  */.#if OPENSSL_V
dc00: 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d  ERSION_NUMBER >=
dc10: 20 30 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20   0x10100000L || 
dc20: 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29  defined(NO_SSL2)
dc30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
dc40: 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20  SSL_NO_SSL2).   
dc50: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
dc60: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53  to, TLS_PROTO_SS
dc70: 4c 32 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  L2)) {..Tcl_Appe
dc80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
dc90: 20 22 53 53 4c 32 20 70 72 6f 74 6f 63 6f 6c 20   "SSL2 protocol 
dca0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
dcb0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
dcc0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
dcd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64    }.#endif.#if d
dce0: 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20  efined(NO_SSL3) 
dcf0: 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  || defined(OPENS
dd00: 53 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 20 20 20 20  SL_NO_SSL3).    
dd10: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dd20: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
dd30: 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  3)) {..Tcl_Appen
dd40: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
dd50: 22 53 53 4c 33 20 70 72 6f 74 6f 63 6f 6c 20 6e  "SSL3 protocol n
dd60: 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28  ot supported", (
dd70: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
dd80: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
dd90: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
dda0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
ddb0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
ddc0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 69  L_NO_TLS1).    i
ddd0: 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  f (ENABLED(proto
dde0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  , TLS_PROTO_TLS1
ddf0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
de00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
de10: 54 4c 53 20 31 2e 30 20 70 72 6f 74 6f 63 6f 6c  TLS 1.0 protocol
de20: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
de30: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
de40: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
de50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
de60: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
de70: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
de80: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
de90: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
dea0: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
deb0: 4f 5f 54 4c 53 31 5f 31 29 29 20 7b 0a 09 54 63  O_TLS1_1)) {..Tc
dec0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
ded0: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 31 20  nterp, "TLS 1.1 
dee0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
def0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
df00: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
df10: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
df20: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
df30: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
df40: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
df50: 5f 54 4c 53 31 5f 32 29 0a 20 20 20 20 69 66 20  _TLS1_2).    if 
df60: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
df70: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32  TLS_PROTO_TLS1_2
df80: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
df90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dfa0: 54 4c 53 20 31 2e 32 20 70 72 6f 74 6f 63 6f 6c  TLS 1.2 protocol
dfb0: 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c   not supported",
dfc0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
dfd0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
dfe0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
dff0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e000: 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  3) || defined(OP
e010: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29  ENSSL_NO_TLS1_3)
e020: 0a 20 20 20 20 69 66 20 28 45 4e 41 42 4c 45 44  .    if (ENABLED
e030: 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54  (proto, TLS_PROT
e040: 4f 5f 54 4c 53 31 5f 33 29 29 20 7b 0a 09 54 63  O_TLS1_3)) {..Tc
e050: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e060: 6e 74 65 72 70 2c 20 22 54 4c 53 20 31 2e 33 20  nterp, "TLS 1.3 
e070: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
e080: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
e090: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  ) NULL);..return
e0a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e   NULL;.    }.#en
e0b0: 64 69 66 0a 20 20 20 20 69 66 20 28 70 72 6f 74  dif.    if (prot
e0c0: 6f 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 20 55 73  o == 0) {../* Us
e0d0: 65 20 66 75 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a  e full range */.
e0e0: 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 69 6e  .SSL_CTX_set_min
e0f0: 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63  _proto_version(c
e100: 74 78 2c 20 30 29 3b 0a 09 53 53 4c 5f 43 54 58  tx, 0);..SSL_CTX
e110: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
e120: 65 72 73 69 6f 6e 28 63 74 78 2c 20 30 29 3b 0a  ersion(ctx, 0);.
e130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
e140: 68 20 28 70 72 6f 74 6f 29 20 7b 0a 23 69 66 20  h (proto) {.#if 
e150: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
e160: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30  NUMBER < 0x10100
e170: 30 30 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64  000L && !defined
e180: 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65  (NO_SSL2) && !de
e190: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e1a0: 5f 53 53 4c 32 29 0a 20 20 20 20 63 61 73 65 20  _SSL2).    case 
e1b0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a  TLS_PROTO_SSL2:.
e1c0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e1d0: 65 72 20 3f 20 53 53 4c 76 32 5f 73 65 72 76 65  er ? SSLv2_serve
e1e0: 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c  r_method() : SSL
e1f0: 76 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  v2_client_method
e200: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e210: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e220: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
e230: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e240: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
e250: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
e260: 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61  3_METHOD).    ca
e270: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  se TLS_PROTO_SSL
e280: 33 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53  3:..method = isS
e290: 65 72 76 65 72 20 3f 20 53 53 4c 76 33 5f 73 65  erver ? SSLv3_se
e2a0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e2b0: 53 53 4c 76 33 5f 63 6c 69 65 6e 74 5f 6d 65 74  SSLv3_client_met
e2c0: 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23  hod();..break;.#
e2d0: 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
e2e0: 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  ed(NO_TLS1) && !
e2f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e300: 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66  NO_TLS1) && !def
e310: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e320: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  TLS1_METHOD).   
e330: 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f   case TLS_PROTO_
e340: 54 4c 53 31 3a 0a 09 6d 65 74 68 6f 64 20 3d 20  TLS1:..method = 
e350: 69 73 53 65 72 76 65 72 20 3f 20 54 4c 53 76 31  isServer ? TLSv1
e360: 5f 73 65 72 76 65 72 5f 6d 65 74 68 6f 64 28 29  _server_method()
e370: 20 3a 20 54 4c 53 76 31 5f 63 6c 69 65 6e 74 5f   : TLSv1_client_
e380: 6d 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b  method();..break
e390: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
e3a0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29  fined(NO_TLS1_1)
e3b0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e3c0: 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20  NSSL_NO_TLS1_1) 
e3d0: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e3e0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45  SSL_NO_TLS1_1_ME
e3f0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
e400: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a  LS_PROTO_TLS1_1:
e410: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e420: 76 65 72 20 3f 20 54 4c 53 76 31 5f 31 5f 73 65  ver ? TLSv1_1_se
e430: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e440: 54 4c 53 76 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d  TLSv1_1_client_m
e450: 65 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b  ethod();..break;
e460: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e470: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20  ined(NO_TLS1_2) 
e480: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
e490: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 26  SSL_NO_TLS1_2) &
e4a0: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e4b0: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54  SL_NO_TLS1_2_MET
e4c0: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
e4d0: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a  S_PROTO_TLS1_2:.
e4e0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e4f0: 65 72 20 3f 20 54 4c 53 76 31 5f 32 5f 73 65 72  er ? TLSv1_2_ser
e500: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e510: 4c 53 76 31 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65  LSv1_2_client_me
e520: 74 68 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a  thod();..break;.
e530: 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69  #endif.#if !defi
e540: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
e550: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e560: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
e570: 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f 54 4f    case TLS_PROTO
e580: 5f 54 4c 53 31 5f 33 3a 0a 09 2f 2a 20 55 73 65  _TLS1_3:../* Use
e590: 20 74 68 65 20 67 65 6e 65 72 69 63 20 6d 65 74   the generic met
e5a0: 68 6f 64 20 61 6e 64 20 63 6f 6e 73 74 72 61 69  hod and constrai
e5b0: 6e 74 20 72 61 6e 67 65 20 61 66 74 65 72 20 63  nt range after c
e5c0: 6f 6e 74 65 78 74 20 69 73 20 63 72 65 61 74 65  ontext is create
e5d0: 64 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69  d */..method = i
e5e0: 73 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65  sServer ? TLS_se
e5f0: 72 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20  rver_method() : 
e600: 54 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  TLS_client_metho
e610: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e620: 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  dif.    default:
e630: 0a 09 2f 2a 20 4e 65 67 6f 74 69 61 74 65 20 68  ../* Negotiate h
e640: 69 67 68 65 73 74 20 61 76 61 69 6c 61 62 6c 65  ighest available
e650: 20 53 53 4c 2f 54 4c 53 20 76 65 72 73 69 6f 6e   SSL/TLS version
e660: 20 2a 2f 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73   */..method = is
e670: 53 65 72 76 65 72 20 3f 20 54 4c 53 5f 73 65 72  Server ? TLS_ser
e680: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e690: 4c 53 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  LS_client_method
e6a0: 28 29 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f  ();.#if OPENSSL_
e6b0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
e6c0: 20 30 78 31 30 31 30 30 30 30 30 4c 20 26 26 20   0x10100000L && 
e6d0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32  !defined(NO_SSL2
e6e0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e6f0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09  ENSSL_NO_SSL2)..
e700: 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c 45 44 28  off |= (ENABLED(
e710: 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f  proto, TLS_PROTO
e720: 5f 53 53 4c 32 29 20 20 20 3f 20 30 20 3a 20 53  _SSL2)   ? 0 : S
e730: 53 4c 5f 4f 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b  SL_OP_NO_SSLv2);
e740: 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66  .#endif.#if !def
e750: 69 6e 65 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26  ined(NO_SSL3) &&
e760: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e770: 4c 5f 4e 4f 5f 53 53 4c 33 29 0a 09 6f 66 66 20  L_NO_SSL3)..off 
e780: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
e790: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
e7a0: 33 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  3)   ? 0 : SSL_O
e7b0: 50 5f 4e 4f 5f 53 53 4c 76 33 29 3b 0a 23 65 6e  P_NO_SSLv3);.#en
e7c0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e7d0: 28 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65  (NO_TLS1) && !de
e7e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e7f0: 5f 54 4c 53 31 29 0a 09 6f 66 66 20 7c 3d 20 28  _TLS1)..off |= (
e800: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e810: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 20 20  LS_PROTO_TLS1)  
e820: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
e830: 5f 54 4c 53 76 31 29 3b 0a 23 65 6e 64 69 66 0a  _TLSv1);.#endif.
e840: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e850: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
e860: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e870: 4c 53 31 5f 31 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_1)..off |= (
e880: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e890: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 29  LS_PROTO_TLS1_1)
e8a0: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
e8b0: 5f 54 4c 53 76 31 5f 31 29 3b 0a 23 65 6e 64 69  _TLSv1_1);.#endi
e8c0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e8d0: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
e8e0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e8f0: 5f 54 4c 53 31 5f 32 29 0a 09 6f 66 66 20 7c 3d  _TLS1_2)..off |=
e900: 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c   (ENABLED(proto,
e910: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
e920: 32 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f  2) ? 0 : SSL_OP_
e930: 4e 4f 5f 54 4c 53 76 31 5f 32 29 3b 0a 23 65 6e  NO_TLSv1_2);.#en
e940: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e950: 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21  (NO_TLS1_3) && !
e960: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e970: 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 6f 66 66 20  NO_TLS1_3)..off 
e980: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
e990: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
e9a0: 31 5f 33 29 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  1_3) ? 0 : SSL_O
e9b0: 50 5f 4e 4f 5f 54 4c 53 76 31 5f 33 29 3b 0a 23  P_NO_TLSv1_3);.#
e9c0: 65 6e 64 69 66 0a 09 62 72 65 61 6b 3b 0a 20 20  endif..break;.  
e9d0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
e9e0: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
e9f0: 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58 5f 6e   ctx = SSL_CTX_n
ea00: 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20 20 20  ew(method);.    
ea10: 69 66 20 28 21 63 74 78 29 20 7b 0a 09 72 65 74  if (!ctx) {..ret
ea20: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
ea30: 0a 20 20 20 20 69 66 20 28 67 65 74 65 6e 76 28  .    if (getenv(
ea40: 53 53 4c 4b 45 59 4c 4f 47 46 49 4c 45 29 29 20  SSLKEYLOGFILE)) 
ea50: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6b  {..SSL_CTX_set_k
ea60: 65 79 6c 6f 67 5f 63 61 6c 6c 62 61 63 6b 28 63  eylog_callback(c
ea70: 74 78 2c 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61  tx, KeyLogCallba
ea80: 63 6b 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  ck);.    }..#if 
ea90: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
eaa0: 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _3) && !defined(
eab0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
eac0: 33 29 0a 20 20 20 20 69 66 20 28 70 72 6f 74 6f  3).    if (proto
ead0: 20 3d 3d 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c   == TLS_PROTO_TL
eae0: 53 31 5f 33 29 20 7b 0a 09 53 53 4c 5f 43 54 58  S1_3) {..SSL_CTX
eaf0: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
eb00: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
eb10: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 53 53  _3_VERSION);..SS
eb20: 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70 72  L_CTX_set_max_pr
eb30: 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c  oto_version(ctx,
eb40: 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e 29   TLS1_3_VERSION)
eb50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
eb60: 20 20 20 20 2f 2a 20 46 6f 72 63 65 20 63 69 70      /* Force cip
eb70: 68 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 6f 72  her selection or
eb80: 64 65 72 20 62 79 20 73 65 72 76 65 72 20 2a 2f  der by server */
eb90: 0a 20 20 20 20 69 66 20 28 21 69 73 53 65 72 76  .    if (!isServ
eba0: 65 72 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73  er) {..SSL_CTX_s
ebb0: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
ebc0: 53 53 4c 5f 4f 50 5f 43 49 50 48 45 52 5f 53 45  SSL_OP_CIPHER_SE
ebd0: 52 56 45 52 5f 50 52 45 46 45 52 45 4e 43 45 29  RVER_PREFERENCE)
ebe0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45  ;.    }..#if OPE
ebf0: 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
ec00: 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30  BER < 0x10100000
ec10: 4c 0a 20 20 20 20 4f 70 65 6e 53 53 4c 5f 61 64  L.    OpenSSL_ad
ec20: 64 5f 61 6c 6c 5f 61 6c 67 6f 72 69 74 68 6d 73  d_all_algorithms
ec30: 28 29 3b 20 2f 2a 20 4c 6f 61 64 20 63 69 70 68  (); /* Load ciph
ec40: 65 72 73 20 61 6e 64 20 64 69 67 65 73 74 73 20  ers and digests 
ec50: 2a 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 53  */.#endif..    S
ec60: 53 4c 5f 43 54 58 5f 73 65 74 5f 61 70 70 5f 64  SL_CTX_set_app_d
ec70: 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64 2a 29  ata(ctx, (void*)
ec80: 69 6e 74 65 72 70 29 3b 09 2f 2a 20 72 65 6d 65  interp);./* reme
ec90: 6d 62 65 72 20 74 68 65 20 69 6e 74 65 72 70 72  mber the interpr
eca0: 65 74 65 72 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  eter */.    SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
ecc0: 63 74 78 2c 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29  ctx, SSL_OP_ALL)
ecd0: 3b 09 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20  ;./* Enable all 
ece0: 53 53 4c 20 62 75 67 20 77 6f 72 6b 61 72 6f 75  SSL bug workarou
ecf0: 6e 64 73 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43  nds */.    SSL_C
ed00: 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63  TX_set_options(c
ed10: 74 78 2c 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f  tx, SSL_OP_NO_CO
ed20: 4d 50 52 45 53 53 49 4f 4e 29 3b 09 2f 2a 20 44  MPRESSION);./* D
ed30: 69 73 61 62 6c 65 20 63 6f 6d 70 72 65 73 73 69  isable compressi
ed40: 6f 6e 20 65 76 65 6e 20 69 66 20 73 75 70 70 6f  on even if suppo
ed50: 72 74 65 64 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  rted */.    SSL_
ed60: 43 54 58 5f 73 65 74 5f 6f 70 74 69 6f 6e 73 28  CTX_set_options(
ed70: 63 74 78 2c 20 6f 66 66 29 3b 09 09 2f 2a 20 44  ctx, off);../* D
ed80: 69 73 61 62 6c 65 20 73 70 65 63 69 66 69 65 64  isable specified
ed90: 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73 69 6f   protocol versio
eda0: 6e 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c  ns */..    /* Al
edb0: 6c 6f 77 20 77 72 69 74 65 73 20 74 6f 20 72 65  low writes to re
edc0: 70 6f 72 74 20 73 75 63 63 65 73 73 20 77 68 65  port success whe
edd0: 6e 20 6c 65 73 73 20 74 68 61 6e 20 61 6c 6c 20  n less than all 
ede0: 72 65 63 6f 72 64 73 20 68 61 76 65 20 62 65 65  records have bee
edf0: 6e 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 20  n written */.   
ee00: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 6f 64   SSL_CTX_set_mod
ee10: 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f  e(ctx, SSL_MODE_
ee20: 45 4e 41 42 4c 45 5f 50 41 52 54 49 41 4c 5f 57  ENABLE_PARTIAL_W
ee30: 52 49 54 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 44  RITE);..    /* D
ee40: 69 73 61 62 6c 65 20 61 74 74 65 6d 70 74 73 20  isable attempts 
ee50: 74 6f 20 74 72 79 20 74 6f 20 70 72 6f 63 65 73  to try to proces
ee60: 73 20 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72  s the next recor
ee70: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 74  d instead of ret
ee80: 75 72 6e 69 6e 67 20 61 66 74 65 72 20 61 0a 20  urning after a. 
ee90: 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 20 72 65        non-app re
eea0: 63 6f 72 64 2e 20 41 76 6f 69 64 73 20 68 61 6e  cord. Avoids han
eeb0: 67 73 20 69 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d  gs in blocking m
eec0: 6f 64 65 2c 20 77 68 65 6e 20 75 73 69 6e 67 20  ode, when using 
eed0: 53 53 4c 5f 72 65 61 64 28 29 20 61 6e 64 20 61  SSL_read() and a
eee0: 0a 20 20 20 20 20 20 20 6e 6f 6e 2d 61 70 70 6c  .       non-appl
eef0: 69 63 61 74 69 6f 6e 20 72 65 63 6f 72 64 20 77  ication record w
ef00: 61 73 20 73 65 6e 74 20 61 6e 64 20 6e 6f 20 61  as sent and no a
ef10: 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61 20  pplication data 
ef20: 77 61 73 20 73 65 6e 74 2e 20 2a 2f 0a 20 20 20  was sent. */.   
ef30: 20 53 53 4c 5f 43 54 58 5f 63 6c 65 61 72 5f 6d   SSL_CTX_clear_m
ef40: 6f 64 65 28 63 74 78 2c 20 53 53 4c 5f 4d 4f 44  ode(ctx, SSL_MOD
ef50: 45 5f 41 55 54 4f 5f 52 45 54 52 59 29 3b 0a 0a  E_AUTO_RETRY);..
ef60: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 73 73      SSL_CTX_sess
ef70: 5f 73 65 74 5f 63 61 63 68 65 5f 73 69 7a 65 28  _set_cache_size(
ef80: 63 74 78 2c 20 31 32 38 29 3b 0a 0a 20 20 20 20  ctx, 128);..    
ef90: 2f 2a 20 53 65 74 20 75 73 65 72 20 64 65 66 69  /* Set user defi
efa0: 6e 65 64 20 63 69 70 68 65 72 73 2c 20 63 69 70  ned ciphers, cip
efb0: 68 65 72 20 73 75 69 74 65 73 2c 20 61 6e 64 20  her suites, and 
efc0: 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20 2a  security level *
efd0: 2f 0a 20 20 20 20 69 66 20 28 28 63 69 70 68 65  /.    if ((ciphe
efe0: 72 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20 21  rs != NULL) && !
eff0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70 68  SSL_CTX_set_ciph
f000: 65 72 5f 6c 69 73 74 28 63 74 78 2c 20 63 69 70  er_list(ctx, cip
f010: 68 65 72 73 29 29 20 7b 0a 09 54 63 6c 5f 41 70  hers)) {..Tcl_Ap
f020: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f030: 70 2c 20 22 53 65 74 20 63 69 70 68 65 72 73 20  p, "Set ciphers 
f040: 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64  failed: No valid
f050: 20 63 69 70 68 65 72 73 22 2c 20 28 63 68 61 72   ciphers", (char
f060: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
f070: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f080: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
f090: 20 7d 0a 20 20 20 20 69 66 20 28 28 63 69 70 68   }.    if ((ciph
f0a0: 65 72 73 75 69 74 65 73 20 21 3d 20 4e 55 4c 4c  ersuites != NULL
f0b0: 29 20 26 26 20 21 53 53 4c 5f 43 54 58 5f 73 65  ) && !SSL_CTX_se
f0c0: 74 5f 63 69 70 68 65 72 73 75 69 74 65 73 28 63  t_ciphersuites(c
f0d0: 74 78 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  tx, ciphersuites
f0e0: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
f0f0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f100: 53 65 74 20 63 69 70 68 65 72 20 73 75 69 74 65  Set cipher suite
f110: 73 20 66 61 69 6c 65 64 3a 20 4e 6f 20 76 61 6c  s failed: No val
f120: 69 64 20 63 69 70 68 65 72 73 22 2c 20 28 63 68  id ciphers", (ch
f130: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53  ar *) NULL);..SS
f140: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f150: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20  ..return NULL;. 
f160: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
f170: 20 73 65 63 75 72 69 74 79 20 6c 65 76 65 6c 20   security level 
f180: 2a 2f 0a 20 20 20 20 69 66 20 28 6c 65 76 65 6c  */.    if (level
f190: 20 3e 20 2d 31 20 26 26 20 6c 65 76 65 6c 20 3c   > -1 && level <
f1a0: 20 36 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65   6) {../* SSL_se
f1b0: 74 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c  t_security_level
f1c0: 20 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74   */..SSL_CTX_set
f1d0: 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
f1e0: 63 74 78 2c 20 6c 65 76 65 6c 29 3b 0a 20 20 20  ctx, level);.   
f1f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 73   }..    /* set s
f200: 6f 6d 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ome callbacks */
f210: 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74  .    SSL_CTX_set
f220: 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77 64 5f  _default_passwd_
f230: 63 62 28 63 74 78 2c 20 50 61 73 73 77 6f 72 64  cb(ctx, Password
f240: 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 53  Callback);.    S
f250: 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75  SL_CTX_set_defau
f260: 6c 74 5f 70 61 73 73 77 64 5f 63 62 5f 75 73 65  lt_passwd_cb_use
f270: 72 64 61 74 61 28 63 74 78 2c 20 28 76 6f 69 64  rdata(ctx, (void
f280: 20 2a 29 73 74 61 74 65 50 74 72 29 3b 0a 0a 20   *)statePtr);.. 
f290: 20 20 20 2f 2a 20 72 65 61 64 20 61 20 44 69 66     /* read a Dif
f2a0: 66 69 65 2d 48 65 6c 6c 6d 61 6e 20 70 61 72 61  fie-Hellman para
f2b0: 6d 65 74 65 72 73 20 66 69 6c 65 2c 20 6f 72 20  meters file, or 
f2c0: 75 73 65 20 74 68 65 20 62 75 69 6c 74 2d 69 6e  use the built-in
f2d0: 20 6f 6e 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f   one */.    Tcl_
f2e0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73 29  DStringInit(&ds)
f2f0: 3b 0a 23 69 66 64 65 66 20 4f 50 45 4e 53 53 4c  ;.#ifdef OPENSSL
f300: 5f 4e 4f 5f 44 48 0a 20 20 20 20 69 66 20 28 44  _NO_DH.    if (D
f310: 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29  Hparams != NULL)
f320: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
f330: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 44 48  sult(interp, "DH
f340: 20 70 61 72 61 6d 65 74 65 72 20 73 75 70 70 6f   parameter suppo
f350: 72 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  rt not available
f360: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
f370: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65  );..SSL_CTX_free
f380: 28 63 74 78 29 3b 0a 09 72 65 74 75 72 6e 20 4e  (ctx);..return N
f390: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65  ULL;.    }.#else
f3a0: 0a 20 20 20 20 7b 0a 09 44 48 2a 20 64 68 3b 0a  .    {..DH* dh;.
f3b0: 09 69 66 20 28 44 48 70 61 72 61 6d 73 20 21 3d  .if (DHparams !=
f3c0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 49   NULL) {..    BI
f3d0: 4f 20 2a 62 69 6f 3b 0a 0a 09 20 20 20 20 62 69  O *bio;...    bi
f3e0: 6f 20 3d 20 42 49 4f 5f 6e 65 77 5f 66 69 6c 65  o = BIO_new_file
f3f0: 28 46 32 4e 28 44 48 70 61 72 61 6d 73 2c 20 26  (F2N(DHparams, &
f400: 64 73 29 2c 20 22 72 22 29 3b 0a 09 20 20 20 20  ds), "r");..    
f410: 69 66 20 28 21 62 69 6f 29 20 7b 0a 09 09 54 63  if (!bio) {...Tc
f420: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f430: 73 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64  s);...Tcl_Append
f440: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f450: 43 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 44  Could not find D
f460: 48 20 70 61 72 61 6d 65 74 65 72 73 20 66 69 6c  H parameters fil
f470: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
f480: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f490: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f4a0: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 0a  n NULL;..    }..
f4b0: 09 20 20 20 20 64 68 20 3d 20 50 45 4d 5f 72 65  .    dh = PEM_re
f4c0: 61 64 5f 62 69 6f 5f 44 48 70 61 72 61 6d 73 28  ad_bio_DHparams(
f4d0: 62 69 6f 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  bio, NULL, NULL,
f4e0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 42 49 4f   NULL);..    BIO
f4f0: 5f 66 72 65 65 28 62 69 6f 29 3b 0a 09 20 20 20  _free(bio);..   
f500: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
f510: 28 26 64 73 29 3b 0a 09 20 20 20 20 69 66 20 28  (&ds);..    if (
f520: 21 64 68 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70  !dh) {...Tcl_App
f530: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f540: 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 72 65 61  , "Could not rea
f550: 64 20 44 48 20 70 61 72 61 6d 65 74 65 72 73 20  d DH parameters 
f560: 66 72 6f 6d 20 66 69 6c 65 22 2c 20 28 63 68 61  from file", (cha
f570: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f580: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f590: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f5a0: 09 20 20 20 20 7d 0a 09 20 20 20 20 53 53 4c 5f  .    }..    SSL_
f5b0: 43 54 58 5f 73 65 74 5f 74 6d 70 5f 64 68 28 63  CTX_set_tmp_dh(c
f5c0: 74 78 2c 20 64 68 29 3b 0a 09 20 20 20 20 44 48  tx, dh);..    DH
f5d0: 5f 66 72 65 65 28 64 68 29 3b 0a 0a 09 7d 20 65  _free(dh);...} e
f5e0: 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 20 55 73  lse {..    /* Us
f5f0: 65 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 44 48 20  e well known DH 
f600: 70 61 72 61 6d 65 74 65 72 73 20 74 68 61 74 20  parameters that 
f610: 68 61 76 65 20 62 75 69 6c 74 2d 69 6e 20 73 75  have built-in su
f620: 70 70 6f 72 74 20 69 6e 20 4f 70 65 6e 53 53 4c  pport in OpenSSL
f630: 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 21 53 53   */..    if (!SS
f640: 4c 5f 43 54 58 5f 73 65 74 5f 64 68 5f 61 75 74  L_CTX_set_dh_aut
f650: 6f 28 63 74 78 2c 20 31 29 29 20 7b 0a 09 09 54  o(ctx, 1)) {...T
f660: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f670: 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e  interp, "Could n
f680: 6f 74 20 65 6e 61 62 6c 65 20 73 65 74 20 44 48  ot enable set DH
f690: 20 61 75 74 6f 3a 20 22 2c 20 47 45 54 5f 45 52   auto: ", GET_ER
f6a0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
f6b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f6c0: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f6d0: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f6e0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
f6f0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 73  #endif..    /* s
f700: 65 74 20 6f 75 72 20 63 65 72 74 69 66 69 63 61  et our certifica
f710: 74 65 20 2a 2f 0a 20 20 20 20 6c 6f 61 64 5f 70  te */.    load_p
f720: 72 69 76 61 74 65 5f 6b 65 79 20 3d 20 30 3b 0a  rivate_key = 0;.
f730: 20 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65      if (certfile
f740: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61   != NULL) {..loa
f750: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d 20  d_private_key = 
f760: 31 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43 54 58  1;...if (SSL_CTX
f770: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
f780: 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 63  _file(ctx, F2N(c
f790: 65 72 74 66 69 6c 65 2c 20 26 64 73 29 2c 20 53  ertfile, &ds), S
f7a0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
f7b0: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
f7c0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
f7d0: 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  s);..    Tcl_App
f7e0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f7f0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f800: 20 63 65 72 74 69 66 69 63 61 74 65 20 66 69 6c   certificate fil
f810: 65 20 22 2c 20 63 65 72 74 66 69 6c 65 2c 20 22  e ", certfile, "
f820: 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f 52  : ",...GET_ERR_R
f830: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
f840: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53  ) NULL);..    SS
f850: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f860: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c  ..    return NUL
f870: 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 53 74 72 69  L;..}..Tcl_DStri
f880: 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 20 20  ngFree(&ds);..  
f890: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 65 72    } else if (cer
f8a0: 74 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6c 6f  t != NULL) {..lo
f8b0: 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 20 3d  ad_private_key =
f8c0: 20 31 3b 0a 09 69 66 20 28 53 53 4c 5f 43 54 58   1;..if (SSL_CTX
f8d0: 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61 74 65  _use_certificate
f8e0: 5f 41 53 4e 31 28 63 74 78 2c 20 28 69 6e 74 29  _ASN1(ctx, (int)
f8f0: 20 63 65 72 74 5f 6c 65 6e 2c 20 63 65 72 74 29   cert_len, cert)
f900: 20 3c 3d 20 30 29 20 7b 0a 09 20 20 20 20 54 63   <= 0) {..    Tc
f910: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f920: 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74  nterp, "unable t
f930: 6f 20 73 65 74 20 63 65 72 74 69 66 69 63 61 74  o set certificat
f940: 65 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52 52 5f  e: ",...GET_ERR_
f950: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
f960: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53  *) NULL);..    S
f970: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f980: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55  ;..    return NU
f990: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73  LL;..}.    } els
f9a0: 65 20 7b 0a 09 63 65 72 74 66 69 6c 65 20 3d 20  e {..certfile = 
f9b0: 28 63 68 61 72 2a 29 58 35 30 39 5f 67 65 74 5f  (char*)X509_get_
f9c0: 64 65 66 61 75 6c 74 5f 63 65 72 74 5f 66 69 6c  default_cert_fil
f9d0: 65 28 29 3b 0a 0a 09 69 66 20 28 53 53 4c 5f 43  e();...if (SSL_C
f9e0: 54 58 5f 75 73 65 5f 63 65 72 74 69 66 69 63 61  TX_use_certifica
f9f0: 74 65 5f 66 69 6c 65 28 63 74 78 2c 20 63 65 72  te_file(ctx, cer
fa00: 74 66 69 6c 65 2c 20 53 53 4c 5f 46 49 4c 45 54  tfile, SSL_FILET
fa10: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
fa20: 0a 23 69 66 20 30 0a 09 20 20 20 20 54 63 6c 5f  .#if 0..    Tcl_
fa30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fa40: 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20  erp, "unable to 
fa50: 75 73 65 20 64 65 66 61 75 6c 74 20 63 65 72 74  use default cert
fa60: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
fa70: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
fa80: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
fa90: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
faa0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
fab0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
fac0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 23 65   return NULL;.#e
fad0: 6e 64 69 66 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ndif..}.    }.. 
fae0: 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 70 72     /* set our pr
faf0: 69 76 61 74 65 20 6b 65 79 20 2a 2f 0a 20 20 20  ivate key */.   
fb00: 20 69 66 20 28 6c 6f 61 64 5f 70 72 69 76 61 74   if (load_privat
fb10: 65 5f 6b 65 79 29 20 7b 0a 09 69 66 20 28 6b 65  e_key) {..if (ke
fb20: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 20 26 26  yfile == NULL &&
fb30: 20 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a   key == NULL) {.
fb40: 09 20 20 20 20 6b 65 79 66 69 6c 65 20 3d 20 63  .    keyfile = c
fb50: 65 72 74 66 69 6c 65 3b 0a 09 7d 0a 0a 09 69 66  ertfile;..}...if
fb60: 20 28 6b 65 79 66 69 6c 65 20 21 3d 20 4e 55 4c   (keyfile != NUL
fb70: 4c 29 20 7b 0a 09 20 20 20 20 2f 2a 20 67 65 74  L) {..    /* get
fb80: 20 74 68 65 20 70 72 69 76 61 74 65 20 6b 65 79   the private key
fb90: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
fba0: 20 74 68 69 73 20 63 65 72 74 69 66 69 63 61 74   this certificat
fbb0: 65 20 2a 2f 0a 09 20 20 20 20 69 66 20 28 6b 65  e */..    if (ke
fbc0: 79 66 69 6c 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b  yfile == NULL) {
fbd0: 0a 09 09 6b 65 79 66 69 6c 65 20 3d 20 63 65 72  ...keyfile = cer
fbe0: 74 66 69 6c 65 3b 0a 09 20 20 20 20 7d 0a 0a 09  tfile;..    }...
fbf0: 20 20 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f      if (SSL_CTX_
fc00: 75 73 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 66  use_PrivateKey_f
fc10: 69 6c 65 28 63 74 78 2c 20 46 32 4e 28 6b 65 79  ile(ctx, F2N(key
fc20: 66 69 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f  file, &ds), SSL_
fc30: 46 49 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d  FILETYPE_PEM) <=
fc40: 20 30 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72   0) {...Tcl_DStr
fc50: 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09  ingFree(&ds);...
fc60: 2f 2a 20 66 6c 75 73 68 20 74 68 65 20 70 61 73  /* flush the pas
fc70: 73 70 68 72 61 73 65 20 77 68 69 63 68 20 6d 69  sphrase which mi
fc80: 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74  ght be left in t
fc90: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54  he result */...T
fca0: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
fcb0: 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53  erp, NULL, TCL_S
fcc0: 54 41 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70  TATIC);...Tcl_Ap
fcd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
fce0: 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65  p, "unable to se
fcf0: 74 20 70 75 62 6c 69 63 20 6b 65 79 20 66 69 6c  t public key fil
fd00: 65 20 22 2c 20 6b 65 79 66 69 6c 65 2c 20 22 20  e ", keyfile, " 
fd10: 22 2c 0a 09 09 20 20 20 20 47 45 54 5f 45 52 52  ",...    GET_ERR
fd20: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
fd30: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c   *) NULL);...SSL
fd40: 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a  _CTX_free(ctx);.
fd50: 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09  ..return NULL;..
fd60: 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
fd70: 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
fd80: 0a 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65  ...} else if (ke
fd90: 79 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  y != NULL) {..  
fda0: 20 20 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73    if (SSL_CTX_us
fdb0: 65 5f 50 72 69 76 61 74 65 4b 65 79 5f 41 53 4e  e_PrivateKey_ASN
fdc0: 31 28 45 56 50 5f 50 4b 45 59 5f 52 53 41 2c 20  1(EVP_PKEY_RSA, 
fdd0: 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20  ctx, key, (int) 
fde0: 6b 65 79 5f 6c 65 6e 29 20 3c 3d 20 30 29 20 7b  key_len) <= 0) {
fdf0: 0a 09 09 2f 2a 20 66 6c 75 73 68 20 74 68 65 20  .../* flush the 
fe00: 70 61 73 73 70 68 72 61 73 65 20 77 68 69 63 68  passphrase which
fe10: 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20 69   might be left i
fe20: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
fe30: 09 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28  ..Tcl_SetResult(
fe40: 69 6e 74 65 72 70 2c 20 4e 55 4c 4c 2c 20 54 43  interp, NULL, TC
fe50: 4c 5f 53 54 41 54 49 43 29 3b 0a 09 09 54 63 6c  L_STATIC);...Tcl
fe60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fe70: 74 65 72 70 2c 20 22 75 6e 61 62 6c 65 20 74 6f  terp, "unable to
fe80: 20 73 65 74 20 70 75 62 6c 69 63 20 6b 65 79 3a   set public key:
fe90: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
fea0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
feb0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
fec0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
fed0: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
fee0: 0a 09 7d 0a 09 2f 2a 20 4e 6f 77 20 77 65 20 6b  ..}../* Now we k
fef0: 6e 6f 77 20 74 68 61 74 20 61 20 6b 65 79 20 61  now that a key a
ff00: 6e 64 20 63 65 72 74 20 68 61 76 65 20 62 65 65  nd cert have bee
ff10: 6e 20 73 65 74 20 61 67 61 69 6e 73 74 0a 09 20  n set against.. 
ff20: 2a 20 74 68 65 20 53 53 4c 20 63 6f 6e 74 65 78  * the SSL contex
ff30: 74 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 43  t */..if (!SSL_C
ff40: 54 58 5f 63 68 65 63 6b 5f 70 72 69 76 61 74 65  TX_check_private
ff50: 5f 6b 65 79 28 63 74 78 29 29 20 7b 0a 09 20 20  _key(ctx)) {..  
ff60: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
ff70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 70 72 69 76  lt(interp, "priv
ff80: 61 74 65 20 6b 65 79 20 64 6f 65 73 20 6e 6f 74  ate key does not
ff90: 20 6d 61 74 63 68 20 74 68 65 20 63 65 72 74 69   match the certi
ffa0: 66 69 63 61 74 65 20 70 75 62 6c 69 63 20 6b 65  ficate public ke
ffb0: 79 22 2c 0a 09 09 09 20 20 20 20 20 28 63 68 61  y",....     (cha
ffc0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
ffd0: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
ffe0: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
fff0: 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  NULL;..}.    }..
10000 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 75 73      /* Set to us
10010 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  e the default lo
10020 63 61 74 69 6f 6e 20 61 6e 64 20 66 69 6c 65 20  cation and file 
10030 66 6f 72 20 43 65 72 74 69 66 69 63 61 74 65 20  for Certificate 
10040 41 75 74 68 6f 72 69 74 79 20 28 43 41 29 20 63  Authority (CA) c
10050 65 72 74 69 66 69 63 61 74 65 73 2e 0a 20 20 20  ertificates..   
10060 20 20 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20    * The default 
10070 43 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20  CA certificates 
10080 64 69 72 65 63 74 6f 72 79 20 69 73 20 63 61 6c  directory is cal
10090 6c 65 64 20 63 65 72 74 73 20 69 6e 20 74 68 65  led certs in the
100a0 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c   default OpenSSL
100b0 0a 20 20 20 20 20 2a 20 64 69 72 65 63 74 6f 72  .     * director
100c0 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 74  y. It contains t
100d0 68 65 20 43 41 20 63 65 72 74 69 66 69 63 61 74  he CA certificat
100e0 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74  es in PEM format
100f0 2c 20 77 69 74 68 20 6f 6e 65 20 63 65 72 74 69  , with one certi
10100 66 69 63 61 74 65 20 70 65 72 0a 20 20 20 20 20  ficate per.     
10110 2a 20 66 69 6c 65 2e 20 54 68 65 20 76 65 72 69  * file. The veri
10120 66 79 20 70 61 74 68 20 61 6e 64 20 73 74 6f 72  fy path and stor
10130 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64  e can be overrid
10140 64 65 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43  den by the SSL_C
10150 45 52 54 5f 44 49 52 20 65 6e 76 20 76 61 72 2e  ERT_DIR env var.
10160 20 54 68 65 0a 20 20 20 20 20 2a 20 64 65 66 61   The.     * defa
10170 75 6c 74 20 43 41 20 63 65 72 74 69 66 69 63 61  ult CA certifica
10180 74 65 73 20 66 69 6c 65 20 69 73 20 63 61 6c 6c  tes file is call
10190 65 64 20 63 65 72 74 2e 70 65 6d 20 69 6e 20 74  ed cert.pem in t
101a0 68 65 20 64 65 66 61 75 6c 74 20 4f 70 65 6e 53  he default OpenS
101b0 53 4c 20 64 69 72 65 63 74 6f 72 79 2e 0a 20 20  SL directory..  
101c0 20 20 20 2a 20 54 68 65 20 76 65 72 69 66 79 20     * The verify 
101d0 66 69 6c 65 20 63 61 6e 20 62 65 20 6f 76 65 72  file can be over
101e0 72 69 64 64 65 6e 20 62 79 20 74 68 65 20 53 53  ridden by the SS
101f0 4c 5f 43 45 52 54 5f 46 49 4c 45 20 65 6e 76 20  L_CERT_FILE env 
10200 76 61 72 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28  var. */.    if (
10210 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66  !SSL_CTX_set_def
10220 61 75 6c 74 5f 76 65 72 69 66 79 5f 70 61 74 68  ault_verify_path
10230 73 28 63 74 78 29 29 20 7b 0a 09 61 62 6f 72 74  s(ctx)) {..abort
10240 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ++;.    }..    /
10250 2a 20 4f 76 65 72 72 69 64 65 73 20 66 6f 72 20  * Overrides for 
10260 74 68 65 20 43 41 20 76 65 72 69 66 79 20 70 61  the CA verify pa
10270 74 68 20 61 6e 64 20 66 69 6c 65 20 2a 2f 0a 20  th and file */. 
10280 20 20 20 7b 0a 23 69 66 20 4f 50 45 4e 53 53 4c     {.#if OPENSSL
10290 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
102a0 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09 69  < 0x30000000L..i
102b0 66 20 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c  f (CApath != NUL
102c0 4c 20 7c 7c 20 43 41 66 69 6c 65 20 21 3d 20 4e  L || CAfile != N
102d0 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ULL) {..    Tcl_
102e0 44 53 74 72 69 6e 67 20 64 73 31 3b 0a 09 20 20  DString ds1;..  
102f0 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
10300 74 28 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 69  t(&ds1);...    i
10310 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64  f (!SSL_CTX_load
10320 5f 76 65 72 69 66 79 5f 6c 6f 63 61 74 69 6f 6e  _verify_location
10330 73 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  s(ctx, F2N(CAfil
10340 65 2c 20 26 64 73 29 2c 20 46 32 4e 28 43 41 70  e, &ds), F2N(CAp
10350 61 74 68 2c 20 26 64 73 31 29 29 29 20 7b 0a 09  ath, &ds1))) {..
10360 09 61 62 6f 72 74 2b 2b 3b 0a 09 09 72 65 74 75  .abort++;...retu
10370 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a  rn NULL;..    }.
10380 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
10390 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20 20  Free(&ds);..    
103a0 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
103b0 26 64 73 31 29 3b 0a 0a 09 20 20 20 20 2f 2a 20  &ds1);...    /* 
103c0 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41 73 20  Set list of CAs 
103d0 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69 65 6e  to send to clien
103e0 74 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  t when requestin
103f0 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72 74 69  g a client certi
10400 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20 20 2f  ficate */..    /
10410 2a 20 68 74 74 70 73 3a 2f 2f 73 6f 75 72 63 65  * https://source
10420 66 6f 72 67 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f  forge.net/p/tls/
10430 62 75 67 73 2f 35 37 2f 20 2a 2f 0a 09 20 20 20  bugs/57/ */..   
10440 20 2f 2a 20 58 58 58 3a 54 4f 44 4f 3a 20 4c 65   /* XXX:TODO: Le
10450 74 20 74 68 65 20 75 73 65 72 20 73 75 70 70 6c  t the user suppl
10460 79 20 76 61 6c 75 65 73 20 68 65 72 65 20 69 6e  y values here in
10470 73 74 65 61 64 20 6f 66 20 73 6f 6d 65 74 68 69  stead of somethi
10480 6e 67 20 74 68 61 74 20 65 78 69 73 74 73 20 6f  ng that exists o
10490 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
104a0 20 2a 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f   */..    STACK_O
104b0 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65  F(X509_NAME) *ce
104c0 72 74 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f  rtNames = SSL_lo
104d0 61 64 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c  ad_client_CA_fil
104e0 65 28 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  e(F2N(CAfile, &d
104f0 73 29 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65  s));..    if (ce
10500 72 74 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29  rtNames != NULL)
10510 20 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74   {...SSL_CTX_set
10520 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28  _client_CA_list(
10530 63 74 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b  ctx, certNames);
10540 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
10550 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10560 29 3b 0a 09 7d 0a 0a 23 65 6c 73 65 0a 09 2f 2a  );..}..#else../*
10570 20 53 65 74 20 64 69 72 65 63 74 6f 72 79 20 63   Set directory c
10580 6f 6e 74 61 69 6e 69 6e 67 20 43 41 20 63 65 72  ontaining CA cer
10590 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45 4d  tificates in PEM
105a0 20 66 6f 72 6d 61 74 2e 20 2a 2f 0a 09 69 66 20   format. */..if 
105b0 28 43 41 70 61 74 68 20 21 3d 20 4e 55 4c 4c 29  (CApath != NULL)
105c0 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c   {..    if (!SSL
105d0 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79  _CTX_load_verify
105e0 5f 64 69 72 28 63 74 78 2c 20 46 32 4e 28 43 41  _dir(ctx, F2N(CA
105f0 70 61 74 68 2c 20 26 64 73 29 29 29 20 7b 0a 09  path, &ds))) {..
10600 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d  .abort++;..    }
10610 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
10620 67 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 09  gFree(&ds);..}..
10630 0a 09 2f 2a 20 53 65 74 20 55 52 49 20 66 6f 72  ../* Set URI for
10640 20 74 6f 20 61 20 73 74 6f 72 65 2c 20 77 68 69   to a store, whi
10650 63 68 20 6d 61 79 20 62 65 20 61 20 73 69 6e 67  ch may be a sing
10660 6c 65 20 63 6f 6e 74 61 69 6e 65 72 20 6f 72 20  le container or 
10670 61 20 63 61 74 61 6c 6f 67 20 6f 66 20 63 6f 6e  a catalog of con
10680 74 61 69 6e 65 72 73 2e 20 2a 2f 0a 09 69 66 20  tainers. */..if 
10690 28 43 41 73 74 6f 72 65 20 21 3d 20 4e 55 4c 4c  (CAstore != NULL
106a0 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53 53  ) {..    if (!SS
106b0 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66  L_CTX_load_verif
106c0 79 5f 73 74 6f 72 65 28 63 74 78 2c 20 46 32 4e  y_store(ctx, F2N
106d0 28 43 41 73 74 6f 72 65 2c 20 26 64 73 29 29 29  (CAstore, &ds)))
106e0 20 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20   {...abort++;.. 
106f0 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53     }..    Tcl_DS
10700 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a  tringFree(&ds);.
10710 09 7d 0a 09 0a 09 2f 2a 20 53 65 74 20 66 69 6c  .}..../* Set fil
10720 65 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 63  e of CA certific
10730 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d  ates in PEM form
10740 61 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 66  at.  */..if (CAf
10750 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
10760 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
10770 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c  _load_verify_fil
10780 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  e(ctx, F2N(CAfil
10790 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  e, &ds))) {...ab
107a0 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
107b0 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
107c0 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f  ee(&ds);...    /
107d0 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41  * Set list of CA
107e0 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69  s to send to cli
107f0 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74  ent when request
10800 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72  ing a client cer
10810 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
10820 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
10830 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
10840 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
10850 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
10860 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
10870 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
10880 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
10890 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
108a0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
108b0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
108c0 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
108d0 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65  Free(&ds);..}.#e
108e0 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
108f0 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
10900 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10940 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
10950 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
10960 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
10970 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
10980 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a  peer info.. *. *
10990 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
109a0 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
109b0 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
109c0 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
109d0 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
109e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
109f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
10a20 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
10a30 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
10a40 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
10a50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10a60 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
10a70 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
10a80 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
10a90 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
10aa0 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
10ab0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
10ac0 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10ad0 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
10ae0 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
10af0 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
10b00 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
10b10 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
10b20 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
10b30 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  int len;.    int
10b40 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28   nid, res;.    (
10b50 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
10b60 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
10b70 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
10b80 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f  f (objc < 2 || o
10b90 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63  bjc > 3 || (objc
10ba0 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70   == 3 && !strcmp
10bb0 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
10bc0 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c  bjv[1]), "-local
10bd0 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  "))) {..Tcl_Wron
10be0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10bf0 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
10c00 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
10c10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10c20 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10c30 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a  Get channel Id *
10c40 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  /.    channelNam
10c50 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10c60 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20  g(objv[(objc == 
10c70 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20  2 ? 1 : 2)]);.  
10c80 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10c90 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
10ca0 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
10cb0 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
10cc0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
10cd0 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
10ce0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10cf0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
10d00 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
10d10 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
10d20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
10d30 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
10d40 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
10d50 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
10d60 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
10d70 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
10d80 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
10d90 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10da0 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
10db0 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
10dc0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
10dd0 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
10de0 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
10df0 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
10e00 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
10e10 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
10e20 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
10e30 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
10e40 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
10e50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10e60 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
10e70 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
10e80 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
10e90 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
10ea0 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
10eb0 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
10ec0 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
10ed0 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10ee0 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
10ef0 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
10f00 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10f10 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
10f20 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
10f30 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10f40 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
10f50 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
10f60 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
10f70 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
10f80 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
10f90 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
10fa0 72 70 2c 20 70 65 65 72 2c 20 31 29 3b 0a 09 69  rp, peer, 1);..i
10fb0 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a  f (objc == 2) {.
10fc0 09 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 70  .    X509_free(p
10fd0 65 65 72 29 3b 0a 09 20 20 20 20 70 65 65 72 20  eer);..    peer 
10fe0 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  = NULL;..}.    }
10ff0 20 65 6c 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20   else {..objPtr 
11000 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a  = Tcl_NewListObj
11010 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d  (0, NULL);.    }
11020 0a 0a 20 20 20 20 2f 2a 20 50 65 65 72 20 6e 61  ..    /* Peer na
11030 6d 65 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e  me */.    LAPPEN
11040 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11050 6a 50 74 72 2c 20 22 70 65 65 72 6e 61 6d 65 22  jPtr, "peername"
11060 2c 20 53 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e  , SSL_get0_peern
11070 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
11080 6c 29 2c 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50  l), -1);.    LAP
11090 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
110a0 20 6f 62 6a 50 74 72 2c 20 22 73 62 69 74 73 22   objPtr, "sbits"
110b0 2c 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  , SSL_get_cipher
110c0 5f 62 69 74 73 28 73 74 61 74 65 50 74 72 2d 3e  _bits(statePtr->
110d0 73 73 6c 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20  ssl, NULL));..  
110e0 20 20 63 69 70 68 65 72 73 20 3d 20 28 63 68 61    ciphers = (cha
110f0 72 2a 29 53 53 4c 5f 67 65 74 5f 63 69 70 68 65  r*)SSL_get_ciphe
11100 72 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  r(statePtr->ssl)
11110 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
11120 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11130 2c 20 22 63 69 70 68 65 72 22 2c 20 63 69 70 68  , "cipher", ciph
11140 65 72 73 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  ers, -1);..    /
11150 2a 20 56 65 72 69 66 79 20 74 68 65 20 58 35 30  * Verify the X50
11160 39 20 63 65 72 74 69 66 69 63 61 74 65 20 70 72  9 certificate pr
11170 65 73 65 6e 74 65 64 20 62 79 20 74 68 65 20 70  esented by the p
11180 65 65 72 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45  eer */.    LAPPE
11190 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
111a0 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 52 65  bjPtr, "verifyRe
111b0 73 75 6c 74 22 2c 0a 09 58 35 30 39 5f 76 65 72  sult",..X509_ver
111c0 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73  ify_cert_error_s
111d0 74 72 69 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65  tring(SSL_get_ve
111e0 72 69 66 79 5f 72 65 73 75 6c 74 28 73 74 61 74  rify_result(stat
111f0 65 50 74 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29  ePtr->ssl)), -1)
11200 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79  ;..    /* Verify
11210 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64   mode */.    mod
11220 65 20 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69  e = SSL_get_veri
11230 66 79 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72  fy_mode(statePtr
11240 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  ->ssl);.    if (
11250 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49  mode && SSL_VERI
11260 46 59 5f 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50  FY_NONE) {..LAPP
11270 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11280 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79 4d  objPtr, "verifyM
11290 6f 64 65 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31  ode", "none", -1
112a0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
112b0 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62  .Tcl_Obj *listOb
112c0 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
112d0 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
112e0 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53 4c  .if (mode && SSL
112f0 5f 56 45 52 49 46 59 5f 50 45 45 52 29 20 7b 0a  _VERIFY_PEER) {.
11300 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
11310 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
11320 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72  terp, listObjPtr
11330 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11340 62 6a 28 22 70 65 65 72 22 2c 20 2d 31 29 29 3b  bj("peer", -1));
11350 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26 26  ..}..if (mode &&
11360 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
11370 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
11380 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
11390 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
113a0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
113b0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
113c0 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20 69 66 20  ingObj("fail if 
113d0 6e 6f 20 70 65 65 72 20 63 65 72 74 22 2c 20 2d  no peer cert", -
113e0 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
113f0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
11400 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09  CLIENT_ONCE) {..
11410 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
11420 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
11430 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c  erp, listObjPtr,
11440 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11450 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c  j("client once",
11460 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d   -1));..}..if (m
11470 6f 64 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46  ode && SSL_VERIF
11480 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45  Y_POST_HANDSHAKE
11490 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
114a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
114b0 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
114c0 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
114d0 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e  ingObj("post han
114e0 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09  dshake", -1));..
114f0 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69  }..LAPPEND_OBJ(i
11500 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11510 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73  verifyMode", lis
11520 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a  tObjPtr).    }..
11530 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
11540 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20 20  de depth */.    
11550 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
11560 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
11570 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f 67  ifyDepth", SSL_g
11580 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68 28  et_verify_depth(
11590 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b  statePtr->ssl));
115a0 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74 20  ..    /* Report 
115b0 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72 6f  the selected pro
115c0 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75 6c  tocol as a resul
115d0 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69 61  t of the negotia
115e0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tion */.    SSL_
115f0 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74  get0_alpn_select
11600 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ed(statePtr->ssl
11610 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b  , &proto, &len);
11620 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
11630 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
11640 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a   "alpn", (char *
11650 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a  )proto, (Tcl_Siz
11660 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50  e) len);.    LAP
11670 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11680 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63   objPtr, "protoc
11690 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72  ol", SSL_get_ver
116a0 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e 73  sion(statePtr->s
116b0 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  sl), -1);..    /
116c0 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d  * Valid for non-
116d0 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61 6e  RSA signature an
116e0 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20  d TLS 1.3 */.   
116f0 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20   if (objc == 2) 
11700 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74  {..res = SSL_get
11710 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65 5f  _peer_signature_
11720 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
11730 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20  l, &nid);.    } 
11740 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53  else {..res = SS
11750 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f  L_get_signature_
11760 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  nid(statePtr->ss
11770 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a  l, &nid);.    }.
11780 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e      if (!res) {n
11790 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50  id = 0;}.    LAP
117a0 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
117b0 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74   objPtr, "signat
117c0 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68 6d  ureHashAlgorithm
117d0 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69  ", OBJ_nid2ln(ni
117e0 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a  d), -1);..    /*
117f0 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e 53 53   Added in OpenSS
11800 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20  L 1.1.1a */.#if 
11810 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
11820 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30 31  NUMBER > 0x10101
11830 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a  000L.    if (obj
11840 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d  c == 2) {..res =
11850 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69   SSL_get_peer_si
11860 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69 64  gnature_type_nid
11870 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11880 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
11890 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
118a0 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79 70  et_signature_typ
118b0 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e  e_nid(statePtr->
118c0 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20  ssl, &nid);.    
118d0 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20  }.    if (!res) 
118e0 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c  {nid = 0;}.    L
118f0 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
11900 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e  p, objPtr, "sign
11910 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f  atureType", OBJ_
11920 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29  nid2ln(nid), -1)
11930 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63  ;.#endif..    Tc
11940 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11950 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a  nterp, objPtr);.
11960 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
11970 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
11980 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
119b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
119c0 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e   *. * Connection
119d0 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65  InfoObjCmd -- re
119e0 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  turn connection 
119f0 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53  info from OpenSS
11a00 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  L.. *. * Results
11a10 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20 63  :. *.A list of c
11a20 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20  onnection info. 
11a30 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a70 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
11a80 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74  atic int Connect
11a90 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c  ionInfoObjCmd(Cl
11aa0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
11ab0 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
11ac0 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
11ad0 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
11ae0 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
11af0 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
11b00 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65  ;../* The channe
11b10 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20  l to set a mode 
11b20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  on */.    State 
11b30 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63  *statePtr;../* c
11b40 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20  lient state for 
11b50 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20  ssl socket */.  
11b60 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
11b70 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20  r, *listPtr;.   
11b80 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b   const SSL *ssl;
11b90 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43  .    const SSL_C
11ba0 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a 20  IPHER *cipher;. 
11bb0 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53     const SSL_SES
11bc0 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20  SION *session;. 
11bd0 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20     const EVP_MD 
11be0 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  *md;.    (void) 
11bf0 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
11c00 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
11c10 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
11c20 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
11c30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11c40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
11c50 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
11c60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
11c70 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63  }..    chan = Tc
11c80 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74  l_GetChannel(int
11c90 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
11ca0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c  ng(objv[1]), NUL
11cb0 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e  L);.    if (chan
11cc0 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c   == (Tcl_Channel
11cd0 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  ) NULL) {..retur
11ce0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11cf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20   }..    /* Make 
11d00 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
11d10 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
11d20 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68  hannel */.    ch
11d30 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43  an = Tcl_GetTopC
11d40 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20  hannel(chan);.  
11d50 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61    if (Tcl_GetCha
11d60 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21  nnelType(chan) !
11d70 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79 70  = Tls_ChannelTyp
11d80 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  e()) {..Tcl_Appe
11d90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11da0 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
11db0 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
11dc0 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20  lName(chan),..  
11dd0 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53    "\": not a TLS
11de0 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72   channel", (char
11df0 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f   *) NULL);..Tcl_
11e00 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
11e10 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f 4e  erp, "TLS", "CON
11e20 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e 4e  NECTION", "CHANN
11e30 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
11e40 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11e50 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
11e60 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f 62  R;.    }..    ob
11e70 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69  jPtr = Tcl_NewLi
11e80 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a  stObj(0, NULL);.
11e90 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69  .    /* Connecti
11ea0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
11eb0 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74 65  tatePtr = (State
11ec0 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
11ed0 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
11ee0 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20 73  an);.    ssl = s
11ef0 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20 20  tatePtr->ssl;.  
11f00 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55 4c    if (ssl != NUL
11f10 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69  L) {..const unsi
11f20 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74 6f  gned char *proto
11f30 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ;..unsigned int 
11f40 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 74 69  ulen;.../* Initi
11f50 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 73 68  alization finish
11f60 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  ed */..LAPPEND_B
11f70 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
11f80 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 73 68  tr, "init_finish
11f90 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e 69 74  ed", SSL_is_init
11fa0 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 29 3b  _finished(ssl));
11fb0 0a 09 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f  ..../* connectio
11fc0 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50  n state */..LAPP
11fd0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11fe0 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c  objPtr, "state",
11ff0 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
12000 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
12010 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
12020 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
12030 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
12040 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12050 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  Ptr, "servername
12060 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  ", SSL_get_serve
12070 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
12080 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
12090 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  name), -1);.../*
120a0 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
120b0 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
120c0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
120d0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
120e0 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  .SSL_get0_alpn_s
120f0 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
12100 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
12110 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
12120 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12130 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
12140 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f  r *)proto, (Tcl_
12150 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
12160 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  * Get protocol *
12170 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
12180 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12190 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67  protocol", SSL_g
121a0 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c  et_version(ssl),
121b0 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67   -1);.../* Reneg
121c0 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64  otiation allowed
121d0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
121e0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
121f0 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e  , "renegotiation
12200 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67  _allowed", SSL_g
12210 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f  et_secure_renego
12220 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28  tiation_support(
12230 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a  (SSL *) ssl));..
12240 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79  ./* Get security
12250 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45   level */..LAPPE
12260 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12270 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79  bjPtr, "security
12280 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74  _level", SSL_get
12290 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
122a0 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ssl));.../* Sess
122b0 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ion info */..LAP
122c0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
122d0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
122e0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f  on_reused", SSL_
122f0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73  session_reused(s
12300 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65  sl));.../* Is se
12310 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  rver info */..LA
12320 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12330 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73  p, objPtr, "is_s
12340 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73  erver", SSL_is_s
12350 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f  erver(ssl));.../
12360 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41  * Is DTLS */..LA
12370 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12380 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64  p, objPtr, "is_d
12390 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c  tls", SSL_is_dtl
123a0 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 4f 50  s(ssl));..#if OP
123b0 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
123c0 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 30 30 30  MBER >= 0x302000
123d0 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 43 20  00L../* Is QUIC 
123e0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
123f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12400 20 22 69 73 5f 71 75 69 63 22 2c 20 53 53 4c 5f   "is_quic", SSL_
12410 69 73 5f 71 75 69 63 28 73 73 6c 29 29 3b 0a 0a  is_quic(ssl));..
12420 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a 09 4c  ./* Is TLS */..L
12430 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12440 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
12450 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 6c 73  tls", SSL_is_tls
12460 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  (ssl));.#endif..
12470 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 75 74  ./* DANE TLS aut
12480 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  hentication */..
12490 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
124a0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 61  erp, objPtr, "da
124b0 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f 67 65  ne_auth", SSL_ge
124c0 74 30 5f 64 61 6e 65 28 28 53 53 4c 20 2a 29 73  t0_dane((SSL *)s
124d0 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09  sl) != NULL);...
124e0 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61  /* Waiting for a
124f0 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  sync */..LAPPEND
12500 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
12510 6a 50 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66  jPtr, "waiting_f
12520 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77  or_async", SSL_w
12530 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63  aiting_for_async
12540 28 28 53 53 4c 20 2a 29 73 73 6c 29 29 3b 0a 0a  ((SSL *)ssl));..
12550 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 2a 2f 0a  ./* Time-out */.
12560 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
12570 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
12580 69 6d 65 2d 6f 75 74 22 2c 20 53 53 4c 5f 67 65  ime-out", SSL_ge
12590 74 5f 64 65 66 61 75 6c 74 5f 74 69 6d 65 6f 75  t_default_timeou
125a0 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  t(ssl));.../* Is
125b0 20 43 65 72 74 69 66 69 63 61 74 65 20 54 72 61   Certificate Tra
125c0 6e 73 70 61 72 65 6e 63 79 20 76 61 6c 69 64 61  nsparency valida
125d0 74 69 6f 6e 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  tion enabled */.
125e0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
125f0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12600 74 5f 65 6e 61 62 6c 65 64 22 2c 20 53 53 4c 5f  t_enabled", SSL_
12610 63 74 5f 69 73 5f 65 6e 61 62 6c 65 64 28 73 73  ct_is_enabled(ss
12620 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
12630 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
12640 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
12650 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
12660 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
12670 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
12680 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
12690 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
126a0 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
126b0 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
126c0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
126d0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
126e0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
126f0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
12700 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
12710 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
12720 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
12730 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12740 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
12750 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
12760 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
12770 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
12780 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
12790 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
127a0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
127b0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
127c0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
127d0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
127e0 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
127f0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
12800 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
12810 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
12820 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
12830 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
12840 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
12850 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
12860 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
12870 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12880 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
12890 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
128a0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
128b0 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
128c0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
128d0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
128e0 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
128f0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
12900 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
12910 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
12920 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
12930 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
12940 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
12950 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
12960 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
12970 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
12980 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
12990 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
129a0 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
129b0 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
129c0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
129d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
129e0 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
129f0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
12a00 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
12a10 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
12a20 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
12a30 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12a40 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
12a50 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
12a60 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
12a70 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
12a80 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12a90 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12aa0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12ab0 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
12ac0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
12ad0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
12ae0 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
12af0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
12b00 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12b10 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
12b20 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
12b30 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
12b40 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
12b50 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12b60 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12b70 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
12b80 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
12b90 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12ba0 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12bb0 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
12bc0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
12bd0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
12be0 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
12bf0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
12c00 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
12c10 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
12c20 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
12c30 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
12c40 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
12c50 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
12c60 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
12c70 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
12c80 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
12c90 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
12ca0 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
12cb0 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
12cc0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
12cd0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
12ce0 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
12cf0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
12d00 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
12d10 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
12d20 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
12d30 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12d40 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
12d50 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
12d60 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
12d70 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
12d80 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
12d90 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
12da0 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
12db0 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12dc0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
12dd0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
12de0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
12df0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
12e00 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
12e10 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
12e20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
12e30 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
12e40 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12e50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
12e60 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
12e70 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
12e80 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
12e90 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
12ea0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
12eb0 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
12ec0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
12ed0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
12ee0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
12ef0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
12f00 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12f10 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
12f20 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
12f30 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
12f40 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
12f50 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
12f60 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
12f70 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
12f80 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
12f90 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
12fa0 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
12fb0 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
12fc0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
12fd0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
12fe0 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
12ff0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e  _id, *proto;..un
13000 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66  signed char buff
13010 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
13020 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
13030 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
13040 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
13050 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13060 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
13070 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
13080 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
13090 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
130a0 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
130b0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
130c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
130d0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  lpn", (char *) p
130e0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
130f0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70   len2);.../* Rep
13100 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
13110 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
13120 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
13130 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
13140 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
13150 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
13160 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
13170 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
13180 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
13190 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
131a0 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29   "npn", (char *)
131b0 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
131c0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66  e) ulen);.#endif
131d0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20  .../* Resumable 
131e0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  session */..LAPP
131f0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
13200 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61   objPtr, "resuma
13210 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ble", SSL_SESSIO
13220 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
13230 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
13240 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
13250 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
13260 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50   epoch) */..LAPP
13270 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
13280 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f   objPtr, "start_
13290 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
132a0 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73  ON_get_time(sess
132b0 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  ion));.../* Time
132c0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
132d0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
132e0 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
132f0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
13300 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
13310 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53  imeout", SSL_SES
13320 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
13330 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
13340 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c   Session id - TL
13350 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20  Sv1.2 and below 
13360 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  only */..session
13370 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
13380 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
13390 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
133a0 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
133b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
133c0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
133d0 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
133e0 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  len);.../* Sessi
133f0 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  on context */..s
13400 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
13410 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f  SESSION_get0_id_
13420 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c  context(session,
13430 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
13440 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
13450 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
13460 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73  n_context", sess
13470 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
13480 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
13490 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20  ession ticket - 
134a0 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09  client only */..
134b0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
134c0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
134d0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
134e0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
134f0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
13500 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65  , "session_ticke
13510 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  t", ticket, (Tcl
13520 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
13530 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
13540 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20  t lifetime hint 
13550 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
13560 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
13570 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c  terp, objPtr, "l
13580 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  ifetime", SSL_SE
13590 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74  SSION_get_ticket
135a0 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73  _lifetime_hint(s
135b0 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
135c0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
135d0 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
135e0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
135f0 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f  x30000000L..SSL_
13600 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
13610 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c  ket_appdata((SSL
13620 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73  _SESSION *) sess
13630 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
13640 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
13650 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
13660 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70  jPtr, "ticket_ap
13670 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c  p_data", ticket,
13680 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
13690 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47  );.#endif.../* G
136a0 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f  et master key */
136b0 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53  ..len2 = SSL_SES
136c0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f  SION_get_master_
136d0 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66  key(session, buf
136e0 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53  fer, SSL_MAX_MAS
136f0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b  TER_KEY_LENGTH);
13700 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
13710 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13720 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62   "master_key", b
13730 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65  uffer, (Tcl_Size
13740 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f  ) len2);.../* Co
13750 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  mpression id */.
13760 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
13770 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
13780 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73  et_compress_id(s
13790 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e  ession);..LAPPEN
137a0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
137b0 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
137c0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20  on_id", id == 1 
137d0 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65  ? "zlib" : "none
137e0 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ", -1);.    }.. 
137f0 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
13800 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
13810 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
13820 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
13830 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
13840 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
13850 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
13860 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
13870 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
13880 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
13890 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
138a0 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
138b0 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
138c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
138d0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d  ompression", com
138e0 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  p ? SSL_COMP_get
138f0 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e  _name(comp) : "n
13900 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
13910 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13920 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
13930 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f  on", expn ? SSL_
13940 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78  COMP_get_name(ex
13950 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  pn) : "none", -1
13960 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e  );.#else..LAPPEN
13970 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13980 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
13990 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
139a0 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
139b0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
139c0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e  expansion", "non
139d0 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  e", -1);.#endif.
139e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
139f0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
13a00 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20   {..long mode = 
13a10 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73  SSL_CTX_get_sess
13a20 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
13a30 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
13a40 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20  char *msg;...if 
13a50 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
13a60 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20  _CACHE_OFF) {.. 
13a70 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a     msg = "off";.
13a80 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
13a90 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
13aa0 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20  E_CLIENT) {..   
13ab0 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b   msg = "client";
13ac0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
13ad0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
13ae0 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20  HE_SERVER) {..  
13af0 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22    msg = "server"
13b00 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
13b10 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
13b20 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20  CHE_BOTH) {..   
13b30 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09   msg = "both";..
13b40 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73  } else {..    ms
13b50 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09  g = "unknown";..
13b60 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  }..LAPPEND_STR(i
13b70 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13b80 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
13b90 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  de", msg, -1);. 
13ba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20     }..    /* CA 
13bb0 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  List */.    /* I
13bc0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20  F not a server, 
13bd0 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30  same as SSL_get0
13be0 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49  _peer_CA_list. I
13bf0 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73  f server same as
13c00 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69   SSL_CTX_get_cli
13c10 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20  ent_CA_list */. 
13c20 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c     listPtr = Tcl
13c30 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
13c40 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f  ULL);.    STACK_
13c50 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
13c60 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28  a_list;.    if (
13c70 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67  (ca_list = SSL_g
13c80 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
13c90 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29  t(ssl)) != NULL)
13ca0 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b   {..char buffer[
13cb0 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69  BUFSIZ];..for (i
13cc0 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
13cd0 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63  _X509_NAME_num(c
13ce0 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a  a_list); i++) {.
13cf0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
13d00 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e  name = sk_X509_N
13d10 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73  AME_value(ca_lis
13d20 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28  t, i);..    if (
13d30 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e  name) {...X509_N
13d40 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65  AME_oneline(name
13d50 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
13d60 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  );...Tcl_ListObj
13d70 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13d80 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
13d90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13da0 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20  buffer, -1));.. 
13db0 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
13dc0 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
13dd0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
13de0 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29  aList", listPtr)
13df0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
13e00 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
13e10 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c  , "caListCount",
13e20 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
13e30 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20  m(ca_list));..  
13e40 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13e50 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
13e60 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
13e70 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
13e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13eb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13ec0 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f  ---. *. * Versio
13ed0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  nObjCmd -- retur
13ee0 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  n version string
13ef0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
13f00 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
13f10 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
13f20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
13f30 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
13f40 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
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 2d 2d 2d 2d 2d 2d  ----------------
13f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13f90 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
13fa0 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  sionObjCmd(Clien
13fb0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
13fc0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
13fd0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
13fe0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
13ff0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
14000 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
14010 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
14020 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  ata;.    (void) 
14030 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29  objc;.    (void)
14040 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69   objv;..    dpri
14050 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
14060 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
14070 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50  _NewStringObj(OP
14080 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45  ENSSL_VERSION_TE
14090 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c  XT, -1);.    Tcl
140a0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
140b0 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a  terp, objPtr);..
140c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
140d0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
140e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
140f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14110 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14120 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64   *. * MiscObjCmd
14130 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64   -- misc command
14140 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
14150 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
14160 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
14170 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14180 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141d0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
141e0 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  MiscObjCmd(Clien
141f0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
14200 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
14210 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
14220 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
14230 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61  bjv[]) {.    sta
14240 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
14250 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20  commands [] = { 
14260 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c  "req", "strreq",
14270 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75   NULL };.    enu
14280 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45  m command { C_RE
14290 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44  Q, C_STRREQ, C_D
142a0 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f  UMMY };.    Tcl_
142b0 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e  Size cmd;.    in
142c0 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  t isStr;.    cha
142d0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
142e0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
142f0 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
14300 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
14310 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
14320 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
14330 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
14340 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
14350 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
14360 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14370 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
14380 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
14390 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
143a0 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
143b0 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
143c0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
143d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
143e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
143f0 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
14400 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
14410 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
14420 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
14430 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
14440 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
14450 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
14460 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
14470 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
14480 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
14490 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
144a0 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
144b0 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
144c0 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  ;..    Tcl_Size 
144d0 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20  listc;..    int 
144e0 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
144f0 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68  t=NULL;...    ch
14500 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54  ar *k_C="",*k_ST
14510 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f  ="",*k_L="",*k_O
14520 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f  ="",*k_OU="",*k_
14530 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22  CN="",*k_Email="
14540 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65  ";..    char *ke
14550 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74  yout,*pemout,*st
14560 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73  r;..    int keys
14570 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79  ize,serial=0,day
14580 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e  s=365;..#if OPEN
14590 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
145a0 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
145b0 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e  ..    BIGNUM *bn
145c0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52  e = NULL;..    R
145d0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a  SA *rsa = NULL;.
145e0 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50  #else..    EVP_P
145f0 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  KEY_CTX *ctx = N
14600 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20  ULL;.#endif...  
14610 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c    if ((objc<5) |
14620 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09  | (objc>6)) {...
14630 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14640 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
14650 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69  , "keysize keyfi
14660 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66  le certfile ?inf
14670 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  o?");...return T
14680 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
14690 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ...    if (Tcl_G
146a0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
146b0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b  erp, objv[2], &k
146c0 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f  eysize) != TCL_O
146d0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
146e0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
146f0 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f  .    keyout=Tcl_
14700 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
14710 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d  ]);..    pemout=
14720 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14730 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20  jv[4]);..    if 
14740 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f  (isStr) {...Tcl_
14750 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
14760 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63  yout,"",0);...Tc
14770 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
14780 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20  pemout,"",0);.. 
14790 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f     }...    if (o
147a0 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28  bjc>=6) {...if (
147b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
147c0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
147d0 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20  bjv[5], &listc, 
147e0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
147f0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
14800 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
14810 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
14820 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
14830 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14840 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
14850 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
14860 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
14870 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
14880 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
14890 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
148a0 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
148b0 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
148c0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
148d0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
148e0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
148f0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
14900 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
14910 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14920 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
14930 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
14940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14950 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
14960 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
14970 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
14980 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
14990 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
149a0 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
149b0 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
149c0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
149d0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
149e0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
149f0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
14a00 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
14a10 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
14a20 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
14a30 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
14a40 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
14a50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14a60 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14a70 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14a80 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
14a90 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
14aa0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14ab0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14ac0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14ad0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
14ae0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
14af0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
14b00 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
14b10 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
14b20 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
14b30 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
14b40 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
14b50 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
14b60 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
14b70 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
14b80 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
14b90 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
14ba0 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
14bb0 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
14bc0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
14bd0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14be0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14bf0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
14c00 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
14c10 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
14c20 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
14c30 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
14c40 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
14c50 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
14c60 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
14c70 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
14c80 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
14c90 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
14ca0 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
14cb0 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
14cc0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
14cd0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
14ce0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
14cf0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
14d00 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
14d10 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
14d20 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
14d30 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
14d40 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
14d50 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
14d60 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
14d70 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
14d80 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
14d90 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
14da0 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
14db0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
14dc0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
14dd0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
14de0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
14df0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
14e00 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
14e10 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
14e20 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
14e30 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
14e40 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
14e50 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
14e60 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
14e70 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
14e80 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
14e90 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
14ea0 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
14eb0 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
14ec0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
14ed0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
14ee0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
14ef0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
14f00 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
14f10 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
14f20 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
14f30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14f40 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
14f50 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
14f60 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
14f70 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
14f80 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
14f90 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
14fa0 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
14fb0 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
14fc0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
14fd0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
14fe0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
14ff0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
15000 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
15010 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
15020 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
15030 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
15040 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
15050 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
15060 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
15070 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
15080 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
15090 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
150a0 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
150b0 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
150c0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
150d0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
150e0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
150f0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
15100 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
15110 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
15120 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
15130 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
15140 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
15150 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
15160 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
15170 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
15180 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
15190 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
151a0 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
151b0 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
151c0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
151d0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
151e0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
151f0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
15200 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
15210 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
15220 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
15230 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
15240 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
15250 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65  }....X509_set_ve
15260 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09  rsion(cert,2);..
15270 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65  .ASN1_INTEGER_se
15280 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61  t(X509_get_seria
15290 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65  lNumber(cert),se
152a0 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d  rial);...X509_gm
152b0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
152c0 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72  tm_notBefore(cer
152d0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d  t),0);...X509_gm
152e0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
152f0 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74  tm_notAfter(cert
15300 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34  ),(long)60*60*24
15310 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73  *days);...X509_s
15320 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70  et_pubkey(cert,p
15330 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35  key);....name=X5
15340 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_get_subject_n
15350 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35  ame(cert);....X5
15360 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
15370 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
15380 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
15390 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
153a0 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31   char *) k_C, -1
153b0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
153c0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
153d0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22  by_txt(name,"ST"
153e0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
153f0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
15400 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31  char *) k_ST, -1
15410 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
15420 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
15430 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c  by_txt(name,"L",
15440 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
15450 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
15460 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20  har *) k_L, -1, 
15470 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
15480 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
15490 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d  _txt(name,"O", M
154a0 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
154b0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
154c0 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31  r *) k_O, -1, -1
154d0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
154e0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
154f0 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42  xt(name,"OU", MB
15500 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
15510 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15520 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31   *) k_OU, -1, -1
15530 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
15540 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
15550 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42  xt(name,"CN", MB
15560 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
15570 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15580 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31   *) k_CN, -1, -1
15590 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
155a0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
155b0 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c  xt(name,"Email",
155c0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
155d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
155e0 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20  har *) k_Email, 
155f0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58  -1, -1, 0);....X
15600 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f  509_set_subject_
15610 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b  name(cert,name);
15620 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69  ....if (!X509_si
15630 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50  gn(cert,pkey,EVP
15640 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09  _sha256())) {...
15650 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65      X509_free(ce
15660 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  rt);...    EVP_P
15670 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
15680 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
15690 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
156a0 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
156b0 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
156c0 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  dif...    Tcl_Se
156d0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
156e0 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65  Error signing ce
156f0 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29  rtificate",NULL)
15700 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
15710 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
15720 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09  .if (isStr) {...
15730 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
15740 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09  BIO_s_mem());...
15750 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
15760 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
15770 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
15780 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
15790 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
157a0 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
157b0 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
157c0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
157d0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
157e0 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66  nterp,pemout,buf
157f0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
15800 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
15810 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
15820 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
15830 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
15840 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
15850 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
15860 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f  ilename(out,pemo
15870 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
15880 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
15890 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42  t,cert);...    B
158a0 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
158b0 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72  ;...}....X509_fr
158c0 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f  ee(cert);...EVP_
158d0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
158e0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
158f0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
15900 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66  30000000L...BN_f
15910 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
15920 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
15930 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
15940 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20  .break;.    }.  
15950 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15960 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
15980 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
15990 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
159b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
159f0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
15a00 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
15a10 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
15a20 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
15a30 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
15a40 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
15a50 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
15a60 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
15a70 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
15a80 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
15a90 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
15aa0 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
15ab0 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15b00 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
15b10 46 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79  Free(tls_free_ty
15b20 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a  pe *blockPtr) {.
15b30 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
15b40 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62  Ptr = (State *)b
15b50 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70  lockPtr;..    dp
15b60 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
15b70 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28  ..    Tls_Clean(
15b80 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63  statePtr);.    c
15b90 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b  kfree(blockPtr);
15ba0 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
15bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15bd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15bf0 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d  . * Tls_Clean --
15c00 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
15c10 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
15c20 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
15c30 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
15c40 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
15c50 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
15c60 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
15c70 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64   1.  This should
15c80 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79  . *.be called sy
15c90 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74  nchronously by t
15ca0 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f  he CloseProc, no
15cb0 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e  t in the. *.Even
15cc0 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62  tuallyFree callb
15cd0 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ack.. *. * Resul
15ce0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
15cf0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
15d00 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65   *.Frees all the
15d10 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d   state. *. *----
15d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15d60 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65   */.void Tls_Cle
15d70 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  an(State *stateP
15d80 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  tr) {.    dprint
15d90 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
15da0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
15db0 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 65 6e 64 20  ssl) {../* Send 
15dc0 63 6c 6f 73 65 5f 6e 6f 74 69 66 79 20 6d 65 73  close_notify mes
15dd0 73 61 67 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66  sage */..dprintf
15de0 28 22 53 53 4c 5f 73 68 75 74 64 6f 77 6e 28 25  ("SSL_shutdown(%
15df0 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  p)", statePtr->s
15e00 73 6c 29 3b 0a 09 2f 2a 20 57 69 6c 6c 20 72 65  sl);../* Will re
15e10 74 75 72 6e 20 72 65 74 75 72 6e 20 30 20 77 68  turn return 0 wh
15e20 69 6c 65 20 73 68 75 74 64 6f 77 6e 20 69 6e 20  ile shutdown in 
15e30 70 72 6f 63 65 73 73 2c 20 74 68 65 6e 20 31 20  process, then 1 
15e40 77 68 65 6e 20 63 6f 6d 70 6c 65 74 65 20 2a 2f  when complete */
15e50 0a 09 2f 2a 20 63 6c 6f 73 65 73 20 74 68 65 20  ../* closes the 
15e60 77 72 69 74 65 20 64 69 72 65 63 74 69 6f 6e 20  write direction 
15e70 6f 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  of the connectio
15e80 6e 3b 20 74 68 65 20 72 65 61 64 20 64 69 72 65  n; the read dire
15e90 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 20  ction is closed 
15ea0 62 79 20 74 68 65 20 70 65 65 72 2e 20 2a 2f 0a  by the peer. */.
15eb0 09 2f 2a 20 44 6f 65 73 20 6e 6f 74 20 61 66 66  ./* Does not aff
15ec0 65 63 74 20 73 6f 63 6b 65 74 20 2a 2f 0a 09 53  ect socket */..S
15ed0 53 4c 5f 73 68 75 74 64 6f 77 6e 28 73 74 61 74  SL_shutdown(stat
15ee0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
15ef0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
15f00 20 77 65 27 72 65 20 61 73 73 75 6d 69 6e 67 20   we're assuming 
15f10 68 65 72 65 20 74 68 61 74 20 77 65 27 72 65 20  here that we're 
15f20 73 69 6e 67 6c 65 2d 74 68 72 65 61 64 65 64 0a  single-threaded.
15f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 20 28       */.    if (
15f40 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20  statePtr->timer 
15f50 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b  != (Tcl_TimerTok
15f60 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c  en) NULL) {..Tcl
15f70 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64  _DeleteTimerHand
15f80 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69  ler(statePtr->ti
15f90 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  mer);..statePtr-
15fa0 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20  >timer = NULL;. 
15fb0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6d     }..    /* Rem
15fc0 6f 76 65 20 63 61 6c 6c 62 61 63 6b 73 20 2a 2f  ove callbacks */
15fd0 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
15fe0 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 20 7b 0a 09  r->callback) {..
15ff0 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
16000 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
16010 61 63 6b 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ack);..statePtr-
16020 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 4e 55 4c 4c  >callback = NULL
16030 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
16040 73 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f  statePtr->passwo
16050 72 64 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  rd) {..Tcl_DecrR
16060 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
16070 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 09 73 74  ->password);..st
16080 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
16090 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
160a0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
160b0 3e 76 63 6d 64 29 20 7b 0a 09 54 63 6c 5f 44 65  >vcmd) {..Tcl_De
160c0 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65  crRefCount(state
160d0 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 73 74 61  Ptr->vcmd);..sta
160e0 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 4e 55  tePtr->vcmd = NU
160f0 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  LL;.    }..    i
16100 66 20 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  f (statePtr->pro
16110 74 6f 73 29 20 7b 0a 09 63 6b 66 72 65 65 28 73  tos) {..ckfree(s
16120 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29  tatePtr->protos)
16130 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  ;..statePtr->pro
16140 74 6f 73 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  tos = NULL;.    
16150 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  }..    if (state
16160 50 74 72 2d 3e 62 69 6f 29 20 7b 0a 09 2f 2a 20  Ptr->bio) {../* 
16170 54 68 69 73 20 77 69 6c 6c 20 63 61 6c 6c 20 53  This will call S
16180 53 4c 5f 73 68 75 74 64 6f 77 6e 2e 20 42 75 67  SL_shutdown. Bug
16190 20 31 34 31 34 30 34 35 20 2a 2f 0a 09 64 70 72   1414045 */..dpr
161a0 69 6e 74 66 28 22 42 49 4f 5f 66 72 65 65 5f 61  intf("BIO_free_a
161b0 6c 6c 28 25 70 29 22 2c 20 73 74 61 74 65 50 74  ll(%p)", statePt
161c0 72 2d 3e 62 69 6f 29 3b 0a 09 42 49 4f 5f 66 72  r->bio);..BIO_fr
161d0 65 65 5f 61 6c 6c 28 73 74 61 74 65 50 74 72 2d  ee_all(statePtr-
161e0 3e 62 69 6f 29 3b 0a 09 73 74 61 74 65 50 74 72  >bio);..statePtr
161f0 2d 3e 62 69 6f 20 3d 20 4e 55 4c 4c 3b 0a 20 20  ->bio = NULL;.  
16200 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
16210 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 64  tePtr->ssl) {..d
16220 70 72 69 6e 74 66 28 22 53 53 4c 5f 66 72 65 65  printf("SSL_free
16230 28 25 70 29 22 2c 20 73 74 61 74 65 50 74 72 2d  (%p)", statePtr-
16240 3e 73 73 6c 29 3b 0a 09 53 53 4c 5f 66 72 65 65  >ssl);..SSL_free
16250 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
16260 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 20  ..statePtr->ssl 
16270 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
16280 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
16290 3e 63 74 78 29 20 7b 0a 09 53 53 4c 5f 43 54 58  >ctx) {..SSL_CTX
162a0 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  _free(statePtr->
162b0 63 74 78 29 3b 0a 09 73 74 61 74 65 50 74 72 2d  ctx);..statePtr-
162c0 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  >ctx = NULL;.   
162d0 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28   }..    dprintf(
162e0 22 52 65 74 75 72 6e 69 6e 67 22 29 3b 0a 7d 0a  "Returning");.}.
162f0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
16300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
16340 0a 20 2a 20 42 75 69 6c 64 20 49 6e 66 6f 20 43  . * Build Info C
16350 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ommand --. *. *.
16360 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
16370 6f 20 72 65 74 75 72 6e 20 62 75 69 6c 64 20 69  o return build i
16380 6e 66 6f 20 66 6f 72 20 70 61 63 6b 61 67 65 2e  nfo for package.
16390 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
163a0 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
163b0 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53  l result. *. * S
163c0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
163d0 43 72 65 61 74 65 64 20 62 75 69 6c 64 2d 69 6e  Created build-in
163e0 66 6f 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20  fo command.. *. 
163f0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
16400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16430 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66  -------. */..#if
16440 6e 64 65 66 20 53 54 52 49 4e 47 49 46 59 0a 23  ndef STRINGIFY.#
16450 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49    define STRINGI
16460 46 59 28 78 29 20 53 54 52 49 4e 47 49 46 59 31  FY(x) STRINGIFY1
16470 28 78 29 0a 23 20 20 64 65 66 69 6e 65 20 53 54  (x).#  define ST
16480 52 49 4e 47 49 46 59 31 28 78 29 20 23 78 0a 23  RINGIFY1(x) #x.#
16490 65 6e 64 69 66 0a 0a 69 6e 74 0a 42 75 69 6c 64  endif..int.Build
164a0 49 6e 66 6f 43 6f 6d 6d 61 6e 64 28 54 63 6c 5f  InfoCommand(Tcl_
164b0 49 6e 74 65 72 70 2a 20 69 6e 74 65 72 70 29 20  Interp* interp) 
164c0 7b 0a 20 20 20 20 54 63 6c 5f 43 6d 64 49 6e 66  {.    Tcl_CmdInf
164d0 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20 69 66 20  o info;..    if 
164e0 28 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49  (Tcl_GetCommandI
164f0 6e 66 6f 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  nfo(interp, "::t
16500 63 6c 3a 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c  cl::build-info",
16510 20 26 69 6e 66 6f 29 29 20 7b 0a 09 54 63 6c 5f   &info)) {..Tcl_
16520 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
16530 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
16540 3a 62 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 69 6e  :build-info", in
16550 66 6f 2e 6f 62 6a 50 72 6f 63 2c 20 28 76 6f 69  fo.objProc, (voi
16560 64 20 2a 29 28 0a 09 09 50 41 43 4b 41 47 45 5f  d *)(...PACKAGE_
16570 56 45 52 53 49 4f 4e 20 22 2b 22 20 53 54 52 49  VERSION "+" STRI
16580 4e 47 49 46 59 28 54 4c 53 5f 56 45 52 53 49 4f  NGIFY(TLS_VERSIO
16590 4e 5f 55 55 49 44 29 0a 23 69 66 20 64 65 66 69  N_UUID).#if defi
165a0 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26  ned(__clang__) &
165b0 26 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e  & defined(__clan
165c0 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 09 09 09 20 20  g_major__)....  
165d0 20 20 22 2e 63 6c 61 6e 67 2d 22 20 53 54 52 49    ".clang-" STRI
165e0 4e 47 49 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 61  NGIFY(__clang_ma
165f0 6a 6f 72 5f 5f 29 0a 23 69 66 20 5f 5f 63 6c 61  jor__).#if __cla
16600 6e 67 5f 6d 69 6e 6f 72 5f 5f 20 3c 20 31 30 0a  ng_minor__ < 10.
16610 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64 69  ...    "0".#endi
16620 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47 49  f....    STRINGI
16630 46 59 28 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72  FY(__clang_minor
16640 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  __).#endif.#if d
16650 65 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c  efined(__cpluspl
16660 75 73 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  us) && !defined(
16670 5f 5f 4f 42 4a 43 5f 5f 29 0a 09 09 09 20 20 20  __OBJC__)....   
16680 20 22 2e 63 70 6c 75 73 70 6c 75 73 22 0a 23 65   ".cplusplus".#e
16690 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45  ndif.#ifndef NDE
166a0 42 55 47 0a 09 09 09 20 20 20 20 22 2e 64 65 62  BUG....    ".deb
166b0 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  ug".#endif.#if !
166c0 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f  defined(__clang_
166d0 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
166e0 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29  _INTEL_COMPILER)
166f0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 47 4e   && defined(__GN
16700 55 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 67  UC__)....    ".g
16710 63 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  cc-" STRINGIFY(_
16720 5f 47 4e 55 43 5f 5f 29 0a 23 69 66 20 5f 5f 47  _GNUC__).#if __G
16730 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 20 3c 20 31 30  NUC_MINOR__ < 10
16740 0a 09 09 09 20 20 20 20 22 30 22 0a 23 65 6e 64  ....    "0".#end
16750 69 66 0a 09 09 09 20 20 20 20 53 54 52 49 4e 47  if....    STRING
16760 49 46 59 28 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52  IFY(__GNUC_MINOR
16770 5f 5f 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  __).#endif.#ifde
16780 66 20 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49 4c  f __INTEL_COMPIL
16790 45 52 0a 09 09 09 20 20 20 20 22 2e 69 63 63 2d  ER....    ".icc-
167a0 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 49 4e  " STRINGIFY(__IN
167b0 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 29 0a 23 65  TEL_COMPILER).#e
167c0 6e 64 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f  ndif.#ifdef TCL_
167d0 4d 45 4d 5f 44 45 42 55 47 0a 09 09 09 20 20 20  MEM_DEBUG....   
167e0 20 22 2e 6d 65 6d 64 65 62 75 67 22 0a 23 65 6e   ".memdebug".#en
167f0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
16800 5f 4d 53 43 5f 56 45 52 29 0a 09 09 09 20 20 20  _MSC_VER)....   
16810 20 22 2e 6d 73 76 63 2d 22 20 53 54 52 49 4e 47   ".msvc-" STRING
16820 49 46 59 28 5f 4d 53 43 5f 56 45 52 29 0a 23 65  IFY(_MSC_VER).#e
16830 6e 64 69 66 0a 23 69 66 64 65 66 20 55 53 45 5f  ndif.#ifdef USE_
16840 4e 4d 41 4b 45 0a 09 09 09 20 20 20 20 22 2e 6e  NMAKE....    ".n
16850 6d 61 6b 65 22 0a 23 65 6e 64 69 66 0a 23 69 66  make".#endif.#if
16860 6e 64 65 66 20 54 43 4c 5f 43 46 47 5f 4f 50 54  ndef TCL_CFG_OPT
16870 49 4d 49 5a 45 44 0a 09 09 09 20 20 20 20 22 2e  IMIZED....    ".
16880 6e 6f 2d 6f 70 74 69 6d 69 7a 65 22 0a 23 65 6e  no-optimize".#en
16890 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 4f 42 4a  dif.#ifdef __OBJ
168a0 43 5f 5f 0a 09 09 09 20 20 20 20 22 2e 6f 62 6a  C__....    ".obj
168b0 65 63 74 69 76 65 2d 63 22 0a 23 69 66 20 64 65  ective-c".#if de
168c0 66 69 6e 65 64 28 5f 5f 63 70 6c 75 73 70 6c 75  fined(__cplusplu
168d0 73 29 0a 09 09 09 20 20 20 20 22 70 6c 75 73 70  s)....    "plusp
168e0 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 65 6e 64  lus".#endif.#end
168f0 69 66 0a 23 69 66 64 65 66 20 54 43 4c 5f 43 46  if.#ifdef TCL_CF
16900 47 5f 50 52 4f 46 49 4c 45 44 0a 09 09 09 20 20  G_PROFILED....  
16910 20 20 22 2e 70 72 6f 66 69 6c 65 22 0a 23 65 6e    ".profile".#en
16920 64 69 66 0a 23 69 66 64 65 66 20 50 55 52 49 46  dif.#ifdef PURIF
16930 59 0a 09 09 09 20 20 20 20 22 2e 70 75 72 69 66  Y....    ".purif
16940 79 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  y".#endif.#ifdef
16950 20 53 54 41 54 49 43 5f 42 55 49 4c 44 0a 09 09   STATIC_BUILD...
16960 09 20 20 20 20 22 2e 73 74 61 74 69 63 22 0a 23  .    ".static".#
16970 65 6e 64 69 66 0a 09 09 29 2c 20 4e 55 4c 4c 29  endif...), NULL)
16980 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
16990 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
169a0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
169b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
169e0 2a 20 54 6c 73 4c 69 62 53 68 75 74 64 6f 77 6e  * TlsLibShutdown
169f0 20 2d 2d 0a 20 2a 0a 20 2a 09 53 68 75 74 64 6f   --. *. *.Shutdo
16a00 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f  wn SSL library o
16a10 6e 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74  nce per applicat
16a20 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  ion. *. * Result
16a30 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
16a40 20 54 43 4c 20 72 65 73 75 6c 74 0a 20 2a 0a 20   TCL result. *. 
16a50 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
16a60 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20   *.Shutdown SSL 
16a70 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d  library. *. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ab0 2d 2d 2d 2a 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c  ---*. */.void Tl
16ac0 73 4c 69 62 53 68 75 74 64 6f 77 6e 28 43 6c 69  sLibShutdown(Cli
16ad0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
16ae0 74 61 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  ta) {.    dprint
16af0 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
16b00 20 20 42 49 4f 5f 63 6c 65 61 6e 75 70 28 29 3b    BIO_cleanup();
16b10 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  .}../*. *-------
16b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a  ---------------*
16b50 0a 20 2a 0a 20 2a 09 54 6c 73 4c 69 62 49 6e 69  . *. *.TlsLibIni
16b60 74 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69  t --. *. *.Initi
16b70 61 6c 69 7a 65 73 20 53 53 4c 20 6c 69 62 72 61  alizes SSL libra
16b80 72 79 20 6f 6e 63 65 20 70 65 72 20 61 70 70 6c  ry once per appl
16b90 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65  ication. *. * Re
16ba0 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
16bb0 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a  dard Tcl result.
16bc0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
16bd0 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a  ts:. *.Initializ
16be0 65 73 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20  es SSL library. 
16bf0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
16c30 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
16c40 62 49 6e 69 74 28 29 20 7b 0a 20 20 20 20 73 74  bInit() {.    st
16c50 61 74 69 63 20 69 6e 74 20 69 6e 69 74 69 61 6c  atic int initial
16c60 69 7a 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 64  ized = 0;..    d
16c70 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
16c80 3b 0a 0a 20 20 20 20 69 66 20 28 21 69 6e 69 74  ;..    if (!init
16c90 69 61 6c 69 7a 65 64 29 20 7b 0a 09 2f 2a 20 49  ialized) {../* I
16ca0 6e 69 74 69 61 6c 69 7a 65 20 42 4f 54 48 20 6c  nitialize BOTH l
16cb0 69 62 63 72 79 70 74 6f 20 61 6e 64 20 6c 69 62  ibcrypto and lib
16cc0 73 73 6c 2e 20 2a 2f 0a 09 69 66 20 28 21 4f 50  ssl. */..if (!OP
16cd0 45 4e 53 53 4c 5f 69 6e 69 74 5f 73 73 6c 28 4f  ENSSL_init_ssl(O
16ce0 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
16cf0 5f 53 53 4c 5f 53 54 52 49 4e 47 53 20 7c 20 4f  _SSL_STRINGS | O
16d00 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c 4f 41 44  PENSSL_INIT_LOAD
16d10 5f 43 52 59 50 54 4f 5f 53 54 52 49 4e 47 53 0a  _CRYPTO_STRINGS.
16d20 09 20 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  .    | OPENSSL_I
16d30 4e 49 54 5f 41 44 44 5f 41 4c 4c 5f 43 49 50 48  NIT_ADD_ALL_CIPH
16d40 45 52 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e  ERS | OPENSSL_IN
16d50 49 54 5f 41 44 44 5f 41 4c 4c 5f 44 49 47 45 53  IT_ADD_ALL_DIGES
16d60 54 53 0a 09 20 20 20 20 7c 20 4f 50 45 4e 53 53  TS..    | OPENSS
16d70 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 4f 4e 46  L_INIT_LOAD_CONF
16d80 49 47 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49  IG | OPENSSL_INI
16d90 54 5f 41 53 59 4e 43 2c 20 4e 55 4c 4c 29 29 20  T_ASYNC, NULL)) 
16da0 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
16db0 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a  L_ERROR;..}.../*
16dc0 20 43 72 65 61 74 65 20 42 49 4f 20 68 61 6e 64   Create BIO hand
16dd0 6c 65 72 73 20 2a 2f 0a 09 42 49 4f 5f 6e 65 77  lers */..BIO_new
16de0 5f 74 63 6c 28 4e 55 4c 4c 2c 20 30 29 3b 0a 09  _tcl(NULL, 0);..
16df0 0a 09 2f 2a 20 43 72 65 61 74 65 20 65 78 69 74  ../* Create exit
16e00 20 68 61 6e 64 6c 65 72 20 2a 2f 0a 09 54 63 6c   handler */..Tcl
16e10 5f 43 72 65 61 74 65 45 78 69 74 48 61 6e 64 6c  _CreateExitHandl
16e20 65 72 28 54 6c 73 4c 69 62 53 68 75 74 64 6f 77  er(TlsLibShutdow
16e30 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 69 6e 69 74 69  n, NULL);..initi
16e40 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20  alized = 1;.    
16e50 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  }.    return TCL
16e60 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 20 49 6e 69 74  _OK;.}.../* Init
16e70 20 73 63 72 69 70 74 20 2a 2f 0a 73 74 61 74 69   script */.stati
16e80 63 20 63 6f 6e 73 74 20 63 68 61 72 20 74 6c 73  c const char tls
16e90 54 63 6c 49 6e 69 74 53 63 72 69 70 74 5b 5d 20  TclInitScript[] 
16ea0 3d 20 7b 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c  = {.#include "tl
16eb0 73 2e 74 63 6c 2e 68 22 0a 7d 3b 0a 0a 2f 2a 0a  s.tcl.h".};../*.
16ec0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16ed0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ee0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ef0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f00 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f  -----. *. * Tls_
16f10 49 6e 69 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  Init --. *. *.Th
16f20 69 73 20 69 73 20 61 20 70 61 63 6b 61 67 65 20  is is a package 
16f30 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70  initialization p
16f40 72 6f 63 65 64 75 72 65 2c 20 77 68 69 63 68 20  rocedure, which 
16f50 69 73 20 63 61 6c 6c 65 64 0a 20 2a 09 62 79 20  is called. *.by 
16f60 54 43 4c 20 77 68 65 6e 20 74 68 69 73 20 70 61  TCL when this pa
16f70 63 6b 61 67 65 20 69 73 20 74 6f 20 62 65 20 61  ckage is to be a
16f80 64 64 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 72  dded to an inter
16f90 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65  preter.. *. * Re
16fa0 73 75 6c 74 73 3a 0a 20 2a 09 49 6e 69 74 69 61  sults:. *.Initia
16fb0 6c 69 7a 65 73 20 73 74 72 75 63 74 75 72 65 73  lizes structures
16fc0 20 61 6e 64 20 63 72 65 61 74 65 73 20 63 6f 6d   and creates com
16fd0 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 53 69 64  mands.. *. * Sid
16fe0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 20 43  e effects:. *. C
16ff0 72 65 61 74 65 20 74 68 65 20 63 6f 6d 6d 61 6e  reate the comman
17000 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ds. *. *--------
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
17050 0a 23 69 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56  .#if TCL_MAJOR_V
17060 45 52 53 49 4f 4e 20 3e 20 38 0a 23 64 65 66 69  ERSION > 8.#defi
17070 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22  ne MIN_VERSION "
17080 39 2e 30 22 0a 23 65 6c 73 65 0a 23 64 65 66 69  9.0".#else.#defi
17090 6e 65 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 20 22  ne MIN_VERSION "
170a0 38 2e 35 22 0a 23 65 6e 64 69 66 0a 0a 44 4c 4c  8.5".#endif..DLL
170b0 45 58 50 4f 52 54 20 69 6e 74 20 54 6c 73 5f 49  EXPORT int Tls_I
170c0 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
170d0 69 6e 74 65 72 70 29 20 7b 0a 0a 20 20 20 20 64  interp) {..    d
170e0 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
170f0 3b 0a 0a 23 69 66 64 65 66 20 55 53 45 5f 54 43  ;..#ifdef USE_TC
17100 4c 5f 53 54 55 42 53 0a 20 20 20 20 69 66 20 28  L_STUBS.    if (
17110 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 28 69 6e  Tcl_InitStubs(in
17120 74 65 72 70 2c 20 4d 49 4e 5f 56 45 52 53 49 4f  terp, MIN_VERSIO
17130 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b  N, 0) == NULL) {
17140 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
17150 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  OR;.    }.#endif
17160 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 50 6b 67  .    if (Tcl_Pkg
17170 52 65 71 75 69 72 65 28 69 6e 74 65 72 70 2c 20  Require(interp, 
17180 22 54 63 6c 22 2c 20 4d 49 4e 5f 56 45 52 53 49  "Tcl", MIN_VERSI
17190 4f 4e 2c 20 30 29 20 3d 3d 20 4e 55 4c 4c 29 20  ON, 0) == NULL) 
171a0 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
171b0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
171c0 69 66 20 28 54 6c 73 4c 69 62 49 6e 69 74 28 29  if (TlsLibInit()
171d0 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54   != TCL_OK) {..T
171e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
171f0 69 6e 74 65 72 70 2c 20 22 63 6f 75 6c 64 20 6e  interp, "could n
17200 6f 74 20 69 6e 69 74 69 61 6c 69 7a 65 20 53 53  ot initialize SS
17210 4c 20 6c 69 62 72 61 72 79 22 2c 20 28 63 68 61  L library", (cha
17220 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
17230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17240 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 43 72     }..    Tcl_Cr
17250 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17260 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 63  nterp, "::tls::c
17270 69 70 68 65 72 73 22 2c 20 43 69 70 68 65 72 73  iphers", Ciphers
17280 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44  ObjCmd, (ClientD
17290 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f  ata) NULL, (Tcl_
172a0 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29  CmdDeleteProc *)
172b0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f   NULL);.    Tcl_
172c0 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
172d0 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a  (interp, "::tls:
172e0 3a 63 6f 6e 6e 65 63 74 69 6f 6e 22 2c 20 43 6f  :connection", Co
172f0 6e 6e 65 63 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43  nnectionInfoObjC
17300 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29  md, (ClientData)
17310 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44   NULL, (Tcl_CmdD
17320 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c  eleteProc *) NUL
17330 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  L);.    Tcl_Crea
17340 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
17350 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 68 61 6e  erp, "::tls::han
17360 64 73 68 61 6b 65 22 2c 20 48 61 6e 64 73 68 61  dshake", Handsha
17370 6b 65 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  keObjCmd, (Clien
17380 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
17390 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
173a0 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
173b0 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
173c0 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
173d0 73 3a 3a 69 6d 70 6f 72 74 22 2c 20 49 6d 70 6f  s::import", Impo
173e0 72 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e  rtObjCmd, (Clien
173f0 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63  tData) NULL, (Tc
17400 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20  l_CmdDeleteProc 
17410 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63  *) NULL);.    Tc
17420 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61  l_CreateObjComma
17430 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c  nd(interp, "::tl
17440 73 3a 3a 75 6e 69 6d 70 6f 72 74 22 2c 20 55 6e  s::unimport", Un
17450 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c 20 28 43  importObjCmd, (C
17460 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c  lientData) NULL,
17470 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50   (Tcl_CmdDeleteP
17480 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20  roc *) NULL);.  
17490 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
174a0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
174b0 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c  ::tls::unstack",
174c0 20 55 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 2c   UnimportObjCmd,
174d0 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
174e0 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
174f0 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
17500 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
17510 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
17520 2c 20 22 3a 3a 74 6c 73 3a 3a 73 74 61 74 75 73  , "::tls::status
17530 22 2c 20 53 74 61 74 75 73 4f 62 6a 43 6d 64 2c  ", StatusObjCmd,
17540 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55   (ClientData) NU
17550 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65  LL, (Tcl_CmdDele
17560 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b  teProc *) NULL);
17570 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f  .    Tcl_CreateO
17580 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  bjCommand(interp
17590 2c 20 22 3a 3a 74 6c 73 3a 3a 76 65 72 73 69 6f  , "::tls::versio
175a0 6e 22 2c 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  n", VersionObjCm
175b0 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20  d, (ClientData) 
175c0 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65  NULL, (Tcl_CmdDe
175d0 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c  leteProc *) NULL
175e0 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74  );.    Tcl_Creat
175f0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
17600 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 69 73 63  rp, "::tls::misc
17610 22 2c 20 4d 69 73 63 4f 62 6a 43 6d 64 2c 20 28  ", MiscObjCmd, (
17620 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c  ClientData) NULL
17630 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
17640 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
17650 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a     Tcl_CreateObj
17660 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
17670 22 3a 3a 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f 6c  "::tls::protocol
17680 73 22 2c 20 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a  s", ProtocolsObj
17690 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61  Cmd, (ClientData
176a0 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64  ) NULL, (Tcl_Cmd
176b0 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55  DeleteProc *) NU
176c0 4c 4c 29 3b 0a 0a 20 20 20 20 42 75 69 6c 64 49  LL);..    BuildI
176d0 6e 66 6f 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  nfoCommand(inter
176e0 70 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74  p);..    if (int
176f0 65 72 70 20 26 26 20 54 63 6c 5f 45 76 61 6c 28  erp && Tcl_Eval(
17700 69 6e 74 65 72 70 2c 20 74 6c 73 54 63 6c 49 6e  interp, tlsTclIn
17710 69 74 53 63 72 69 70 74 29 20 21 3d 20 54 43 4c  itScript) != TCL
17720 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  _OK) {..return T
17730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
17740 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f  .    return Tcl_
17750 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65 72  PkgProvide(inter
17760 70 2c 20 50 41 43 4b 41 47 45 5f 4e 41 4d 45 2c  p, PACKAGE_NAME,
17770 20 50 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e   PACKAGE_VERSION
17780 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  );.}../*. *-----
17790 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
177c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
177d0 2a 0a 20 2a 09 54 6c 73 5f 53 61 66 65 49 6e 69  *. *.Tls_SafeIni
177e0 74 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  t --. *. *.This 
177f0 69 73 20 61 20 70 61 63 6b 61 67 65 20 69 6e 69  is a package ini
17800 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
17810 65 64 75 72 65 20 66 6f 72 20 73 61 66 65 20 69  edure for safe i
17820 6e 74 65 72 70 73 2e 0a 20 2a 0a 20 2a 20 52 65  nterps.. *. * Re
17830 73 75 6c 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61  sults:. *.Same a
17840 73 20 6f 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a  s of 'Tls_Init'.
17850 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
17860 74 73 3a 0a 20 2a 09 53 61 6d 65 20 61 73 20 6f  ts:. *.Same as o
17870 66 20 27 54 6c 73 5f 49 6e 69 74 27 0a 20 2a 0a  f 'Tls_Init'. *.
17880 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
17890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
178c0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 4c 4c 45 58 50  -----. */.DLLEXP
178d0 4f 52 54 20 69 6e 74 20 54 6c 73 5f 53 61 66 65  ORT int Tls_Safe
178e0 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
178f0 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 64  *interp) {.    d
17900 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
17910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c 73  ;.    return Tls
17920 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 7d  _Init(interp);.}
17930 0a                                               .