Hex Artifact Content

Artifact 08752c37a7a1aa7989c1293ffd43e9a614786e74dedbb4821089ecbea8a51330:


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 54 63 6c 5f 53 69 7a 65 20 69  ;.    Tcl_Size i
71a0: 6e 64 65 78 3b 0a 20 20 20 20 69 6e 74 20 76 65  ndex;.    int ve
71b0: 72 62 6f 73 65 20 3d 20 30 2c 20 75 73 65 5f 73  rbose = 0, use_s
71c0: 75 70 70 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20  upported = 0;.  
71d0: 20 20 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48    const SSL_METH
71e0: 4f 44 20 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20  OD *method;.    
71f0: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74  (void) clientDat
7200: 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  a;..    dprintf(
7210: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
7220: 69 66 20 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c  if ((objc < 2) |
7230: 7c 20 28 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a  | (objc > 4)) {.
7240: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
7250: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
7260: 76 2c 20 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65  v, "protocol ?ve
7270: 72 62 6f 73 65 3f 20 3f 73 75 70 70 6f 72 74 65  rbose? ?supporte
7280: 64 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  d?");..return TC
7290: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
72a0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e     if (Tcl_GetIn
72b0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
72c0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74  p, objv[1], prot
72d0: 6f 63 6f 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c  ocols, "protocol
72e0: 22 2c 20 30 2c 20 26 69 6e 64 65 78 29 20 21 3d  ", 0, &index) !=
72f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
7300: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
7310: 20 20 7d 0a 20 20 20 20 69 66 20 28 28 6f 62 6a    }.    if ((obj
7320: 63 20 3e 20 32 29 20 26 26 20 54 63 6c 5f 47 65  c > 2) && Tcl_Ge
7330: 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
7340: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
7350: 20 26 76 65 72 62 6f 73 65 29 20 21 3d 20 54 43   &verbose) != TC
7360: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
7370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7380: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7390: 20 33 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   3) && Tcl_GetBo
73a0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
73b0: 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75  erp, objv[3], &u
73c0: 73 65 5f 73 75 70 70 6f 72 74 65 64 29 20 21 3d  se_supported) !=
73d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75   TCL_OK) {..retu
73e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
73f0: 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65    }..    ERR_cle
7400: 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20  ar_error();..   
7410: 20 73 77 69 74 63 68 20 28 28 65 6e 75 6d 20 70   switch ((enum p
7420: 72 6f 74 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b  rotocol)index) {
7430: 0a 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a  ..case TLS_SSL2:
7440: 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
7450: 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30  SION_NUMBER >= 0
7460: 78 31 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65  x10100000L || de
7470: 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c  fined(NO_SSL2) |
7480: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
7490: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20  L_NO_SSL2)..    
74a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
74b0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
74c0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
74d0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
74e0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
74f0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
7500: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7510: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7520: 3d 20 53 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29  = SSLv2_method()
7530: 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ; break;.#endif.
7540: 09 63 61 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a  .case TLS_SSL3:.
7550: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53  #if defined(NO_S
7560: 53 4c 33 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  SL3) || defined(
7570: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
7580: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
7590: 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48  SSL_NO_SSL3_METH
75a0: 4f 44 29 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  OD)..    Tcl_App
75b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
75c0: 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65  , protocols[inde
75d0: 78 5d 2c 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20  x], ": protocol 
75e0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 22 2c 20  not supported", 
75f0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
7600: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7610: 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20  ERROR;.#else..  
7620: 20 20 6d 65 74 68 6f 64 20 3d 20 53 53 4c 76 33    method = SSLv3
7630: 5f 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b  _method(); break
7640: 3b 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54  ;.#endif..case T
7650: 4c 53 5f 54 4c 53 31 3a 0a 23 69 66 20 64 65 66  LS_TLS1:.#if def
7660: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c  ined(NO_TLS1) ||
7670: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7680: 5f 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  _NO_TLS1) || def
7690: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
76a0: 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20  TLS1_METHOD)..  
76b0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
76c0: 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f  lt(interp, proto
76d0: 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20  cols[index], ": 
76e0: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70  protocol not sup
76f0: 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a  ported", (char *
7700: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  ) NULL);..    re
7710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7720: 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f  #else..    metho
7730: 64 20 3d 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64  d = TLSv1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7760: 5f 31 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _1:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65  NO_TLS1_1) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69  _TLS1_1) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_1_METHOD).. 
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74  od = TLSv1_1_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7870: 4c 53 31 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_2:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c  ed(NO_TLS1_2) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64  _NO_TLS1_2) || d
78b0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
78c0: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
78d0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
78e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
78f0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
7900: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
7910: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
7920: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
7930: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7940: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7950: 65 74 68 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f  ethod = TLSv1_2_
7960: 6d 65 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b  method(); break;
7970: 0a 23 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c  .#endif..case TL
7980: 53 5f 54 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65  S_TLS1_3:.#if de
7990: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29  fined(NO_TLS1_3)
79a0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e   || defined(OPEN
79b0: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09  SSL_NO_TLS1_3)..
79c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
79d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f  sult(interp, pro
79e0: 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22  tocols[index], "
79f0: 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  : protocol not s
7a00: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
7a10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
7a20: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
7a30: 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74  ;.#else..    met
7a40: 68 6f 64 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64  hod = TLS_method
7a50: 28 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  ();..    SSL_CTX
7a60: 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76  _set_min_proto_v
7a70: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
7a80: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20  _3_VERSION);..  
7a90: 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61    SSL_CTX_set_ma
7aa0: 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28  x_proto_version(
7ab0: 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53  ctx, TLS1_3_VERS
7ac0: 49 4f 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b  ION);..    break
7ad0: 3b 0a 23 65 6e 64 69 66 0a 09 64 65 66 61 75 6c  ;.#endif..defaul
7ae0: 74 3a 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  t:..    method =
7af0: 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09   TLS_method();..
7b00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7b10: 0a 0a 20 20 20 20 63 74 78 20 3d 20 53 53 4c 5f  ..    ctx = SSL_
7b20: 43 54 58 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b  CTX_new(method);
7b30: 0a 20 20 20 20 69 66 20 28 63 74 78 20 3d 3d 20  .    if (ctx == 
7b40: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70  NULL) {..Tcl_App
7b50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7b60: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
7b70: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
7b80: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
7b90: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
7ba0: 20 20 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28    ssl = SSL_new(
7bb0: 63 74 78 29 3b 0a 20 20 20 20 69 66 20 28 73 73  ctx);.    if (ss
7bc0: 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63  l == NULL) {..Tc
7bd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
7be0: 6e 74 65 72 70 2c 20 47 45 54 5f 45 52 52 5f 52  nterp, GET_ERR_R
7bf0: 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a  EASON(), (char *
7c00: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
7c10: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
7c20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7c30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73      }..    /* Us
7c40: 65 20 6c 69 73 74 20 61 6e 64 20 6f 72 64 65 72  e list and order
7c50: 20 61 73 20 77 6f 75 6c 64 20 62 65 20 73 65 6e   as would be sen
7c60: 74 20 69 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c  t in a ClientHel
7c70: 6c 6f 20 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61  lo or all availa
7c80: 62 6c 65 20 63 69 70 68 65 72 73 20 2a 2f 0a 20  ble ciphers */. 
7c90: 20 20 20 69 66 20 28 75 73 65 5f 73 75 70 70 6f     if (use_suppo
7ca0: 72 74 65 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53  rted) {..sk = SS
7cb0: 4c 5f 67 65 74 31 5f 73 75 70 70 6f 72 74 65 64  L_get1_supported
7cc0: 5f 63 69 70 68 65 72 73 28 73 73 6c 29 3b 0a 20  _ciphers(ssl);. 
7cd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20     } else {..sk 
7ce0: 3d 20 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72  = SSL_get_cipher
7cf0: 73 28 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  s(ssl);.    }.. 
7d00: 20 20 20 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c     if (sk != NUL
7d10: 4c 29 20 7b 0a 09 69 66 20 28 21 76 65 72 62 6f  L) {..if (!verbo
7d20: 73 65 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74  se) {..    const
7d30: 20 63 68 61 72 20 2a 63 70 3b 0a 09 20 20 20 20   char *cp;..    
7d40: 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  objPtr = Tcl_New
7d50: 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29  ListObj(0, NULL)
7d60: 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74 20  ;..    for (int 
7d70: 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53  i = 0; i < sk_SS
7d80: 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29  L_CIPHER_num(sk)
7d90: 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74  ; i++) {...const
7da0: 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d   SSL_CIPHER *c =
7db0: 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76   sk_SSL_CIPHER_v
7dc0: 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69  alue(sk, i);...i
7dd0: 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f  f (c == NULL) co
7de0: 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69  ntinue;..../* ci
7df0: 70 68 65 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f  pher name or (NO
7e00: 4e 45 29 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53  NE) */...cp = SS
7e10: 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d  L_CIPHER_get_nam
7e20: 65 28 63 29 3b 0a 09 09 69 66 20 28 63 70 20 3d  e(c);...if (cp =
7e30: 3d 20 4e 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09  = NULL) break;..
7e40: 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65  .Tcl_ListObjAppe
7e50: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
7e60: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
7e70: 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
7e80: 20 2a 29 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20   *) cp, -1));.. 
7e90: 20 20 20 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a     }...} else {.
7ea0: 09 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63  .    objPtr = Tc
7eb0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
7ec0: 22 2c 30 29 3b 0a 09 20 20 20 20 66 6f 72 20 28  ",0);..    for (
7ed0: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73  int i = 0; i < s
7ee0: 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d  k_SSL_CIPHER_num
7ef0: 28 73 6b 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63  (sk); i++) {...c
7f00: 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48 45 52 20  onst SSL_CIPHER 
7f10: 2a 63 20 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48  *c = sk_SSL_CIPH
7f20: 45 52 5f 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b  ER_value(sk, i);
7f30: 0a 09 09 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c  ...if (c == NULL
7f40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f  ) continue;..../
7f50: 2a 20 74 65 78 74 75 61 6c 20 64 65 73 63 72 69  * textual descri
7f60: 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69 70  ption of the cip
7f70: 68 65 72 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c  her */...if (SSL
7f80: 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
7f90: 69 6f 6e 28 63 2c 20 62 75 66 2c 20 73 69 7a 65  ion(c, buf, size
7fa0: 6f 66 28 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c  of(buf)) != NULL
7fb0: 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70  ) {...    Tcl_Ap
7fc0: 70 65 6e 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72  pendToObj(objPtr
7fd0: 2c 20 62 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65  , buf, (Tcl_Size
7fe0: 29 20 73 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a  ) strlen(buf));.
7ff0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
8000: 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a   Tcl_AppendToObj
8010: 28 6f 62 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57  (objPtr, "UNKNOW
8020: 4e 5c 6e 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20  N\n", 8);...}.. 
8030: 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65     }..}..if (use
8040: 5f 73 75 70 70 6f 72 74 65 64 29 20 7b 0a 09 20  _supported) {.. 
8050: 20 20 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52     sk_SSL_CIPHER
8060: 5f 66 72 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20  _free(sk);..}.  
8070: 20 20 7d 0a 20 20 20 20 53 53 4c 5f 66 72 65 65    }.    SSL_free
8080: 28 73 73 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43  (ssl);.    SSL_C
8090: 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 0a 20  TX_free(ctx);.. 
80a0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
80b0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  ult(interp, objP
80c0: 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  tr);.    return 
80d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
80e0: 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f  ----. *. * Proto
8130: 63 6f 6c 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69  colsObjCmd -- li
8140: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 70 72 6f  st available pro
8150: 74 6f 63 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69  tocols. *. *.Thi
8160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
8170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
8180: 73 20 74 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74  s the "tls::prot
8190: 6f 63 6f 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20  ocols" command. 
81a0: 2a 09 74 6f 20 6c 69 73 74 20 61 76 61 69 6c 61  *.to list availa
81b0: 62 6c 65 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20  ble protocols.. 
81c0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
81d0: 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
81e0: 72 65 73 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a  result list.. *.
81f0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a   * Side effects:
8200: 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d  . *.none. *. *--
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  -. */.static int
8260: 0a 50 72 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64  .ProtocolsObjCmd
8270: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
8280: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
8290: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
82a0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
82b0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
82c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
82d0: 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63  tr;.    (void) c
82e0: 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20  lientData;..    
82f0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22  dprintf("Called"
8300: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63  );..    if (objc
8310: 20 21 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72   != 1) {..Tcl_Wr
8320: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
8330: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
8340: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
8350: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45  OR;.    }..    E
8360: 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29  RR_clear_error()
8370: 3b 0a 0a 20 20 20 20 6f 62 6a 50 74 72 20 3d 20  ;..    objPtr = 
8380: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30  Tcl_NewListObj(0
8390: 2c 20 4e 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50  , NULL);..#if OP
83a0: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
83b0: 4d 42 45 52 20 3c 20 30 78 31 30 31 30 30 30 30  MBER < 0x1010000
83c0: 30 4c 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e  0L && !defined(N
83d0: 4f 5f 53 53 4c 32 29 20 26 26 20 21 64 65 66 69  O_SSL2) && !defi
83e0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
83f0: 53 4c 32 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  SL2).    Tcl_Lis
8400: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8410: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8420: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
8430: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
8440: 5f 53 53 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65  _SSL2], -1));.#e
8450: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
8460: 64 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64  d(NO_SSL3) && !d
8470: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
8480: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8490: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
84a0: 53 4c 33 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  SL3_METHOD).    
84b0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
84c0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
84d0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
84e0: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
84f0: 6f 6c 73 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d  ols[TLS_SSL3], -
8500: 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  1));.#endif.#if 
8510: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
8520: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
8530: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26  ENSSL_NO_TLS1) &
8540: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8550: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f  SL_NO_TLS1_METHO
8560: 44 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  D).    Tcl_ListO
8570: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
8580: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
8590: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
85a0: 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54  (protocols[TLS_T
85b0: 4c 53 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64  LS1], -1));.#end
85c0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
85d0: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
85e0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
85f0: 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65  O_TLS1_1) && !de
8600: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
8610: 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a  _TLS1_1_METHOD).
8620: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8630: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8640: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8650: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8660: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
8670: 5f 31 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  _1], -1));.#endi
8680: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8690: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
86a0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
86b0: 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66  _TLS1_2) && !def
86c0: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
86d0: 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20  TLS1_2_METHOD). 
86e0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
86f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
8700: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f  rp, objPtr, Tcl_
8710: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f  NewStringObj(pro
8720: 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f  tocols[TLS_TLS1_
8730: 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66  2], -1));.#endif
8740: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
8750: 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66  _TLS1_3) && !def
8760: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
8770: 54 4c 53 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f  TLS1_3).    Tcl_
8780: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
8790: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  ment(interp, obj
87a0: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
87b0: 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b  ngObj(protocols[
87c0: 54 4c 53 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29  TLS_TLS1_3], -1)
87d0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
87e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
87f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
8800: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8810: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8860: 0a 20 2a 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65  . *. * Handshake
8870: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09  ObjCmd --. *. *.
8880: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
8890: 75 73 65 64 20 74 6f 20 76 65 72 69 66 79 20 77  used to verify w
88a0: 68 65 74 68 65 72 20 74 68 65 20 68 61 6e 64 73  hether the hands
88b0: 68 61 6b 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  hake is complete
88c0: 0a 20 2a 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20  . *.or not.. *. 
88d0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
88e0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
88f0: 75 6c 74 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e  ult. 1 means han
8900: 64 73 68 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c  dshake complete,
8910: 20 30 20 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67   0 means pending
8920: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8930: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72  ects:. *.May for
8940: 63 65 20 53 53 4c 20 6e 65 67 6f 74 69 61 74 69  ce SSL negotiati
8950: 6f 6e 20 74 6f 20 74 61 6b 65 20 70 6c 61 63 65  on to take place
8960: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d  ----------------
89a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
89b0: 74 61 74 69 63 20 69 6e 74 20 48 61 6e 64 73 68  tatic int Handsh
89c0: 61 6b 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74  akeObjCmd(Client
89d0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
89e0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
89f0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54  erp, int objc, T
8a00: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
8a10: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f  jv[]) {.    Tcl_
8a20: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20  Channel chan;   
8a30: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 61 6e       /* The chan
8a40: 6e 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64  nel to set a mod
8a50: 65 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61  e on. */.    Sta
8a60: 74 65 20 2a 73 74 61 74 65 50 74 72 3b 20 20 20  te *statePtr;   
8a70: 20 20 20 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73       /* client s
8a80: 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73 6f 63  tate for ssl soc
8a90: 6b 65 74 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ket */.    const
8aa0: 20 63 68 61 72 20 2a 65 72 72 53 74 72 20 3d 20   char *errStr = 
8ab0: 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65  NULL;.    int re
8ac0: 74 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 65  t = 1;.    int e
8ad0: 72 72 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69  rr = 0;.    (voi
8ae0: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
8af0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
8b00: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
8b10: 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63  objc != 2) {..Tc
8b20: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
8b30: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
8b40: 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74  "channel");..ret
8b50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8b60: 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c     }..    ERR_cl
8b70: 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20  ear_error();..  
8b80: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
8b90: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
8ba0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
8bb0: 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20  jv[1]), NULL);. 
8bc0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28     if (chan == (
8bd0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c  Tcl_Channel) NUL
8be0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  L) {..return TCL
8bf0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
8c00: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
8c10: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68  to operate on th
8c20: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65  e topmost channe
8c30: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20  l */.    chan = 
8c40: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
8c50: 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 20  l(chan);.    if 
8c60: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54  (Tcl_GetChannelT
8c70: 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c 73  ype(chan) != Tls
8c80: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29 20  _ChannelType()) 
8c90: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
8ca0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64  ult(interp, "bad
8cb0: 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63   channel \"", Tc
8cc0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65  l_GetChannelName
8cd0: 28 63 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22  (chan),..    "\"
8ce0: 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e  : not a TLS chan
8cf0: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
8d00: 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  ULL);..Tcl_SetEr
8d10: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
8d20: 22 54 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b  "TLS", "HANDSHAK
8d30: 45 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  E", "CHANNEL", "
8d40: 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
8d50: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
8d60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
8d70: 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
8d80: 3d 20 28 53 74 61 74 65 20 2a 29 54 63 6c 5f 47  = (State *)Tcl_G
8d90: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63  etChannelInstanc
8da0: 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20  eData(chan);..  
8db0: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 69    dprintf("Calli
8dc0: 6e 67 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f  ng Tls_WaitForCo
8dd0: 6e 6e 65 63 74 22 29 3b 0a 20 20 20 20 72 65 74  nnect");.    ret
8de0: 20 3d 20 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f   = Tls_WaitForCo
8df0: 6e 6e 65 63 74 28 73 74 61 74 65 50 74 72 2c 20  nnect(statePtr, 
8e00: 26 65 72 72 2c 20 31 29 3b 0a 20 20 20 20 64 70  &err, 1);.    dp
8e10: 72 69 6e 74 66 28 22 54 6c 73 5f 57 61 69 74 46  rintf("Tls_WaitF
8e20: 6f 72 43 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e  orConnect return
8e30: 65 64 3a 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a  ed: %i", ret);..
8e40: 20 20 20 20 69 66 20 28 72 65 74 20 3c 20 30 20      if (ret < 0 
8e50: 26 26 20 28 28 73 74 61 74 65 50 74 72 2d 3e 66  && ((statePtr->f
8e60: 6c 61 67 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41  lags & TLS_TCL_A
8e70: 53 59 4e 43 29 20 26 26 20 28 65 72 72 20 3d 3d  SYNC) && (err ==
8e80: 20 45 41 47 41 49 4e 29 29 29 20 7b 0a 09 64 70   EAGAIN))) {..dp
8e90: 72 69 6e 74 66 28 22 41 73 79 6e 63 20 73 65 74  rintf("Async set
8ea0: 20 61 6e 64 20 65 72 72 20 3d 20 45 41 47 41 49   and err = EAGAI
8eb0: 4e 22 29 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20  N");..ret = 0;. 
8ec0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65     } else if (re
8ed0: 74 20 3c 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72  t < 0) {..long r
8ee0: 65 73 75 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d  esult;..errStr =
8ef0: 20 73 74 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a   statePtr->err;.
8f00: 09 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74  .Tcl_ResetResult
8f10: 28 69 6e 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53  (interp);..Tcl_S
8f20: 65 74 45 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09  etErrno(err);...
8f30: 69 66 20 28 21 65 72 72 53 74 72 20 7c 7c 20 28  if (!errStr || (
8f40: 2a 65 72 72 53 74 72 20 3d 3d 20 30 29 29 20 7b  *errStr == 0)) {
8f50: 0a 09 20 20 20 20 65 72 72 53 74 72 20 3d 20 54  ..    errStr = T
8f60: 63 6c 5f 50 6f 73 69 78 45 72 72 6f 72 28 69 6e  cl_PosixError(in
8f70: 74 65 72 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f  terp);..}...Tcl_
8f80: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8f90: 65 72 70 2c 20 22 68 61 6e 64 73 68 61 6b 65 20  erp, "handshake 
8fa0: 66 61 69 6c 65 64 3a 20 22 2c 20 65 72 72 53 74  failed: ", errSt
8fb0: 72 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  r, (char *) NULL
8fc0: 29 3b 0a 09 69 66 20 28 28 72 65 73 75 6c 74 20  );..if ((result 
8fd0: 3d 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79  = SSL_get_verify
8fe0: 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74 72  _result(statePtr
8ff0: 2d 3e 73 73 6c 29 29 20 21 3d 20 58 35 30 39 5f  ->ssl)) != X509_
9000: 56 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c  V_OK) {..    Tcl
9010: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9020: 74 65 72 70 2c 20 22 20 64 75 65 20 74 6f 20 5c  terp, " due to \
9030: 22 22 2c 20 58 35 30 39 5f 76 65 72 69 66 79 5f  "", X509_verify_
9040: 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e  cert_error_strin
9050: 67 28 72 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c  g(result), "\"",
9060: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
9070: 0a 09 7d 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  ..}..Tcl_SetErro
9080: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
9090: 4c 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22  LS", "HANDSHAKE"
90a0: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
90b0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72  r *) NULL);..dpr
90c0: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
90d0: 54 43 4c 5f 45 52 52 4f 52 20 77 69 74 68 20 68  TCL_ERROR with h
90e0: 61 6e 64 73 68 61 6b 65 20 66 61 69 6c 65 64 3a  andshake failed:
90f0: 20 25 73 22 2c 20 65 72 72 53 74 72 29 3b 0a 09   %s", errStr);..
9100: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9110: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
9120: 69 66 20 28 65 72 72 20 21 3d 20 30 29 20 7b 0a  if (err != 0) {.
9130: 09 20 20 20 20 64 70 72 69 6e 74 66 28 22 47 6f  .    dprintf("Go
9140: 74 20 61 6e 20 65 72 72 6f 72 20 77 69 74 68 20  t an error with 
9150: 61 20 63 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64  a completed hand
9160: 73 68 61 6b 65 3a 20 65 72 72 20 3d 20 25 69 22  shake: err = %i"
9170: 2c 20 65 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20  , err);..}..ret 
9180: 3d 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 1;.    }..    
9190: 64 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69  dprintf("Returni
91a0: 6e 67 20 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64  ng TCL_OK with d
91b0: 61 74 61 20 5c 22 25 69 5c 22 22 2c 20 72 65 74  ata \"%i\"", ret
91c0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  );.    Tcl_SetOb
91d0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
91e0: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
91f0: 74 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t));.    return 
9200: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  TCL_OK;.}.../*. 
9210: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
9220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9250: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72  ----. *. * Impor
9260: 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a  tObjCmd --. *. *
9270: 09 54 68 69 73 20 70 72 6f 63 65 64 75 72 65 20  .This procedure 
9280: 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 72  is invoked to pr
9290: 6f 63 65 73 73 20 74 68 65 20 22 73 73 6c 22 20  ocess the "ssl" 
92a0: 63 6f 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 09 54 68  command. *. *.Th
92b0: 65 20 73 73 6c 20 63 6f 6d 6d 61 6e 64 20 70 75  e ssl command pu
92c0: 73 68 65 73 20 53 53 4c 20 6f 76 65 72 20 61 20  shes SSL over a 
92d0: 28 6e 65 77 6c 79 20 63 6f 6e 6e 65 63 74 65 64  (newly connected
92e0: 29 20 74 63 70 20 73 6f 63 6b 65 74 0a 20 2a 0a  ) tcp socket. *.
92f0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
9300: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
9310: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
9320: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
9330: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
9340: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
9350: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
93a0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 49   */.static int.I
93b0: 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c 69 65  mportObjCmd(Clie
93c0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
93d0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
93e0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
93f0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
9400: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63  objv[]) {.    Tc
9410: 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09  l_Channel chan;.
9420: 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20  ./* The channel 
9430: 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e  to set a mode on
9440: 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a  . */.    State *
9450: 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c  statePtr;../* cl
9460: 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73  ient state for s
9470: 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20  sl socket */.   
9480: 20 53 53 4c 5f 43 54 58 20 2a 63 74 78 09 09 3d   SSL_CTX *ctx..=
9490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
94a0: 62 6a 20 2a 73 63 72 69 70 74 09 09 3d 20 4e 55  bj *script..= NU
94b0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  LL;.    Tcl_Obj 
94c0: 2a 70 61 73 73 77 6f 72 64 09 09 3d 20 4e 55 4c  *password..= NUL
94d0: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
94e0: 76 63 6d 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  vcmd..= NULL;.  
94f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70    Tcl_DString up
9500: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
9510: 61 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e  ation, upperChan
9520: 6e 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70  nelBlocking, upp
9530: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
9540: 67 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  g, upperChannelE
9550: 4f 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20  OFChar;.    int 
9560: 69 64 78 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a  idx;.    Tcl_Siz
9570: 65 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 66  e len;.    int f
9580: 6c 61 67 73 09 09 09 3d 20 54 4c 53 5f 54 43 4c  lags...= TLS_TCL
9590: 5f 49 4e 49 54 3b 0a 20 20 20 20 69 6e 74 20 73  _INIT;.    int s
95a0: 65 72 76 65 72 09 09 09 3d 20 30 3b 09 2f 2a 20  erver...= 0;./* 
95b0: 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  is connection in
95c0: 63 6f 6d 69 6e 67 20 6f 72 20 6f 75 74 67 6f 69  coming or outgoi
95d0: 6e 67 3f 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  ng? */.    char 
95e0: 2a 6b 65 79 66 69 6c 65 09 09 3d 20 4e 55 4c 4c  *keyfile..= NULL
95f0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 65 72 74  ;.    char *cert
9600: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
9610: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
9620: 2a 6b 65 79 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  *key..= NULL;.  
9630: 20 20 54 63 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c    Tcl_Size key_l
9640: 65 6e 09 09 3d 20 30 3b 0a 20 20 20 20 75 6e 73  en..= 0;.    uns
9650: 69 67 6e 65 64 20 63 68 61 72 20 2a 63 65 72 74  igned char *cert
9660: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9670: 6c 5f 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 09  l_Size cert_len.
9680: 09 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a  .= 0;.    char *
9690: 63 69 70 68 65 72 73 09 09 3d 20 4e 55 4c 4c 3b  ciphers..= NULL;
96a0: 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68 65  .    char *ciphe
96b0: 72 73 75 69 74 65 73 09 09 3d 20 4e 55 4c 4c 3b  rsuites..= NULL;
96c0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 66 69 6c  .    char *CAfil
96d0: 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63  e..= NULL;.    c
96e0: 68 61 72 20 2a 43 41 70 61 74 68 09 09 3d 20 4e  har *CApath..= N
96f0: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 43  ULL;.    char *C
9700: 41 73 74 6f 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a  Astore..= NULL;.
9710: 20 20 20 20 63 68 61 72 20 2a 44 48 70 61 72 61      char *DHpara
9720: 6d 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ms..= NULL;.    
9730: 63 68 61 72 20 2a 6d 6f 64 65 6c 09 09 09 3d 20  char *model...= 
9740: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a  NULL;.    char *
9750: 73 65 72 76 65 72 6e 61 6d 65 09 09 3d 20 4e 55  servername..= NU
9760: 4c 4c 3b 09 2f 2a 20 68 6f 73 74 6e 61 6d 65 20  LL;./* hostname 
9770: 66 6f 72 20 53 65 72 76 65 72 20 4e 61 6d 65 20  for Server Name 
9780: 49 6e 64 69 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  Indication */.  
9790: 20 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e 5f    char *session_
97a0: 69 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  id..= NULL;.    
97b0: 54 63 6c 5f 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d  Tcl_Obj *alpn..=
97c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 73   NULL;.    int s
97d0: 73 6c 32 20 3d 20 30 2c 20 73 73 6c 33 20 3d 20  sl2 = 0, ssl3 = 
97e0: 30 3b 0a 20 20 20 20 69 6e 74 20 74 6c 73 31 20  0;.    int tls1 
97f0: 3d 20 31 2c 20 74 6c 73 31 5f 31 20 3d 20 31 2c  = 1, tls1_1 = 1,
9800: 20 74 6c 73 31 5f 32 20 3d 20 31 2c 20 74 6c 73   tls1_2 = 1, tls
9810: 31 5f 33 20 3d 20 31 3b 0a 20 20 20 20 69 6e 74  1_3 = 1;.    int
9820: 20 70 72 6f 74 6f 20 3d 20 30 2c 20 6c 65 76 65   proto = 0, leve
9830: 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  l = -1;.    int 
9840: 76 65 72 69 66 79 20 3d 20 30 2c 20 72 65 71 75  verify = 0, requ
9850: 69 72 65 20 3d 20 30 2c 20 72 65 71 75 65 73 74  ire = 0, request
9860: 20 3d 20 31 2c 20 70 6f 73 74 5f 68 61 6e 64 73   = 1, post_hands
9870: 68 61 6b 65 20 3d 20 30 3b 0a 20 20 20 20 28 76  hake = 0;.    (v
9880: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b  oid) clientData;
9890: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
98a0: 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 20 64 65  alled");..#if de
98b0: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 7c  fined(NO_TLS1) |
98c0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
98d0: 4c 5f 4e 4f 5f 54 4c 53 31 29 0a 20 20 20 20 74  L_NO_TLS1).    t
98e0: 6c 73 31 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ls1 = 0;.#endif.
98f0: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
9900: 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_1) || define
9910: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
9920: 31 5f 31 29 0a 20 20 20 20 74 6c 73 31 5f 31 20  1_1).    tls1_1 
9930: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
9940: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
9950: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  2) || defined(OP
9960: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29  ENSSL_NO_TLS1_2)
9970: 0a 20 20 20 20 74 6c 73 31 5f 32 20 3d 20 30 3b  .    tls1_2 = 0;
9980: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
9990: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
99a0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
99b0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
99c0: 20 74 6c 73 31 5f 33 20 3d 20 30 3b 0a 23 65 6e   tls1_3 = 0;.#en
99d0: 64 69 66 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  dif..    if (obj
99e0: 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72  c < 2) {..Tcl_Wr
99f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
9a00: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61  p, 1, objv, "cha
9a10: 6e 6e 65 6c 20 3f 6f 70 74 69 6f 6e 73 3f 22 29  nnel ?options?")
9a20: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
9a30: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
9a40: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
9a50: 29 3b 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  );..    chan = T
9a60: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
9a70: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
9a80: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
9a90: 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
9aa0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
9ab0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
9ac0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9ad0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
9ae0: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
9af0: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
9b00: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
9b10: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
9b20: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a  Channel(chan);..
9b30: 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d 20 32      for (idx = 2
9b40: 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64  ; idx < objc; id
9b50: 78 2b 2b 29 20 7b 0a 09 63 68 61 72 20 2a 6f 70  x++) {..char *op
9b60: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
9b70: 67 28 6f 62 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09  g(objv[idx]);...
9b80: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d  if (opt[0] != '-
9b90: 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ')..    break;..
9ba0: 09 4f 50 54 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c  .OPTOBJ("-alpn",
9bb0: 20 61 6c 70 6e 29 3b 0a 09 4f 50 54 53 54 52 28   alpn);..OPTSTR(
9bc0: 22 2d 63 61 64 69 72 22 2c 20 43 41 70 61 74 68  "-cadir", CApath
9bd0: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61 66  );..OPTSTR("-caf
9be0: 69 6c 65 22 2c 20 43 41 66 69 6c 65 29 3b 0a 09  ile", CAfile);..
9bf0: 4f 50 54 53 54 52 28 22 2d 63 61 73 74 6f 72 65  OPTSTR("-castore
9c00: 22 2c 20 43 41 73 74 6f 72 65 29 3b 0a 09 4f 50  ", CAstore);..OP
9c10: 54 42 59 54 45 28 22 2d 63 65 72 74 22 2c 20 63  TBYTE("-cert", c
9c20: 65 72 74 2c 20 63 65 72 74 5f 6c 65 6e 29 3b 0a  ert, cert_len);.
9c30: 09 4f 50 54 53 54 52 28 22 2d 63 65 72 74 66 69  .OPTSTR("-certfi
9c40: 6c 65 22 2c 20 63 65 72 74 66 69 6c 65 29 3b 0a  le", certfile);.
9c50: 09 4f 50 54 53 54 52 28 22 2d 63 69 70 68 65 72  .OPTSTR("-cipher
9c60: 22 2c 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50  ", ciphers);..OP
9c70: 54 53 54 52 28 22 2d 63 69 70 68 65 72 73 22 2c  TSTR("-ciphers",
9c80: 20 63 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53   ciphers);..OPTS
9c90: 54 52 28 22 2d 63 69 70 68 65 72 73 75 69 74 65  TR("-ciphersuite
9ca0: 73 22 2c 20 63 69 70 68 65 72 73 75 69 74 65 73  s", ciphersuites
9cb0: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d  );..OPTOBJ("-com
9cc0: 6d 61 6e 64 22 2c 20 73 63 72 69 70 74 29 3b 0a  mand", script);.
9cd0: 09 4f 50 54 53 54 52 28 22 2d 64 68 70 61 72 61  .OPTSTR("-dhpara
9ce0: 6d 73 22 2c 20 44 48 70 61 72 61 6d 73 29 3b 0a  ms", DHparams);.
9cf0: 09 4f 50 54 42 59 54 45 28 22 2d 6b 65 79 22 2c  .OPTBYTE("-key",
9d00: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a   key, key_len);.
9d10: 09 4f 50 54 53 54 52 28 22 2d 6b 65 79 66 69 6c  .OPTSTR("-keyfil
9d20: 65 22 2c 20 6b 65 79 66 69 6c 65 29 3b 0a 09 4f  e", keyfile);..O
9d30: 50 54 53 54 52 28 22 2d 6d 6f 64 65 6c 22 2c 20  PTSTR("-model", 
9d40: 6d 6f 64 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28  model);..OPTOBJ(
9d50: 22 2d 70 61 73 73 77 6f 72 64 22 2c 20 70 61 73  "-password", pas
9d60: 73 77 6f 72 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c  sword);..OPTBOOL
9d70: 28 22 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  ("-post_handshak
9d80: 65 22 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61  e", post_handsha
9d90: 6b 65 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d  ke);..OPTBOOL("-
9da0: 72 65 71 75 65 73 74 22 2c 20 72 65 71 75 65 73  request", reques
9db0: 74 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72  t);..OPTBOOL("-r
9dc0: 65 71 75 69 72 65 22 2c 20 72 65 71 75 69 72 65  equire", require
9dd0: 29 3b 0a 09 4f 50 54 49 4e 54 28 22 2d 73 65 63  );..OPTINT("-sec
9de0: 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 6c 65  urity_level", le
9df0: 76 65 6c 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  vel);..OPTBOOL("
9e00: 2d 73 65 72 76 65 72 22 2c 20 73 65 72 76 65 72  -server", server
9e10: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 72  );..OPTSTR("-ser
9e20: 76 65 72 6e 61 6d 65 22 2c 20 73 65 72 76 65 72  vername", server
9e30: 6e 61 6d 65 29 3b 0a 09 4f 50 54 53 54 52 28 22  name);..OPTSTR("
9e40: 2d 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73 65  -session_id", se
9e50: 73 73 69 6f 6e 5f 69 64 29 3b 0a 09 4f 50 54 42  ssion_id);..OPTB
9e60: 4f 4f 4c 28 22 2d 73 73 6c 32 22 2c 20 73 73 6c  OOL("-ssl2", ssl
9e70: 32 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73  2);..OPTBOOL("-s
9e80: 73 6c 33 22 2c 20 73 73 6c 33 29 3b 0a 09 4f 50  sl3", ssl3);..OP
9e90: 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 22 2c 20 74  TBOOL("-tls1", t
9ea0: 6c 73 31 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22  ls1);..OPTBOOL("
9eb0: 2d 74 6c 73 31 2e 31 22 2c 20 74 6c 73 31 5f 31  -tls1.1", tls1_1
9ec0: 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c  );..OPTBOOL("-tl
9ed0: 73 31 2e 32 22 2c 20 74 6c 73 31 5f 32 29 3b 0a  s1.2", tls1_2);.
9ee0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e  .OPTBOOL("-tls1.
9ef0: 33 22 2c 20 74 6c 73 31 5f 33 29 3b 0a 09 4f 50  3", tls1_3);..OP
9f00: 54 4f 42 4a 28 22 2d 76 61 6c 69 64 61 74 65 63  TOBJ("-validatec
9f10: 6f 6d 6d 61 6e 64 22 2c 20 76 63 6d 64 29 3b 0a  ommand", vcmd);.
9f20: 09 4f 50 54 4f 42 4a 28 22 2d 76 63 6d 64 22 2c  .OPTOBJ("-vcmd",
9f30: 20 76 63 6d 64 29 3b 0a 0a 09 4f 50 54 42 41 44   vcmd);...OPTBAD
9f40: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 61 6c 70  ("option", "-alp
9f50: 6e 2c 20 2d 63 61 64 69 72 2c 20 2d 63 61 66 69  n, -cadir, -cafi
9f60: 6c 65 2c 20 2d 63 61 73 74 6f 72 65 2c 20 2d 63  le, -castore, -c
9f70: 65 72 74 2c 20 2d 63 65 72 74 66 69 6c 65 2c 20  ert, -certfile, 
9f80: 2d 63 69 70 68 65 72 2c 20 2d 63 69 70 68 65 72  -cipher, -cipher
9f90: 73 75 69 74 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64  suites, -command
9fa0: 2c 20 2d 64 68 70 61 72 61 6d 73 2c 20 2d 6b 65  , -dhparams, -ke
9fb0: 79 2c 20 2d 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f  y, -keyfile, -mo
9fc0: 64 65 6c 2c 20 2d 70 61 73 73 77 6f 72 64 2c 20  del, -password, 
9fd0: 2d 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 2c  -post_handshake,
9fe0: 20 2d 72 65 71 75 65 73 74 2c 20 2d 72 65 71 75   -request, -requ
9ff0: 69 72 65 2c 20 2d 73 65 63 75 72 69 74 79 5f 6c  ire, -security_l
a000: 65 76 65 6c 2c 20 2d 73 65 72 76 65 72 2c 20 2d  evel, -server, -
a010: 73 65 72 76 65 72 6e 61 6d 65 2c 20 2d 73 65 73  servername, -ses
a020: 73 69 6f 6e 5f 69 64 2c 20 2d 73 73 6c 32 2c 20  sion_id, -ssl2, 
a030: 2d 73 73 6c 33 2c 20 2d 74 6c 73 31 2c 20 2d 74  -ssl3, -tls1, -t
a040: 6c 73 31 2e 31 2c 20 2d 74 6c 73 31 2e 32 2c 20  ls1.1, -tls1.2, 
a050: 2d 74 6c 73 31 2e 33 2c 20 6f 72 20 2d 76 61 6c  -tls1.3, or -val
a060: 69 64 61 74 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a  idatecommand");.
a070: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
a080: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OR;.    }.    if
a090: 20 28 72 65 71 75 65 73 74 29 09 09 76 65 72 69   (request)..veri
a0a0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
a0b0: 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 20 7c 20 53  _CLIENT_ONCE | S
a0c0: 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52 3b 0a  SL_VERIFY_PEER;.
a0d0: 20 20 20 20 69 66 20 28 72 65 71 75 65 73 74 20      if (request 
a0e0: 26 26 20 72 65 71 75 69 72 65 29 09 76 65 72 69  && require).veri
a0f0: 66 79 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59  fy |= SSL_VERIFY
a100: 5f 46 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52  _FAIL_IF_NO_PEER
a110: 5f 43 45 52 54 3b 0a 20 20 20 20 69 66 20 28 72  _CERT;.    if (r
a120: 65 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68  equest && post_h
a130: 61 6e 64 73 68 61 6b 65 29 09 76 65 72 69 66 79  andshake).verify
a140: 20 7c 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   |= SSL_VERIFY_P
a150: 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 3b 0a 20  OST_HANDSHAKE;. 
a160: 20 20 20 69 66 20 28 76 65 72 69 66 79 20 3d 3d     if (verify ==
a170: 20 30 29 09 09 76 65 72 69 66 79 20 3d 20 53 53   0)..verify = SS
a180: 4c 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a  L_VERIFY_NONE;..
a190: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 73 73      proto |= (ss
a1a0: 6c 32 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  l2 ? TLS_PROTO_S
a1b0: 53 4c 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  SL2 : 0);.    pr
a1c0: 6f 74 6f 20 7c 3d 20 28 73 73 6c 33 20 3f 20 54  oto |= (ssl3 ? T
a1d0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 20 3a 20  LS_PROTO_SSL3 : 
a1e0: 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20 7c 3d  0);.    proto |=
a1f0: 20 28 74 6c 73 31 20 3f 20 54 4c 53 5f 50 52 4f   (tls1 ? TLS_PRO
a200: 54 4f 5f 54 4c 53 31 20 3a 20 30 29 3b 0a 20 20  TO_TLS1 : 0);.  
a210: 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31    proto |= (tls1
a220: 5f 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  _1 ? TLS_PROTO_T
a230: 4c 53 31 5f 31 20 3a 20 30 29 3b 0a 20 20 20 20  LS1_1 : 0);.    
a240: 70 72 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 32  proto |= (tls1_2
a250: 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53   ? TLS_PROTO_TLS
a260: 31 5f 32 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  1_2 : 0);.    pr
a270: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 33 20 3f  oto |= (tls1_3 ?
a280: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
a290: 33 20 3a 20 30 29 3b 0a 0a 20 20 20 20 2f 2a 20  3 : 0);..    /* 
a2a0: 72 65 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66  reset to NULL if
a2b0: 20 62 6c 61 6e 6b 20 73 74 72 69 6e 67 20 70 72   blank string pr
a2c0: 6f 76 69 64 65 64 20 2a 2f 0a 20 20 20 20 69 66  ovided */.    if
a2d0: 20 28 63 65 72 74 20 26 26 20 21 2a 63 65 72 74   (cert && !*cert
a2e0: 29 09 09 20 20 20 20 20 20 20 20 63 65 72 74 09  )..        cert.
a2f0: 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a          = NULL;.
a300: 20 20 20 20 69 66 20 28 6b 65 79 20 26 26 20 21      if (key && !
a310: 2a 6b 65 79 29 09 09 20 20 20 20 20 20 20 20 6b  *key)..        k
a320: 65 79 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  ey.        = NUL
a330: 4c 3b 0a 20 20 20 20 69 66 20 28 63 65 72 74 66  L;.    if (certf
a340: 69 6c 65 20 26 26 20 21 2a 63 65 72 74 66 69 6c  ile && !*certfil
a350: 65 29 20 20 20 20 20 20 20 20 20 63 65 72 74 66  e)         certf
a360: 69 6c 65 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  ile.= NULL;.    
a370: 69 66 20 28 6b 65 79 66 69 6c 65 20 26 26 20 21  if (keyfile && !
a380: 2a 6b 65 79 66 69 6c 65 29 09 09 6b 65 79 66 69  *keyfile)..keyfi
a390: 6c 65 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  le.        = NUL
a3a0: 4c 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  L;.    if (ciphe
a3b0: 72 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 29  rs && !*ciphers)
a3c0: 09 20 20 20 20 20 20 20 20 63 69 70 68 65 72 73  .        ciphers
a3d0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a3e0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 73  .    if (ciphers
a3f0: 75 69 74 65 73 20 26 26 20 21 2a 63 69 70 68 65  uites && !*ciphe
a400: 72 73 75 69 74 65 73 29 20 63 69 70 68 65 72 73  rsuites) ciphers
a410: 75 69 74 65 73 20 20 20 20 3d 20 4e 55 4c 4c 3b  uites    = NULL;
a420: 0a 20 20 20 20 69 66 20 28 43 41 66 69 6c 65 20  .    if (CAfile 
a430: 26 26 20 21 2a 43 41 66 69 6c 65 29 09 20 20 20  && !*CAfile).   
a440: 20 20 20 20 20 43 41 66 69 6c 65 09 20 20 20 20       CAfile.    
a450: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a460: 69 66 20 28 43 41 70 61 74 68 20 26 26 20 21 2a  if (CApath && !*
a470: 43 41 70 61 74 68 29 09 20 20 20 20 20 20 20 20  CApath).        
a480: 43 41 70 61 74 68 09 20 20 20 20 20 20 20 20 3d  CApath.        =
a490: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 43   NULL;.    if (C
a4a0: 41 73 74 6f 72 65 20 26 26 20 21 2a 43 41 73 74  Astore && !*CAst
a4b0: 6f 72 65 29 09 20 20 20 20 20 20 20 20 43 41 73  ore).        CAs
a4c0: 74 6f 72 65 09 20 20 20 20 20 20 20 20 3d 20 4e  tore.        = N
a4d0: 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28 44 48 70  ULL;.    if (DHp
a4e0: 61 72 61 6d 73 20 26 26 20 21 2a 44 48 70 61 72  arams && !*DHpar
a4f0: 61 6d 73 29 09 20 20 20 20 20 20 20 20 44 48 70  ams).        DHp
a500: 61 72 61 6d 73 20 20 20 20 20 20 20 20 3d 20 4e  arams        = N
a510: 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 6e 65 77  ULL;..    /* new
a520: 20 53 53 4c 20 73 74 61 74 65 20 2a 2f 0a 20 20   SSL state */.  
a530: 20 20 73 74 61 74 65 50 74 72 09 09 3d 20 28 53    statePtr..= (S
a540: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28  tate *) ckalloc(
a550: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f  (unsigned) sizeo
a560: 66 28 53 74 61 74 65 29 29 3b 0a 20 20 20 20 6d  f(State));.    m
a570: 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20  emset(statePtr, 
a580: 30 2c 20 73 69 7a 65 6f 66 28 53 74 61 74 65 29  0, sizeof(State)
a590: 29 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72  );..    statePtr
a5a0: 2d 3e 66 6c 61 67 73 09 3d 20 66 6c 61 67 73 3b  ->flags.= flags;
a5b0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 69  .    statePtr->i
a5c0: 6e 74 65 72 70 09 3d 20 69 6e 74 65 72 70 3b 0a  nterp.= interp;.
a5d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61      statePtr->wa
a5e0: 6e 74 09 3d 20 30 3b 0a 20 20 20 20 73 74 61 74  nt.= 0;.    stat
a5f0: 65 50 74 72 2d 3e 76 66 6c 61 67 73 09 3d 20 76  ePtr->vflags.= v
a600: 65 72 69 66 79 3b 0a 20 20 20 20 73 74 61 74 65  erify;.    state
a610: 50 74 72 2d 3e 65 72 72 09 3d 20 22 22 3b 0a 0a  Ptr->err.= "";..
a620: 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20      /* allocate 
a630: 73 63 72 69 70 74 20 2a 2f 0a 20 20 20 20 69 66  script */.    if
a640: 20 28 73 63 72 69 70 74 29 20 7b 0a 09 28 76 6f   (script) {..(vo
a650: 69 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  id) Tcl_GetStrin
a660: 67 46 72 6f 6d 4f 62 6a 28 73 63 72 69 70 74 2c  gFromObj(script,
a670: 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e   &len);..if (len
a680: 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50 74  ) {..    statePt
a690: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 20 73 63  r->callback = sc
a6a0: 72 69 70 74 3b 0a 09 20 20 20 20 54 63 6c 5f 49  ript;..    Tcl_I
a6b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ncrRefCount(stat
a6c0: 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
a6d0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
a6e0: 2a 20 61 6c 6c 6f 63 61 74 65 20 70 61 73 73 77  * allocate passw
a6f0: 6f 72 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  ord */.    if (p
a700: 61 73 73 77 6f 72 64 29 20 7b 0a 09 28 76 6f 69  assword) {..(voi
a710: 64 29 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  d) Tcl_GetString
a720: 46 72 6f 6d 4f 62 6a 28 70 61 73 73 77 6f 72 64  FromObj(password
a730: 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65  , &len);..if (le
a740: 6e 29 20 7b 0a 09 20 20 20 20 73 74 61 74 65 50  n) {..    stateP
a750: 74 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 70  tr->password = p
a760: 61 73 73 77 6f 72 64 3b 0a 09 20 20 20 20 54 63  assword;..    Tc
a770: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73  l_IncrRefCount(s
a780: 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
a790: 64 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  d);..}.    }..  
a7a0: 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 76 61    /* allocate va
a7b0: 6c 69 64 61 74 65 20 63 6f 6d 6d 61 6e 64 20 2a  lidate command *
a7c0: 2f 0a 20 20 20 20 69 66 20 28 76 63 6d 64 29 20  /.    if (vcmd) 
a7d0: 7b 0a 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65  {..(void) Tcl_Ge
a7e0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 76  tStringFromObj(v
a7f0: 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  cmd, &len);..if 
a800: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a810: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 20 76 63  tePtr->vcmd = vc
a820: 6d 64 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  md;..    Tcl_Inc
a830: 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50  rRefCount(stateP
a840: 74 72 2d 3e 76 63 6d 64 29 3b 0a 09 7d 0a 20 20  tr->vcmd);..}.  
a850: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64    }..    if (mod
a860: 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69  el != NULL) {..i
a870: 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a 20 47 65 74  nt mode;../* Get
a880: 20 74 68 65 20 22 6d 6f 64 65 6c 22 20 63 6f 6e   the "model" con
a890: 74 65 78 74 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  text */..chan = 
a8a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69  Tcl_GetChannel(i
a8b0: 6e 74 65 72 70 2c 20 6d 6f 64 65 6c 2c 20 26 6d  nterp, model, &m
a8c0: 6f 64 65 29 3b 0a 09 69 66 20 28 63 68 61 6e 20  ode);..if (chan 
a8d0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29  == (Tcl_Channel)
a8e0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
a8f0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
a900: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
a910: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
a920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09  TCL_ERROR;..}...
a930: 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20 73 75 72 65  /*.. * Make sure
a940: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74   to operate on t
a950: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e  he topmost chann
a960: 65 6c 0a 09 20 2a 2f 0a 09 63 68 61 6e 20 3d 20  el.. */..chan = 
a970: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65  Tcl_GetTopChanne
a980: 6c 28 63 68 61 6e 29 3b 0a 09 69 66 20 28 54 63  l(chan);..if (Tc
a990: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
a9a0: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
a9b0: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
a9c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a9d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61  sult(interp, "ba
a9e0: 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54  d channel \"", T
a9f0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d  cl_GetChannelNam
aa00: 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20  e(chan),..."\": 
aa10: 6e 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65  not a TLS channe
aa20: 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  l", (char *) NUL
aa30: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
aa40: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
aa50: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
aa60: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49  ", "CHANNEL", "I
aa70: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a  NVALID", (char *
aa80: 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c  ) NULL);..    Tl
aa90: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
aaa0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
aab0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
aac0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 63  TCL_ERROR;..}..c
aad0: 74 78 20 3d 20 28 28 53 74 61 74 65 20 2a 29 54  tx = ((State *)T
aae0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73  cl_GetChannelIns
aaf0: 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 29 29  tanceData(chan))
ab00: 2d 3e 63 74 78 3b 0a 20 20 20 20 7d 20 65 6c 73  ->ctx;.    } els
ab10: 65 20 7b 0a 09 69 66 20 28 28 63 74 78 20 3d 20  e {..if ((ctx = 
ab20: 43 54 58 5f 49 6e 69 74 28 73 74 61 74 65 50 74  CTX_Init(statePt
ab30: 72 2c 20 73 65 72 76 65 72 2c 20 70 72 6f 74 6f  r, server, proto
ab40: 2c 20 6b 65 79 66 69 6c 65 2c 20 63 65 72 74 66  , keyfile, certf
ab50: 69 6c 65 2c 20 6b 65 79 2c 20 63 65 72 74 2c 20  ile, key, cert, 
ab60: 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20 20 20 63 65  key_len,..    ce
ab70: 72 74 5f 6c 65 6e 2c 20 43 41 70 61 74 68 2c 20  rt_len, CApath, 
ab80: 43 41 73 74 6f 72 65 2c 20 43 41 66 69 6c 65 2c  CAstore, CAfile,
ab90: 20 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72   ciphers, cipher
aba0: 73 75 69 74 65 73 2c 20 6c 65 76 65 6c 2c 20 44  suites, level, D
abb0: 48 70 61 72 61 6d 73 29 29 20 3d 3d 20 4e 55 4c  Hparams)) == NUL
abc0: 4c 29 20 7b 0a 09 20 20 20 20 54 6c 73 5f 46 72  L) {..    Tls_Fr
abd0: 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79 70  ee((tls_free_typ
abe0: 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b 0a  e *) statePtr);.
abf0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
ac00: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a  ERROR;..}.    }.
ac10: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 63  .    statePtr->c
ac20: 74 78 20 3d 20 63 74 78 3b 0a 0a 20 20 20 20 2f  tx = ctx;..    /
ac30: 2a 20 50 72 65 73 65 72 76 65 20 63 68 61 6e 6e  * Preserve chann
ac40: 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20  el config */.   
ac50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
ac60: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
ac70: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
ac80: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
ac90: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
aca0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
acb0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
acc0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
acd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ace0: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
acf0: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ad00: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ad10: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ad20: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
ad30: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
ad40: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
ad50: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ad60: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
ad70: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
ad80: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
ad90: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
ada0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
adb0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
adc0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
add0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
ade0: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
adf0: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ae00: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ae10: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ae20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ae30: 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 6e 73 75 72  );..    /* Ensur
ae40: 65 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 6f  e the channel wo
ae50: 72 6b 73 20 69 6e 20 62 69 6e 61 72 79 20 6d 6f  rks in binary mo
ae60: 64 65 20 28 66 6f 72 20 74 68 65 20 65 6e 63 72  de (for the encr
ae70: 79 70 74 69 6f 6e 20 6e 6f 74 20 74 6f 20 67 65  yption not to ge
ae80: 74 20 67 6f 6f 66 65 64 20 75 70 29 2e 20 2a 2f  t goofed up). */
ae90: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
aea0: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
aeb0: 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c  , chan, "-transl
aec0: 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22  ation", "binary"
aed0: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
aee0: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
aef0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c 6f 63  rp, chan, "-bloc
af00: 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29 3b 0a  king", "true");.
af10: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73  .    /* Create s
af20: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 2a  tacked channel *
af30: 2f 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  /.    dprintf("C
af40: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
af50: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
af60: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
af70: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
af80: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
af90: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
afa0: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
afb0: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
afc0: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54  a) statePtr,..(T
afd0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
afe0: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
aff0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
b000: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
b010: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
b020: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
b030: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
b040: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
b050: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
b060: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
b070: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
b080: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
b090: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
b0a0: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
b0b0: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
b0c0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
b0d0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
b0e0: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  r);..Tcl_DString
b0f0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
b100: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
b110: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
b120: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
b130: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53  coding);..Tcl_DS
b140: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
b150: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
b160: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
b170: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b180: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72  locking);..retur
b190: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b1a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 74 6f   }..    /* Resto
b1b0: 72 65 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69  re channel confi
b1c0: 67 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74  g */.    Tcl_Set
b1d0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
b1e0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e  terp, statePtr->
b1f0: 73 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74  self, "-translat
b200: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
b210: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
b220: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
b230: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
b240: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
b250: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65  rp, statePtr->se
b260: 6c 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c  lf, "-encoding",
b270: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
b280: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  e(&upperChannelE
b290: 6e 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54  ncoding));.    T
b2a0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74  cl_SetChannelOpt
b2b0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74  ion(interp, stat
b2c0: 65 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f  ePtr->self, "-eo
b2d0: 66 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72  fchar", Tcl_DStr
b2e0: 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43  ingValue(&upperC
b2f0: 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b  hannelEOFChar));
b300: 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e  .    Tcl_SetChan
b310: 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70  nelOption(interp
b320: 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66  , statePtr->self
b330: 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54  , "-blocking", T
b340: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
b350: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
b360: 63 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c  cking));.    Tcl
b370: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70  _DStringFree(&up
b380: 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c  perChannelTransl
b390: 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  ation);.    Tcl_
b3a0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b3b0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
b3c0: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  g);.    Tcl_DStr
b3d0: 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68  ingFree(&upperCh
b3e0: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20  annelEOFChar);. 
b3f0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
b400: 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ee(&upperChannel
b410: 42 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20  Blocking);..    
b420: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e  /*.     * SSL In
b430: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20  itialization.   
b440: 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74    */.    statePt
b450: 72 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77  r->ssl = SSL_new
b460: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
b470: 0a 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50  .    if (!stateP
b480: 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53  tr->ssl) {../* S
b490: 53 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72  SL library error
b4a0: 20 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52   */..Tcl_AppendR
b4b0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
b4c0: 6f 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63  ouldn't construc
b4d0: 74 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22  t ssl session: "
b4e0: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
b4f0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
b500: 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74  L);..    Tcl_Set
b510: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
b520: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
b530: 22 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c  ", "INIT", "FAIL
b540: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
b550: 4c 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28  LL);..Tls_Free((
b560: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
b570: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74   statePtr);..ret
b580: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b590: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74     }..    /* Set
b5a0: 20 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d   host server nam
b5b0: 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72  e */.    if (ser
b5c0: 76 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53  vername) {../* S
b5d0: 65 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e  ets the server n
b5e0: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
b5f0: 53 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65  SNI) in ClientHe
b600: 6c 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f  llo extension */
b610: 0a 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36  ../* Per RFC 606
b620: 36 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61  6, hostname is a
b630: 20 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73   ASCII encoded s
b640: 74 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46  tring, though RF
b650: 43 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d  C 4366 says UTF-
b660: 38 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f  8. */..if (!SSL_
b670: 73 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f  set_tlsext_host_
b680: 6e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  name(statePtr->s
b690: 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20  sl, servername) 
b6a0: 26 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20  && require) {.. 
b6b0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
b6c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74  ult(interp, "Set
b6d0: 20 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66   SNI extension f
b6e0: 61 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52  ailed: ", GET_ER
b6f0: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
b700: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b710: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
b720: 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
b730: 20 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22   "IMPORT", "SNI"
b740: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
b750: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
b760: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
b770: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
b780: 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75  ePtr);..    retu
b790: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d  rn TCL_ERROR;..}
b7a0: 0a 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61  .../* Set hostna
b7b0: 6d 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74  me for peer cert
b7c0: 69 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65  ificate hostname
b7d0: 20 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e   verification in
b7e0: 20 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f   clients...   Do
b7f0: 6e 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31  n't use SSL_set1
b800: 5f 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68  _host since it h
b810: 61 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20  as limitations. 
b820: 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64  */..if (!SSL_add
b830: 31 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d  1_host(statePtr-
b840: 3e 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65  >ssl, servername
b850: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
b860: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b870: 70 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74  p, "Set DNS host
b880: 6e 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  name failed: ", 
b890: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
b8a0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
b8b0: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72  ;..    Tcl_SetEr
b8c0: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
b8d0: 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c  "TLS", "IMPORT",
b8e0: 20 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41   "HOSTNAME", "FA
b8f0: 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ILED", (char *) 
b900: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f  NULL);..    Tls_
b910: 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74  Free((tls_free_t
b920: 79 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29  ype *) statePtr)
b930: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
b940: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20  L_ERROR;..}.    
b950: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65  }..    /* Resume
b960: 20 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20   session id */. 
b970: 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69     if (session_i
b980: 64 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73  d && strlen(sess
b990: 69 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d  ion_id) <= SSL_M
b9a0: 41 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54  AX_SID_CTX_LENGT
b9b0: 48 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74  H) {../* SSL_set
b9c0: 5f 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69  _session() */..i
b9d0: 66 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f  f (!SSL_SESSION_
b9e0: 73 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28  set1_id_context(
b9f0: 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28  SSL_get_session(
ba00: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a  statePtr->ssl),.
ba10: 09 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ..(const unsigne
ba20: 64 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f  d char *) sessio
ba30: 6e 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20  n_id, (unsigned 
ba40: 69 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73  int) strlen(sess
ba50: 69 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20  ion_id))) {..   
ba60: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
ba70: 74 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d  t(interp, "Resum
ba80: 65 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64  e session failed
ba90: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
baa0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
bab0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f  NULL);..    Tcl_
bac0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
bad0: 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50  erp, "TLS", "IMP
bae0: 4f 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c  ORT", "SESSION",
baf0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
bb00: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
bb10: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
bb20: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
bb30: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
bb40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
bb50: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e      }..    /* En
bb60: 61 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e  able Application
bb70: 2d 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20  -Layer Protocol 
bb80: 4e 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61  Negotiation. Exa
bb90: 6d 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f  mples are: http/
bba0: 31 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20  1.0,..http/1.1, 
bbb0: 68 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61  h2, h3, ftp, ima
bbc0: 70 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c  p, pop3, xmpp-cl
bbd0: 69 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65  ient, xmpp-serve
bbe0: 72 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74  r, mqtt, irc, et
bbf0: 63 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c  c. */.    if (al
bc00: 70 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72  pn) {../* Conver
bc10: 74 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74  t a TCL list int
bc20: 6f 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  o a protocol-lis
bc30: 74 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74  t in wire-format
bc40: 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68   */..unsigned ch
bc50: 61 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a  ar *protos, *p;.
bc60: 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72  .unsigned int pr
bc70: 6f 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54  otos_len = 0;..T
bc80: 63 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a  cl_Size cnt, i;.
bc90: 09 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a  .int j;..Tcl_Obj
bca0: 20 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54   **list;...if (T
bcb0: 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
bcc0: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c  ments(interp, al
bcd0: 70 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29  pn, &cnt, &list)
bce0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
bcf0: 20 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73     Tls_Free((tls
bd00: 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74  _free_type *) st
bd10: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65  atePtr);..    re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bd30: 09 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e  .}.../* Determin
bd40: 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71  e the memory req
bd50: 75 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72  uired for the pr
bd60: 6f 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09  otocol-list */..
bd70: 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20  for (i = 0; i < 
bd80: 63 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20  cnt; i++) {..   
bd90: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
bda0: 6f 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26  omObj(list[i], &
bdb0: 6c 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c  len);..    if (l
bdc0: 65 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63  en > 255) {...Tc
bdd0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
bde0: 6e 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f  nterp, "ALPN pro
bdf0: 74 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20  tocol names too 
be00: 6c 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20  long", (char *) 
be10: 4e 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74  NULL);...Tcl_Set
be20: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70  ErrorCode(interp
be30: 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54  , "TLS", "IMPORT
be40: 22 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c  ", "ALPN", "FAIL
be50: 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ED", (char *) NU
be60: 4c 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28  LL);...Tls_Free(
be70: 28 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a  (tls_free_type *
be80: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72  ) statePtr);...r
be90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
bea0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f  ..    }..    pro
beb0: 74 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28  tos_len += 1 + (
bec0: 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f  int) len;..}.../
bed0: 2a 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70  * Build the comp
bee0: 6c 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69  lete protocol-li
bef0: 73 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20  st */..protos = 
bf00: 63 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c  ckalloc(protos_l
bf10: 65 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f  en);../* protoco
bf20: 6c 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20  l-lists consist 
bf30: 6f 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d  of 8-bit length-
bf40: 70 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73  prefixed, byte s
bf50: 74 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28  trings */..for (
bf60: 6a 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f  j = 0, p = proto
bf70: 73 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29  s; j < cnt; j++)
bf80: 20 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74   {..    char *st
bf90: 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  r = Tcl_GetStrin
bfa0: 67 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d  gFromObj(list[j]
bfb0: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70  , &len);..    *p
bfc0: 2b 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63  ++ = (unsigned c
bfd0: 68 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d  har) len;..    m
bfe0: 65 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73  emcpy(p, str, (s
bff0: 69 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20  ize_t) len);..  
c000: 20 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a    p += len;..}..
c010: 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e  ./* SSL_set_alpn
c020: 5f 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20  _protos makes a 
c030: 63 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74  copy of the prot
c040: 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a  ocol-list */../*
c050: 20 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63   Note: This func
c060: 74 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68  tion reverses th
c070: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63  e return value c
c080: 6f 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66  onvention */..if
c090: 20 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70   (SSL_set_alpn_p
c0a0: 72 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e  rotos(statePtr->
c0b0: 73 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f  ssl, protos, pro
c0c0: 74 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20  tos_len)) {..   
c0d0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
c0e0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41  t(interp, "Set A
c0f0: 4c 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61  LPN protocols fa
c100: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
c110: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
c120: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
c130: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
c140: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
c150: 22 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22  "IMPORT", "ALPN"
c160: 2c 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61  , "FAILED", (cha
c170: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
c180: 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66   Tls_Free((tls_f
c190: 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74  ree_type *) stat
c1a0: 65 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72  ePtr);..    ckfr
c1b0: 65 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20  ee(protos);..   
c1c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
c1d0: 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65  R;..}.../* Store
c1e0: 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20   protocols list 
c1f0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72  */..statePtr->pr
c200: 6f 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09  otos = protos;..
c210: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c220: 5f 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65  _len = protos_le
c230: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
c240: 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  .statePtr->proto
c250: 73 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65  s = NULL;..state
c260: 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20  Ptr->protos_len 
c270: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
c280: 2f 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61  /*.     * SSL Ca
c290: 6c 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a  llbacks.     */.
c2a0: 20 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f      SSL_set_app_
c2b0: 64 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73  data(statePtr->s
c2c0: 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  sl, (void *)stat
c2d0: 65 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20  ePtr);./* point 
c2e0: 62 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20  back to us */.  
c2f0: 20 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79    SSL_set_verify
c300: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c310: 76 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61  verify, VerifyCa
c320: 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53  llback);.    /*S
c330: 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65  SL_set_verify_de
c340: 70 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69  pth(SSL_set_veri
c350: 66 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a  fy_depth, 0);*/.
c360: 20 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f      SSL_set_info
c370: 5f 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50  _callback(stateP
c380: 74 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c  tr->ssl, InfoCal
c390: 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20  lback);..    /* 
c3a0: 43 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73  Callback for obs
c3b0: 65 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  erving protocol 
c3c0: 6d 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e  messages */.#ifn
c3d0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  def OPENSSL_NO_S
c3e0: 53 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20  SL_TRACE.    /* 
c3f0: 76 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74  void SSL_CTX_set
c400: 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72  _msg_callback_ar
c410: 67 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c  g(statePtr->ctx,
c420: 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74   (void *)statePt
c430: 72 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c  r);.    void SSL
c440: 5f 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c  _CTX_set_msg_cal
c450: 6c 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e  lback(statePtr->
c460: 63 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c  ctx, MessageCall
c470: 62 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53  back); */.    SS
c480: 4c 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61  L_set_msg_callba
c490: 63 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d  ck_arg(statePtr-
c4a0: 3e 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74  >ssl, (void *)st
c4b0: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c  atePtr);.    SSL
c4c0: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c4d0: 6b 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  k(statePtr->ssl,
c4e0: 20 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b   MessageCallback
c4f0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  );.#endif..    /
c500: 2a 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61  * Create Tcl_Cha
c510: 6e 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72  nnel BIO Handler
c520: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
c530: 2d 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65  ->p_bio.= BIO_ne
c540: 77 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20  w_tcl(statePtr, 
c550: 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20  BIO_NOCLOSE);.  
c560: 20 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09    statePtr->bio.
c570: 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f  = BIO_new(BIO_f_
c580: 73 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20  ssl());..    if 
c590: 28 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53  (server) {../* S
c5a0: 65 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20  erver callbacks 
c5b0: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
c5c0: 74 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d  tlsext_servernam
c5d0: 65 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  e_arg(statePtr->
c5e0: 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ctx, (void *)sta
c5f0: 74 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58  tePtr);..SSL_CTX
c600: 5f 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76  _set_tlsext_serv
c610: 65 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28  ername_callback(
c620: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53  statePtr->ctx, S
c630: 4e 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53  NICallback);..SS
c640: 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74  L_CTX_set_client
c650: 5f 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50  _hello_cb(stateP
c660: 74 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61  tr->ctx, HelloCa
c670: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c680: 73 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28  statePtr);..if (
c690: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c6a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   != NULL) {..   
c6b0: 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70   SSL_CTX_set_alp
c6c0: 6e 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  n_select_cb(stat
c6d0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c6e0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c6f0: 29 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64  )statePtr);.#ifd
c700: 65 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20  ef USE_NPN..    
c710: 69 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20  if (tls1_2 == 0 
c720: 26 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20  && tls1_3 == 0) 
c730: 7b 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  {...SSL_CTX_set_
c740: 6e 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65  next_protos_adve
c750: 72 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50  rtised_cb(stateP
c760: 74 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c  tr->ctx, NPNCall
c770: 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74  back, (void *)st
c780: 61 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a  atePtr);..    }.
c790: 23 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45  #endif..}.../* E
c7a0: 6e 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20  nable server to 
c7b0: 73 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73  send cert reques
c7c0: 74 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b  t after handshak
c7d0: 65 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29  e (TLS 1.3 only)
c7e0: 20 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20   */../* A write 
c7f0: 6f 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74  operation must t
c800: 61 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68  ake place for th
c810: 65 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65  e Certificate Re
c820: 71 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20  quest to be..   
c830: 73 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65  sent to the clie
c840: 6e 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20  nt, this can be 
c850: 64 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f  done with SSL_do
c860: 5f 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f  _handshake(). */
c870: 0a 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26  ..if (request &&
c880: 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20   post_handshake 
c890: 26 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20  && tls1_3) {..  
c8a0: 20 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69    SSL_verify_cli
c8b0: 65 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61  ent_post_handsha
c8c0: 6b 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ke(statePtr->ssl
c8d0: 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20 73  );..}.../* Set s
c8e0: 65 72 76 65 72 20 6d 6f 64 65 20 2a 2f 0a 09 73  erver mode */..s
c8f0: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c  tatePtr->flags |
c900: 3d 20 54 4c 53 5f 54 43 4c 5f 53 45 52 56 45 52  = TLS_TCL_SERVER
c910: 3b 0a 09 53 53 4c 5f 73 65 74 5f 61 63 63 65 70  ;..SSL_set_accep
c920: 74 5f 73 74 61 74 65 28 73 74 61 74 65 50 74 72  t_state(statePtr
c930: 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c  ->ssl);.    } el
c940: 73 65 20 7b 0a 09 2f 2a 20 43 6c 69 65 6e 74 20  se {../* Client 
c950: 63 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 23 69 66  callbacks */.#if
c960: 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09 69 66 20  def USE_NPN..if 
c970: 28 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f  (statePtr->proto
c980: 73 20 21 3d 20 4e 55 4c 4c 20 26 26 20 74 6c 73  s != NULL && tls
c990: 31 5f 32 20 3d 3d 20 30 20 26 26 20 74 6c 73 31  1_2 == 0 && tls1
c9a0: 5f 33 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20  _3 == 0) {..    
c9b0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e 65 78 74  SSL_CTX_set_next
c9c0: 5f 70 72 6f 74 6f 5f 73 65 6c 65 63 74 5f 63 62  _proto_select_cb
c9d0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c9e0: 41 4c 50 4e 43 61 6c 6c 62 61 63 6b 2c 20 28 76  ALPNCallback, (v
c9f0: 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72 29 3b  oid *)statePtr);
ca00: 0a 09 7d 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20  ..}.#endif.../* 
ca10: 53 65 73 73 69 6f 6e 20 63 61 63 68 69 6e 67 20  Session caching 
ca20: 2a 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  */..SSL_CTX_set_
ca30: 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
ca40: 64 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78  de(statePtr->ctx
ca50: 2c 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48 45  , SSL_SESS_CACHE
ca60: 5f 43 4c 49 45 4e 54 20 7c 20 53 53 4c 5f 53 45  _CLIENT | SSL_SE
ca70: 53 53 5f 43 41 43 48 45 5f 4e 4f 5f 49 4e 54 45  SS_CACHE_NO_INTE
ca80: 52 4e 41 4c 5f 53 54 4f 52 45 29 3b 0a 09 53 53  RNAL_STORE);..SS
ca90: 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f 6e  L_CTX_sess_set_n
caa0: 65 77 5f 63 62 28 73 74 61 74 65 50 74 72 2d 3e  ew_cb(statePtr->
cab0: 63 74 78 2c 20 53 65 73 73 69 6f 6e 43 61 6c 6c  ctx, SessionCall
cac0: 62 61 63 6b 29 3b 0a 0a 09 2f 2a 20 45 6e 61 62  back);.../* Enab
cad0: 6c 65 20 70 6f 73 74 20 68 61 6e 64 73 68 61 6b  le post handshak
cae0: 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  e Authentication
caf0: 20 65 78 74 65 6e 73 69 6f 6e 2e 20 54 4c 53 20   extension. TLS 
cb00: 31 2e 33 20 6f 6e 6c 79 2c 20 6e 6f 74 20 68 74  1.3 only, not ht
cb10: 74 70 2f 32 2e 20 2a 2f 0a 09 69 66 20 28 72 65  tp/2. */..if (re
cb20: 71 75 65 73 74 20 26 26 20 70 6f 73 74 5f 68 61  quest && post_ha
cb30: 6e 64 73 68 61 6b 65 29 20 7b 0a 09 20 20 20 20  ndshake) {..    
cb40: 53 53 4c 5f 73 65 74 5f 70 6f 73 74 5f 68 61 6e  SSL_set_post_han
cb50: 64 73 68 61 6b 65 5f 61 75 74 68 28 73 74 61 74  dshake_auth(stat
cb60: 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b 0a 09  ePtr->ssl, 1);..
cb70: 7d 0a 0a 09 2f 2a 20 53 65 74 20 63 6c 69 65 6e  }.../* Set clien
cb80: 74 20 6d 6f 64 65 20 2a 2f 0a 09 53 53 4c 5f 73  t mode */..SSL_s
cb90: 65 74 5f 63 6f 6e 6e 65 63 74 5f 73 74 61 74 65  et_connect_state
cba0: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b  (statePtr->ssl);
cbb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
cbc0: 65 74 20 42 49 4f 20 66 6f 72 20 72 65 61 64 20  et BIO for read 
cbd0: 61 6e 64 20 77 72 69 74 65 20 6f 70 65 72 61 74  and write operat
cbe0: 69 6f 6e 73 20 6f 6e 20 53 53 4c 20 6f 62 6a 65  ions on SSL obje
cbf0: 63 74 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 73 65  ct */.    SSL_se
cc00: 74 5f 62 69 6f 28 73 74 61 74 65 50 74 72 2d 3e  t_bio(statePtr->
cc10: 73 73 6c 2c 20 73 74 61 74 65 50 74 72 2d 3e 70  ssl, statePtr->p
cc20: 5f 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e  _bio, statePtr->
cc30: 70 5f 62 69 6f 29 3b 0a 20 20 20 20 42 49 4f 5f  p_bio);.    BIO_
cc40: 73 65 74 5f 73 73 6c 28 73 74 61 74 65 50 74 72  set_ssl(statePtr
cc50: 2d 3e 62 69 6f 2c 20 73 74 61 74 65 50 74 72 2d  ->bio, statePtr-
cc60: 3e 73 73 6c 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53  >ssl, BIO_NOCLOS
cc70: 45 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  E);.    BIO_set_
cc80: 73 73 6c 5f 6d 6f 64 65 28 73 74 61 74 65 50 74  ssl_mode(statePt
cc90: 72 2d 3e 62 69 6f 2c 20 28 6c 6f 6e 67 29 20 21  r->bio, (long) !
cca0: 73 65 72 76 65 72 29 3b 0a 0a 20 20 20 20 2f 2a  server);..    /*
ccb0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 6f 66 20 53  .     * End of S
ccc0: 53 4c 20 49 6e 69 74 0a 20 20 20 20 20 2a 2f 0a  SL Init.     */.
ccd0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74      dprintf("Ret
cce0: 75 72 6e 69 6e 67 20 25 73 22 2c 20 54 63 6c 5f  urning %s", Tcl_
ccf0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
cd00: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
cd10: 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
cd20: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
cd30: 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e   *) Tcl_GetChann
cd40: 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d  elName(statePtr-
cd50: 3e 73 65 6c 66 29 2c 20 54 43 4c 5f 56 4f 4c 41  >self), TCL_VOLA
cd60: 54 49 4c 45 29 3b 0a 0a 20 20 20 20 72 65 74 75  TILE);..    retu
cd70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
cd80: 2a 0a 20 2a 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 2d 2d 2d 2d  ----------------
cdc0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e  -------. *. * Un
cdd0: 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 20 2d 2d 0a  importObjCmd --.
cde0: 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65   *. *.This proce
cdf0: 64 75 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20  dure is invoked 
ce00: 74 6f 20 72 65 6d 6f 76 65 20 74 68 65 20 74 6f  to remove the to
ce10: 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 66 69  pmost channel fi
ce20: 6c 74 65 72 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  lter.. *. * Resu
ce30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
ce40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
ce50: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
ce60: 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64 69 66 79  s:. *.May modify
ce70: 20 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66   the behavior of
ce80: 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65 6c 2e 0a   an IO channel..
ce90: 20 2a 0a 20 2a 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 2d 2d 2d  ----------------
ced0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61  --------. */.sta
cee0: 74 69 63 20 69 6e 74 0a 55 6e 69 6d 70 6f 72 74  tic int.Unimport
cef0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
cf00: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
cf10: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
cf20: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
cf30: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
cf40: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
cf50: 6e 6e 65 6c 20 63 68 61 6e 2c 20 70 61 72 65 6e  nnel chan, paren
cf60: 74 3b 09 2f 2a 20 54 68 65 20 73 74 61 63 6b 65  t;./* The stacke
cf70: 64 20 61 6e 64 20 75 6e 64 65 72 6c 79 69 6e 67  d and underlying
cf80: 20 63 68 61 6e 6e 65 6c 73 20 2a 2f 0a 20 20 20   channels */.   
cf90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 75 70 70   Tcl_DString upp
cfa0: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
cfb0: 74 69 6f 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e  tion, upperChann
cfc0: 65 6c 42 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65  elBlocking, uppe
cfd0: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
cfe0: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f  , upperChannelEO
cff0: 46 43 68 61 72 3b 0a 20 20 20 20 69 6e 74 20 72  FChar;.    int r
d000: 65 73 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  es = TCL_OK;.   
d010: 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61   (void) clientDa
d020: 74 61 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ta;..    dprintf
d030: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
d040: 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20   if (objc != 2) 
d050: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
d060: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
d070: 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b  bjv, "channel");
d080: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d090: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d0a0: 2a 20 56 61 6c 69 64 61 74 65 20 63 68 61 6e 6e  * Validate chann
d0b0: 65 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63  el name */.    c
d0c0: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
d0d0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
d0e0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d0f0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
d100: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
d110: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
d120: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
d130: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
d140: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
d150: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
d160: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
d170: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
d180: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
d190: 68 61 6e 29 3b 0a 20 20 20 20 70 61 72 65 6e 74  han);.    parent
d1a0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65   = Tcl_GetStacke
d1b0: 64 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a  dChannel(chan);.
d1c0: 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 69  .    /* Verify i
d1d0: 73 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e  s a stacked chan
d1e0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 70  nel */.    if (p
d1f0: 61 72 65 6e 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b  arent == NULL) {
d200: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
d210: 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20  lt(interp, "bad 
d220: 63 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c  channel \"", Tcl
d230: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
d240: 63 68 61 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f  chan),..."\": no
d250: 74 20 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e  t a stacked chan
d260: 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  nel", (char *) N
d270: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
d280: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
d290: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 49 4d  rp, "TLS", "UNIM
d2a0: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
d2b0: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
d2c0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
d2d0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d2e0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6c      }..    /* Fl
d2f0: 75 73 68 20 61 6e 79 20 70 65 6e 64 69 6e 67 20  ush any pending 
d300: 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28  data */.    if (
d310: 54 63 6c 5f 4f 75 74 70 75 74 42 75 66 66 65 72  Tcl_OutputBuffer
d320: 65 64 28 63 68 61 6e 29 20 3e 20 30 20 26 26 20  ed(chan) > 0 && 
d330: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 29 20  Tcl_Flush(chan) 
d340: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63  != TCL_OK) {..Tc
d350: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d360: 6e 74 65 72 70 2c 20 22 63 61 6e 27 74 20 66 6c  nterp, "can't fl
d370: 75 73 68 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63  ush channel", (c
d380: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72  har *) NULL);..r
d390: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d3a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
d3b0: 6e 69 74 20 73 74 6f 72 61 67 65 20 2a 2f 0a 20  nit storage */. 
d3c0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
d3d0: 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  it(&upperChannel
d3e0: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20  Translation);.  
d3f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
d400: 74 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  t(&upperChannelB
d410: 6c 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63  locking);.    Tc
d420: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
d430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
d440: 61 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  ar);.    Tcl_DSt
d450: 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43  ringInit(&upperC
d460: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
d470: 0a 0a 20 20 20 20 2f 2a 20 50 72 65 73 65 72 76  ..    /* Preserv
d480: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 6e 65  e current channe
d490: 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20 20 20 20  l config */.    
d4a0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
d4b0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
d4c0: 6e 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20  n, "-blocking", 
d4d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
d4e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
d4f0: 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e  GetChannelOption
d500: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22  (interp, chan, "
d510: 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70  -encoding", &upp
d520: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d530: 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43  g);.    Tcl_GetC
d540: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
d550: 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66  erp, chan, "-eof
d560: 63 68 61 72 22 2c 20 26 75 70 70 65 72 43 68 61  char", &upperCha
d570: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
d580: 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c    Tcl_GetChannel
d590: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
d5a0: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  han, "-translati
d5b0: 6f 6e 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  on", &upperChann
d5c0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
d5d0: 0a 20 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20  .    /* Unstack 
d5e0: 74 68 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  the channel */. 
d5f0: 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 74 61     if (Tcl_Unsta
d600: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  ckChannel(interp
d610: 2c 20 63 68 61 6e 29 20 21 3d 20 54 43 4c 5f 4f  , chan) != TCL_O
d620: 4b 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f  K) {..res = TCL_
d630: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
d640: 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 63 68 61    /* Restore cha
d650: 6e 6e 65 6c 20 63 6f 6e 66 69 67 20 2a 2f 0a 20  nnel config */. 
d660: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
d670: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d680: 70 61 72 65 6e 74 2c 20 22 2d 65 6e 63 6f 64 69  parent, "-encodi
d690: 6e 67 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  ng", Tcl_DString
d6a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
d6b0: 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 29 3b 0a 20  nelEncoding));. 
d6c0: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65     Tcl_SetChanne
d6d0: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
d6e0: 70 61 72 65 6e 74 2c 20 22 2d 65 6f 66 63 68 61  parent, "-eofcha
d6f0: 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  r", Tcl_DStringV
d700: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d710: 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 20 20 20  elEOFChar));.   
d720: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f   Tcl_SetChannelO
d730: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 70 61  ption(interp, pa
d740: 72 65 6e 74 2c 20 22 2d 74 72 61 6e 73 6c 61 74  rent, "-translat
d750: 69 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  ion", Tcl_DStrin
d760: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
d770: 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29  nnelTranslation)
d780: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
d790: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
d7a0: 72 70 2c 20 70 61 72 65 6e 74 2c 20 22 2d 62 6c  rp, parent, "-bl
d7b0: 6f 63 6b 69 6e 67 22 2c 20 54 63 6c 5f 44 53 74  ocking", Tcl_DSt
d7c0: 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72  ringValue(&upper
d7d0: 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67 29  ChannelBlocking)
d7e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e  );..    /* Clean
d7f0: 2d 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44  -up */.    Tcl_D
d800: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
d810: 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74  rChannelTranslat
d820: 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ion);.    Tcl_DS
d830: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d840: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d850: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
d860: 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e  gFree(&upperChan
d870: 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20  nelEOFChar);.   
d880: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
d890: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c  (&upperChannelBl
d8a0: 6f 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74  ocking);.    ret
d8b0: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a  urn res;.}.../*.
d8c0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d900: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f  -----. *. * CTX_
d910: 49 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63  Init -- construc
d920: 74 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74  t a SSL_CTX inst
d930: 61 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ance. *. * Resul
d940: 74 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53  ts:. *.A valid S
d950: 53 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20  SL_CTX instance 
d960: 6f 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53  or NULL.. *. * S
d970: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
d980: 63 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63  constructs SSL c
d990: 6f 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a  ontext (CTX). *.
d9a0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
d9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d9e0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63  -----. */.static
d9f0: 20 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49   SSL_CTX *.CTX_I
da00: 6e 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65  nit(State *state
da10: 50 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65  Ptr, int isServe
da20: 72 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68  r, int proto, ch
da30: 61 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61  ar *keyfile, cha
da40: 72 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20  r *certfile,.   
da50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
da60: 6b 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  key, unsigned ch
da70: 61 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69  ar *cert, Tcl_Si
da80: 7a 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f  ze key_len, Tcl_
da90: 53 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63  Size cert_len, c
daa0: 68 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20  har *CApath,.   
dab0: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20   char *CAstore, 
dac0: 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68  char *CAfile, ch
dad0: 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61  ar *ciphers, cha
dae0: 72 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c  r *ciphersuites,
daf0: 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72   int level, char
db00: 20 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20   *DHparams) {.  
db10: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
db20: 74 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d  terp = statePtr-
db30: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c  >interp;.    SSL
db40: 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c  _CTX *ctx = NULL
db50: 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ;.    Tcl_DStrin
db60: 67 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66  g ds;.    int of
db70: 66 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30  f = 0, abort = 0
db80: 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70  ;.    int load_p
db90: 72 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20  rivate_key;.    
dba0: 63 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44  const SSL_METHOD
dbb0: 20 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64   *method;..    d
dbc0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
dbd0: 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74  ;..    if (!prot
dbe0: 6f 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  o) {..Tcl_Append
dbf0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
dc00: 6e 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f  no valid protoco
dc10: 6c 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68  l selected", (ch
dc20: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
dc30: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
dc40: 0a 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20  ..    /* create 
dc50: 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23  SSL context */.#
dc60: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
dc70: 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31  ON_NUMBER >= 0x1
dc80: 30 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69  0100000L || defi
dc90: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20  ned(NO_SSL2) || 
dca0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
dcb0: 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20  NO_SSL2).    if 
dcc0: 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20  (ENABLED(proto, 
dcd0: 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29  TLS_PROTO_SSL2))
dce0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
dcf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53  sult(interp, "SS
dd00: 4c 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  L2 protocol not 
dd10: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
dd20: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
dd30: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
dd40: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dd50: 65 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64  ed(NO_SSL3) || d
dd60: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
dd70: 4f 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28  O_SSL3).    if (
dd80: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
dd90: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20  LS_PROTO_SSL3)) 
dda0: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
ddc0: 33 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  3 protocol not s
ddd0: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
dde0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
ddf0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
de00: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
de10: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
de20: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
de30: 5f 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45  _TLS1).    if (E
de40: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
de50: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b  S_PROTO_TLS1)) {
de60: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
de70: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
de80: 31 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.0 protocol not
de90: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
dea0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
deb0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
dec0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
ded0: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c  ned(NO_TLS1_1) |
dee0: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
def0: 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20  L_NO_TLS1_1).   
df00: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
df10: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
df20: 53 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_1)) {..Tcl_Ap
df30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
df40: 70 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74  p, "TLS 1.1 prot
df50: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
df60: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
df70: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
df80: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
df90: 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54  #if defined(NO_T
dfa0: 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65  LS1_2) || define
dfb0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
dfc0: 31 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41  1_2).    if (ENA
dfd0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
dfe0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b  PROTO_TLS1_2)) {
dff0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
e000: 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20  lt(interp, "TLS 
e010: 31 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74  1.2 protocol not
e020: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
e030: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65  ar *) NULL);..re
e040: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
e050: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
e060: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c  ned(NO_TLS1_3) |
e070: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
e080: 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20  L_NO_TLS1_3).   
e090: 20 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f   if (ENABLED(pro
e0a0: 74 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c  to, TLS_PROTO_TL
e0b0: 53 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70  S1_3)) {..Tcl_Ap
e0c0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
e0d0: 70 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74  p, "TLS 1.3 prot
e0e0: 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74  ocol not support
e0f0: 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ed", (char *) NU
e100: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c  LL);..return NUL
e110: 4c 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  L;.    }.#endif.
e120: 20 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d      if (proto ==
e130: 20 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75   0) {../* Use fu
e140: 6c 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c  ll range */..SSL
e150: 5f 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f  _CTX_set_min_pro
e160: 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20  to_version(ctx, 
e170: 30 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  0);..SSL_CTX_set
e180: 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _max_proto_versi
e190: 6f 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20  on(ctx, 0);.    
e1a0: 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70  }..    switch (p
e1b0: 72 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e  roto) {.#if OPEN
e1c0: 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
e1d0: 45 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c  ER < 0x10100000L
e1e0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f   && !defined(NO_
e1f0: 53 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65  SSL2) && !define
e200: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
e210: 32 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f  2).    case TLS_
e220: 50 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74  PROTO_SSL2:..met
e230: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e240: 20 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65   SSLv2_server_me
e250: 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63  thod() : SSLv2_c
e260: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e270: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23  .break;.#endif.#
e280: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  if !defined(NO_S
e290: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
e2a0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
e2b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50  ) && !defined(OP
e2c0: 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45  ENSSL_NO_SSL3_ME
e2d0: 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54  THOD).    case T
e2e0: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09  LS_PROTO_SSL3:..
e2f0: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e300: 72 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72  r ? SSLv3_server
e310: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76  _method() : SSLv
e320: 33 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  3_client_method(
e330: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e350: 4f 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69  O_TLS1) && !defi
e360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e370: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
e380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73  _METHOD).    cas
e3a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
e3b0: 3a 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65  :..method = isSe
e3c0: 72 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72  rver ? TLSv1_ser
e3d0: 76 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54  ver_method() : T
e3e0: 4c 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68  LSv1_client_meth
e3f0: 6f 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  od();..break;.#e
e400: 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65  ndif.#if !define
e410: 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20  d(NO_TLS1_1) && 
e420: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e430: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  _NO_TLS1_1) && !
e440: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e450: 4e 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44  NO_TLS1_1_METHOD
e460: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
e470: 52 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65  ROTO_TLS1_1:..me
e480: 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20  thod = isServer 
e490: 3f 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72  ? TLSv1_1_server
e4a0: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76  _method() : TLSv
e4b0: 31 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  1_1_client_metho
e4c0: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e4d0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e4e0: 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21  (NO_TLS1_2) && !
e4f0: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e500: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e510: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e520: 4f 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29  O_TLS1_2_METHOD)
e530: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e540: 4f 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74  OTO_TLS1_2:..met
e550: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e560: 20 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f   TLSv1_2_server_
e570: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
e580: 5f 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _2_client_method
e590: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e5a0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e5b0: 4e 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64  NO_TLS1_3) && !d
e5c0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e5d0: 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61  O_TLS1_3).    ca
e5e0: 73 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  se TLS_PROTO_TLS
e5f0: 31 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65  1_3:../* Use the
e600: 20 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20   generic method 
e610: 61 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72  and constraint r
e620: 61 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65  ange after conte
e630: 78 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f  xt is created */
e640: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e650: 76 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72  ver ? TLS_server
e660: 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f  _method() : TLS_
e670: 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b  client_method();
e680: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
e690: 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a      default:../*
e6a0: 20 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65   Negotiate highe
e6b0: 73 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c  st available SSL
e6c0: 2f 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  /TLS version */.
e6d0: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e6e0: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
e6f0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
e700: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e710: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
e720: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31  ION_NUMBER < 0x1
e730: 30 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66  0100000L && !def
e740: 69 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26  ined(NO_SSL2) &&
e750: 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53   !defined(OPENSS
e760: 4c 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20  L_NO_SSL2)..off 
e770: 7c 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  |= (ENABLED(prot
e780: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c  o, TLS_PROTO_SSL
e790: 32 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f  2)   ? 0 : SSL_O
e7a0: 50 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e  P_NO_SSLv2);.#en
e7b0: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e7c0: 28 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65  (NO_SSL3) && !de
e7d0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e7e0: 5f 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28  _SSL3)..off |= (
e7f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
e800: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20  LS_PROTO_SSL3)  
e810: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
e820: 5f 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a  _SSLv3);.#endif.
e830: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e840: 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65  TLS1) && !define
e850: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e860: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
e870: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e880: 52 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30  ROTO_TLS1)   ? 0
e890: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e8a0: 76 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  v1);.#endif.#if 
e8b0: 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31  !defined(NO_TLS1
e8c0: 5f 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  _1) && !defined(
e8d0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e8e0: 31 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42  1)..off |= (ENAB
e8f0: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
e900: 52 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30  ROTO_TLS1_1) ? 0
e910: 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53   : SSL_OP_NO_TLS
e920: 76 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69  v1_1);.#endif.#i
e930: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
e940: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
e950: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
e960: 31 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e  1_2)..off |= (EN
e970: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
e980: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f  _PROTO_TLS1_2) ?
e990: 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54   0 : SSL_OP_NO_T
e9a0: 4c 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a  LSv1_2);.#endif.
e9b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
e9c0: 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69  TLS1_3) && !defi
e9d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
e9e0: 4c 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28  LS1_3)..off |= (
e9f0: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
ea00: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
ea10: 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f   ? 0 : SSL_OP_NO
ea20: 5f 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69  _TLSv1_3);.#endi
ea30: 66 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a  f..break;.    }.
ea40: 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65  .    ERR_clear_e
ea50: 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78  rror();..    ctx
ea60: 20 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d   = SSL_CTX_new(m
ea70: 65 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28  ethod);.    if (
ea80: 21 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20  !ctx) {..return 
ea90: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
eaa0: 20 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b   if (getenv(SSLK
eab0: 45 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53  EYLOGFILE)) {..S
eac0: 53 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f  SL_CTX_set_keylo
ead0: 67 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20  g_callback(ctx, 
eae0: 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b  KeyLogCallback);
eaf0: 0a 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  .    }..#if !def
eb00: 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20  ined(NO_TLS1_3) 
eb10: 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e  && !defined(OPEN
eb20: 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20  SSL_NO_TLS1_3). 
eb30: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
eb40: 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33  TLS_PROTO_TLS1_3
eb50: 29 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74  ) {..SSL_CTX_set
eb60: 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69  _min_proto_versi
eb70: 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56  on(ctx, TLS1_3_V
eb80: 45 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54  ERSION);..SSL_CT
eb90: 58 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f  X_set_max_proto_
eba0: 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53  version(ctx, TLS
ebb0: 31 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20  1_3_VERSION);.  
ebc0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
ebd0: 2f 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20  /* Force cipher 
ebe0: 73 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20  selection order 
ebf0: 62 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20  by server */.   
ec00: 20 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20   if (!isServer) 
ec10: 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f  {..SSL_CTX_set_o
ec20: 70 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f  ptions(ctx, SSL_
ec30: 4f 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52  OP_CIPHER_SERVER
ec40: 5f 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20  _PREFERENCE);.  
ec50: 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c    }..#if OPENSSL
ec60: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20  _VERSION_NUMBER 
ec70: 3c 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20  < 0x10100000L.  
ec80: 20 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c    OpenSSL_add_al
ec90: 6c 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20  l_algorithms(); 
eca0: 2f 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20  /* Load ciphers 
ecb0: 61 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23  and digests */.#
ecc0: 65 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43  endif..    SSL_C
ecd0: 54 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28  TX_set_app_data(
ece0: 63 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65  ctx, (void*)inte
ecf0: 72 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72  rp);./* remember
ed00: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
ed10: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
ed20: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ed30: 20 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a   SSL_OP_ALL);./*
ed40: 20 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20   Enable all SSL 
ed50: 62 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20  bug workarounds 
ed60: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
ed70: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
ed80: 53 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45  SSL_OP_NO_COMPRE
ed90: 53 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62  SSION);./* Disab
eda0: 6c 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65  le compression e
edb0: 76 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64  ven if supported
edc0: 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f   */.    SSL_CTX_
edd0: 73 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c  set_options(ctx,
ede0: 20 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62   off);../* Disab
edf0: 6c 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f  le specified pro
ee00: 74 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a  tocol versions *
ee10: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20  /..    /* Allow 
ee20: 77 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74  writes to report
ee30: 20 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65   success when le
ee40: 73 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f  ss than all reco
ee50: 72 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  rds have been wr
ee60: 69 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c  itten */.    SSL
ee70: 5f 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74  _CTX_set_mode(ct
ee80: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42  x, SSL_MODE_ENAB
ee90: 4c 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45  LE_PARTIAL_WRITE
eea0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62  );..    /* Disab
eeb0: 6c 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74  le attempts to t
eec0: 72 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ry to process th
eed0: 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e  e next record in
eee0: 73 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69  stead of returni
eef0: 6e 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20  ng after a.     
ef00: 20 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64    non-app record
ef10: 2e 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69  . Avoids hangs i
ef20: 6e 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c  n blocking mode,
ef30: 20 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f   when using SSL_
ef40: 72 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20  read() and a.   
ef50: 20 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74      non-applicat
ef60: 69 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73  ion record was s
ef70: 65 6e 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20  ent without any 
ef80: 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 61 74 61  application data
ef90: 2e 20 2a 2f 0a 20 20 20 20 2f 2a 53 53 4c 5f 43  . */.    /*SSL_C
efa0: 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63 74  TX_clear_mode(ct
efb0: 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54 4f  x, SSL_MODE_AUTO
efc0: 5f 52 45 54 52 59 29 3b 2a 2f 0a 0a 20 20 20 20  _RETRY);*/..    
efd0: 53 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74  SSL_CTX_sess_set
efe0: 5f 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c  _cache_size(ctx,
eff0: 20 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53   128);..    /* S
f000: 65 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20  et user defined 
f010: 63 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20  ciphers, cipher 
f020: 73 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75  suites, and secu
f030: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f040: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21    if ((ciphers !
f050: 3d 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f  = NULL) && !SSL_
f060: 43 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c  CTX_set_cipher_l
f070: 69 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73  ist(ctx, ciphers
f080: 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  )) {..Tcl_Append
f090: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f0a0: 53 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c  Set ciphers fail
f0b0: 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70  ed: No valid cip
f0c0: 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20  hers", (char *) 
f0d0: 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  NULL);..SSL_CTX_
f0e0: 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75  free(ctx);..retu
f0f0: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  rn NULL;.    }. 
f100: 20 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75     if ((ciphersu
f110: 69 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26  ites != NULL) &&
f120: 20 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69   !SSL_CTX_set_ci
f130: 70 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20  phersuites(ctx, 
f140: 63 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b  ciphersuites)) {
f150: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
f160: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
f170: 63 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61  cipher suites fa
f180: 69 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63  iled: No valid c
f190: 69 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a  iphers", (char *
f1a0: 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54  ) NULL);..SSL_CT
f1b0: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65  X_free(ctx);..re
f1c0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
f1d0: 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 61 75 74  ..    /* set aut
f1e0: 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65 6c  omatic curve sel
f1f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53  ection */.    SS
f200: 4c 5f 43 54 58 5f 73 65 74 5f 65 63 64 68 5f 61  L_CTX_set_ecdh_a
f210: 75 74 6f 28 63 74 78 2c 20 31 29 3b 0a 0a 20 20  uto(ctx, 1);..  
f220: 20 20 2f 2a 20 53 65 74 20 73 65 63 75 72 69 74    /* Set securit
f230: 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20 20 69  y level */.    i
f240: 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31 20 26 26  f (level > -1 &&
f250: 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b 0a 09 2f   level < 6) {../
f260: 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63 75 72 69  * SSL_set_securi
f270: 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09 53 53 4c  ty_level */..SSL
f280: 5f 43 54 58 5f 73 65 74 5f 73 65 63 75 72 69 74  _CTX_set_securit
f290: 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20 6c 65 76  y_level(ctx, lev
f2a0: 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  el);.    }..    
f2b0: 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63 61 6c 6c  /* set some call
f2c0: 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20 53 53 4c  backs */.    SSL
f2d0: 5f 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74  _CTX_set_default
f2e0: 5f 70 61 73 73 77 64 5f 63 62 28 63 74 78 2c 20  _passwd_cb(ctx, 
f2f0: 50 61 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b  PasswordCallback
f300: 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  );.    SSL_CTX_s
f310: 65 74 5f 64 65 66 61 75 6c 74 5f 70 61 73 73 77  et_default_passw
f320: 64 5f 63 62 5f 75 73 65 72 64 61 74 61 28 63 74  d_cb_userdata(ct
f330: 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  x, (void *)state
f340: 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65  Ptr);..    /* re
f350: 61 64 20 61 20 44 69 66 66 69 65 2d 48 65 6c 6c  ad a Diffie-Hell
f360: 6d 61 6e 20 70 61 72 61 6d 65 74 65 72 73 20 66  man parameters f
f370: 69 6c 65 2c 20 6f 72 20 75 73 65 20 74 68 65 20  ile, or use the 
f380: 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20 2a 2f 0a  built-in one */.
f390: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
f3a0: 6e 69 74 28 26 64 73 29 3b 0a 23 69 66 64 65 66  nit(&ds);.#ifdef
f3b0: 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44 48 0a 20   OPENSSL_NO_DH. 
f3c0: 20 20 20 69 66 20 28 44 48 70 61 72 61 6d 73 20     if (DHparams 
f3d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  != NULL) {..Tcl_
f3e0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
f3f0: 65 72 70 2c 20 22 44 48 20 70 61 72 61 6d 65 74  erp, "DH paramet
f400: 65 72 20 73 75 70 70 6f 72 74 20 6e 6f 74 20 61  er support not a
f410: 76 61 69 6c 61 62 6c 65 22 2c 20 28 63 68 61 72  vailable", (char
f420: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f   *) NULL);..SSL_
f430: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
f440: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
f450: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 7b 0a 09   }.#else.    {..
f460: 44 48 2a 20 64 68 3b 0a 09 69 66 20 28 44 48 70  DH* dh;..if (DHp
f470: 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  arams != NULL) {
f480: 0a 09 20 20 20 20 42 49 4f 20 2a 62 69 6f 3b 0a  ..    BIO *bio;.
f490: 0a 09 20 20 20 20 62 69 6f 20 3d 20 42 49 4f 5f  ..    bio = BIO_
f4a0: 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28 44 48 70  new_file(F2N(DHp
f4b0: 61 72 61 6d 73 2c 20 26 64 73 29 2c 20 22 72 22  arams, &ds), "r"
f4c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 21 62 69 6f  );..    if (!bio
f4d0: 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e  ) {...Tcl_DStrin
f4e0: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 09 54 63  gFree(&ds);...Tc
f4f0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
f500: 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64 20 6e 6f  nterp, "Could no
f510: 74 20 66 69 6e 64 20 44 48 20 70 61 72 61 6d 65  t find DH parame
f520: 74 65 72 73 20 66 69 6c 65 22 2c 20 28 63 68 61  ters file", (cha
f530: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09 53 53  r *) NULL);...SS
f540: 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b  L_CTX_free(ctx);
f550: 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ...return NULL;.
f560: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 64 68 20  .    }...    dh 
f570: 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69 6f 5f 44  = PEM_read_bio_D
f580: 48 70 61 72 61 6d 73 28 62 69 6f 2c 20 4e 55 4c  Hparams(bio, NUL
f590: 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a  L, NULL, NULL);.
f5a0: 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 62 69  .    BIO_free(bi
f5b0: 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  o);..    Tcl_DSt
f5c0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f5d0: 20 20 20 20 69 66 20 28 21 64 68 29 20 7b 0a 09      if (!dh) {..
f5e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f5f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
f600: 20 6e 6f 74 20 72 65 61 64 20 44 48 20 70 61 72   not read DH par
f610: 61 6d 65 74 65 72 73 20 66 72 6f 6d 20 66 69 6c  ameters from fil
f620: 65 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  e", (char *) NUL
f630: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f640: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f650: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f660: 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f      SSL_CTX_set_
f670: 74 6d 70 5f 64 68 28 63 74 78 2c 20 64 68 29 3b  tmp_dh(ctx, dh);
f680: 0a 09 20 20 20 20 44 48 5f 66 72 65 65 28 64 68  ..    DH_free(dh
f690: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  );...} else {.. 
f6a0: 20 20 20 2f 2a 20 55 73 65 20 77 65 6c 6c 20 6b     /* Use well k
f6b0: 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d 65 74 65  nown DH paramete
f6c0: 72 73 20 74 68 61 74 20 68 61 76 65 20 62 75 69  rs that have bui
f6d0: 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74 20 69 6e  lt-in support in
f6e0: 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09 20 20 20   OpenSSL */..   
f6f0: 20 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 73 65   if (!SSL_CTX_se
f700: 74 5f 64 68 5f 61 75 74 6f 28 63 74 78 2c 20 31  t_dh_auto(ctx, 1
f710: 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  )) {...Tcl_Appen
f720: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f730: 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e 61 62 6c  "Could not enabl
f740: 65 20 73 65 74 20 44 48 20 61 75 74 6f 3a 20 22  e set DH auto: "
f750: 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  , GET_ERR_REASON
f760: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f770: 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72  L);...SSL_CTX_fr
f780: 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72  ee(ctx);...retur
f790: 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  n NULL;..    }..
f7a0: 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
f7b0: 20 20 20 20 2f 2a 20 73 65 74 20 6f 75 72 20 63      /* set our c
f7c0: 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 20 20  ertificate */.  
f7d0: 20 20 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b    load_private_k
f7e0: 65 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28  ey = 0;.    if (
f7f0: 63 65 72 74 66 69 6c 65 20 21 3d 20 4e 55 4c 4c  certfile != NULL
f800: 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61 74  ) {..load_privat
f810: 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09 69 66 20  e_key = 1;...if 
f820: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
f830: 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28 63 74  tificate_file(ct
f840: 78 2c 20 46 32 4e 28 63 65 72 74 66 69 6c 65 2c  x, F2N(certfile,
f850: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
f860: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
f870: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
f880: 67 46 72 65 65 28 26 64 73 29 3b 0a 09 20 20 20  gFree(&ds);..   
f890: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
f8a0: 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62 6c  t(interp, "unabl
f8b0: 65 20 74 6f 20 73 65 74 20 63 65 72 74 69 66 69  e to set certifi
f8c0: 63 61 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72  cate file ", cer
f8d0: 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47  tfile, ": ",...G
f8e0: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
f8f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
f900: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72  ..    SSL_CTX_fr
f910: 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65  ee(ctx);..    re
f920: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54  turn NULL;..}..T
f930: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
f940: 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65  ds);..    } else
f950: 20 69 66 20 28 63 65 72 74 20 21 3d 20 4e 55 4c   if (cert != NUL
f960: 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69 76 61  L) {..load_priva
f970: 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09 69 66 20  te_key = 1;..if 
f980: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63 65 72  (SSL_CTX_use_cer
f990: 74 69 66 69 63 61 74 65 5f 41 53 4e 31 28 63 74  tificate_ASN1(ct
f9a0: 78 2c 20 28 69 6e 74 29 20 63 65 72 74 5f 6c 65  x, (int) cert_le
f9b0: 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30 29 20 7b  n, cert) <= 0) {
f9c0: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
f9d0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
f9e0: 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65  unable to set ce
f9f0: 72 74 69 66 69 63 61 74 65 3a 20 22 2c 0a 09 09  rtificate: ",...
fa00: 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29  GET_ERR_REASON()
fa10: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29  , (char *) NULL)
fa20: 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 66  ;..    SSL_CTX_f
fa30: 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20 20 72  ree(ctx);..    r
fa40: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20  eturn NULL;..}. 
fa50: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 63 65 72     } else {..cer
fa60: 74 66 69 6c 65 20 3d 20 28 63 68 61 72 2a 29 58  tfile = (char*)X
fa70: 35 30 39 5f 67 65 74 5f 64 65 66 61 75 6c 74 5f  509_get_default_
fa80: 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a 0a 09 69  cert_file();...i
fa90: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 63  f (SSL_CTX_use_c
faa0: 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65 28  ertificate_file(
fab0: 63 74 78 2c 20 63 65 72 74 66 69 6c 65 2c 20 53  ctx, certfile, S
fac0: 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50 45 4d 29  SL_FILETYPE_PEM)
fad0: 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20 30 0a 09   <= 0) {.#if 0..
fae0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
faf0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
fb00: 61 62 6c 65 20 74 6f 20 75 73 65 20 64 65 66 61  able to use defa
fb10: 75 6c 74 20 63 65 72 74 69 66 69 63 61 74 65 20  ult certificate 
fb20: 66 69 6c 65 20 22 2c 20 63 65 72 74 66 69 6c 65  file ", certfile
fb30: 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54 5f 45 52  , ": ",...GET_ER
fb40: 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61  R_REASON(), (cha
fb50: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20  r *) NULL);..   
fb60: 20 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74   SSL_CTX_free(ct
fb70: 78 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  x);..    return 
fb80: 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 09 7d 0a  NULL;.#endif..}.
fb90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 73 65      }..    /* se
fba0: 74 20 6f 75 72 20 70 72 69 76 61 74 65 20 6b 65  t our private ke
fbb0: 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 6c 6f 61  y */.    if (loa
fbc0: 64 5f 70 72 69 76 61 74 65 5f 6b 65 79 29 20 7b  d_private_key) {
fbd0: 0a 09 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d  ..if (keyfile ==
fbe0: 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20 3d 3d 20   NULL && key == 
fbf0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 6b 65 79  NULL) {..    key
fc00: 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b  file = certfile;
fc10: 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79 66 69 6c  ..}...if (keyfil
fc20: 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  e != NULL) {..  
fc30: 20 20 2f 2a 20 67 65 74 20 74 68 65 20 70 72 69    /* get the pri
fc40: 76 61 74 65 20 6b 65 79 20 61 73 73 6f 63 69 61  vate key associa
fc50: 74 65 64 20 77 69 74 68 20 74 68 69 73 20 63 65  ted with this ce
fc60: 72 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20  rtificate */..  
fc70: 20 20 69 66 20 28 6b 65 79 66 69 6c 65 20 3d 3d    if (keyfile ==
fc80: 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65 79 66 69   NULL) {...keyfi
fc90: 6c 65 20 3d 20 63 65 72 74 66 69 6c 65 3b 0a 09  le = certfile;..
fca0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28      }...    if (
fcb0: 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76  SSL_CTX_use_Priv
fcc0: 61 74 65 4b 65 79 5f 66 69 6c 65 28 63 74 78 2c  ateKey_file(ctx,
fcd0: 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c 20 26 64   F2N(keyfile, &d
fce0: 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45  s), SSL_FILETYPE
fcf0: 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 09 09  _PEM) <= 0) {...
fd00: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
fd10: 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c 75 73 68  &ds);.../* flush
fd20: 20 74 68 65 20 70 61 73 73 70 68 72 61 73 65 20   the passphrase 
fd30: 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 6c  which might be l
fd40: 65 66 74 20 69 6e 20 74 68 65 20 72 65 73 75 6c  eft in the resul
fd50: 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65 74 52 65  t */...Tcl_SetRe
fd60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 4e 55 4c  sult(interp, NUL
fd70: 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  L, TCL_STATIC);.
fd80: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
fd90: 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 62  lt(interp, "unab
fda0: 6c 65 20 74 6f 20 73 65 74 20 70 75 62 6c 69 63  le to set public
fdb0: 20 6b 65 79 20 66 69 6c 65 20 22 2c 20 6b 65 79   key file ", key
fdc0: 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09 20 20 20  file, " ",...   
fdd0: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
fde0: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
fdf0: 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65  );...SSL_CTX_fre
fe00: 65 28 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e  e(ctx);...return
fe10: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20   NULL;..    }.. 
fe20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
fe30: 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20 65 6c 73  ee(&ds);...} els
fe40: 65 20 69 66 20 28 6b 65 79 20 21 3d 20 4e 55 4c  e if (key != NUL
fe50: 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 53 53  L) {..    if (SS
fe60: 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69 76 61 74  L_CTX_use_Privat
fe70: 65 4b 65 79 5f 41 53 4e 31 28 45 56 50 5f 50 4b  eKey_ASN1(EVP_PK
fe80: 45 59 5f 52 53 41 2c 20 63 74 78 2c 20 6b 65 79  EY_RSA, ctx, key
fe90: 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c 65 6e 29  , (int) key_len)
fea0: 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a 20 66 6c   <= 0) {.../* fl
feb0: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
fec0: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
fed0: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
fee0: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
fef0: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
ff00: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
ff10: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
ff20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
ff30: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
ff40: 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47 45 54 5f  lic key: ", GET_
ff50: 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63  ERR_REASON(), (c
ff60: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 09  har *) NULL);...
ff70: 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78  SSL_CTX_free(ctx
ff80: 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c  );...return NULL
ff90: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 2f 2a 20  ;..    }..}../* 
ffa0: 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  Now we know that
ffb0: 20 61 20 6b 65 79 20 61 6e 64 20 63 65 72 74 20   a key and cert 
ffc0: 68 61 76 65 20 62 65 65 6e 20 73 65 74 20 61 67  have been set ag
ffd0: 61 69 6e 73 74 0a 09 20 2a 20 74 68 65 20 53 53  ainst.. * the SS
ffe0: 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 69 66  L context */..if
fff0: 20 28 21 53 53 4c 5f 43 54 58 5f 63 68 65 63 6b   (!SSL_CTX_check
10000 5f 70 72 69 76 61 74 65 5f 6b 65 79 28 63 74 78  _private_key(ctx
10010 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  )) {..    Tcl_Ap
10020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10030 70 2c 20 22 70 72 69 76 61 74 65 20 6b 65 79 20  p, "private key 
10040 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74  does not match t
10050 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70  he certificate p
10060 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09 09 09 20  ublic key",.... 
10070 20 20 20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c      (char *) NUL
10080 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
10090 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
100a0 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
100b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
100c0 65 74 20 74 6f 20 75 73 65 20 74 68 65 20 64 65  et to use the de
100d0 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f 6e 20 61  fault location a
100e0 6e 64 20 66 69 6c 65 20 66 6f 72 20 43 65 72 74  nd file for Cert
100f0 69 66 69 63 61 74 65 20 41 75 74 68 6f 72 69 74  ificate Authorit
10100 79 20 28 43 41 29 20 63 65 72 74 69 66 69 63 61  y (CA) certifica
10110 74 65 73 2e 0a 20 20 20 20 20 2a 20 54 68 65 20  tes..     * The 
10120 64 65 66 61 75 6c 74 20 43 41 20 63 65 72 74 69  default CA certi
10130 66 69 63 61 74 65 73 20 64 69 72 65 63 74 6f 72  ficates director
10140 79 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74  y is called cert
10150 73 20 69 6e 20 74 68 65 20 64 65 66 61 75 6c 74  s in the default
10160 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20 20 2a 20   OpenSSL.     * 
10170 64 69 72 65 63 74 6f 72 79 2e 20 49 74 20 63 6f  directory. It co
10180 6e 74 61 69 6e 73 20 74 68 65 20 43 41 20 63 65  ntains the CA ce
10190 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45  rtificates in PE
101a0 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74 68 20 6f  M format, with o
101b0 6e 65 20 63 65 72 74 69 66 69 63 61 74 65 20 70  ne certificate p
101c0 65 72 0a 20 20 20 20 20 2a 20 66 69 6c 65 2e 20  er.     * file. 
101d0 54 68 65 20 76 65 72 69 66 79 20 70 61 74 68 20  The verify path 
101e0 61 6e 64 20 73 74 6f 72 65 20 63 61 6e 20 62 65  and store can be
101f0 20 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 74   overridden by t
10200 68 65 20 53 53 4c 5f 43 45 52 54 5f 44 49 52 20  he SSL_CERT_DIR 
10210 65 6e 76 20 76 61 72 2e 20 54 68 65 0a 20 20 20  env var. The.   
10220 20 20 2a 20 64 65 66 61 75 6c 74 20 43 41 20 63    * default CA c
10230 65 72 74 69 66 69 63 61 74 65 73 20 66 69 6c 65  ertificates file
10240 20 69 73 20 63 61 6c 6c 65 64 20 63 65 72 74 2e   is called cert.
10250 70 65 6d 20 69 6e 20 74 68 65 20 64 65 66 61 75  pem in the defau
10260 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69 72 65 63  lt OpenSSL direc
10270 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20 54 68 65  tory..     * The
10280 20 76 65 72 69 66 79 20 66 69 6c 65 20 63 61 6e   verify file can
10290 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
102a0 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 46  y the SSL_CERT_F
102b0 49 4c 45 20 65 6e 76 20 76 61 72 2e 20 2a 2f 0a  ILE env var. */.
102c0 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
102d0 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 76 65 72  _set_default_ver
102e0 69 66 79 5f 70 61 74 68 73 28 63 74 78 29 29 20  ify_paths(ctx)) 
102f0 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20 20 20 20  {..abort++;.    
10300 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 72 69  }..    /* Overri
10310 64 65 73 20 66 6f 72 20 74 68 65 20 43 41 20 76  des for the CA v
10320 65 72 69 66 79 20 70 61 74 68 20 61 6e 64 20 66  erify path and f
10330 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a 23 69 66  ile */.    {.#if
10340 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
10350 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30  _NUMBER < 0x3000
10360 30 30 30 30 4c 0a 09 69 66 20 28 43 41 70 61 74  0000L..if (CApat
10370 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20 43 41 66  h != NULL || CAf
10380 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
10390 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20      Tcl_DString 
103a0 64 73 31 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53  ds1;..    Tcl_DS
103b0 74 72 69 6e 67 49 6e 69 74 28 26 64 73 31 29 3b  tringInit(&ds1);
103c0 0a 0a 09 20 20 20 20 69 66 20 28 21 53 53 4c 5f  ...    if (!SSL_
103d0 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f  CTX_load_verify_
103e0 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78 2c 20 46  locations(ctx, F
103f0 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 2c  2N(CAfile, &ds),
10400 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64 73   F2N(CApath, &ds
10410 31 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  1))) {...abort++
10420 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b  ;...return NULL;
10430 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c  ..    }..    Tcl
10440 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73  _DStringFree(&ds
10450 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72  );..    Tcl_DStr
10460 69 6e 67 46 72 65 65 28 26 64 73 31 29 3b 0a 0a  ingFree(&ds1);..
10470 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
10480 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
10490 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
104a0 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
104b0 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
104c0 2f 0a 09 20 20 20 20 2f 2a 20 68 74 74 70 73 3a  /..    /* https:
104d0 2f 2f 73 6f 75 72 63 65 66 6f 72 67 65 2e 6e 65  //sourceforge.ne
104e0 74 2f 70 2f 74 6c 73 2f 62 75 67 73 2f 35 37 2f  t/p/tls/bugs/57/
104f0 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 58 58 58 3a   */..    /* XXX:
10500 54 4f 44 4f 3a 20 4c 65 74 20 74 68 65 20 75 73  TODO: Let the us
10510 65 72 20 73 75 70 70 6c 79 20 76 61 6c 75 65 73  er supply values
10520 20 68 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66   here instead of
10530 20 73 6f 6d 65 74 68 69 6e 67 20 74 68 61 74 20   something that 
10540 65 78 69 73 74 73 20 6f 6e 20 74 68 65 20 66 69  exists on the fi
10550 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 09 20 20 20  lesystem */..   
10560 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
10570 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
10580 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
10590 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
105a0 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
105b0 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
105c0 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
105d0 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
105e0 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
105f0 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
10600 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
10610 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 0a 23  Free(&ds);..}..#
10620 65 6c 73 65 0a 09 2f 2a 20 53 65 74 20 64 69 72  else../* Set dir
10630 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
10640 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  g CA certificate
10650 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e  s in PEM format.
10660 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20   */..if (CApath 
10670 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10680 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
10690 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78  d_verify_dir(ctx
106a0 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64  , F2N(CApath, &d
106b0 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  s))) {...abort++
106c0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
106d0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
106e0 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 65 74 20  s);..}.../* Set 
106f0 55 52 49 20 66 6f 72 20 74 6f 20 61 20 73 74 6f  URI for to a sto
10700 72 65 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65  re, which may be
10710 20 61 20 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69   a single contai
10720 6e 65 72 20 6f 72 20 61 20 63 61 74 61 6c 6f 67  ner or a catalog
10730 20 6f 66 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20   of containers. 
10740 2a 2f 0a 09 69 66 20 28 43 41 73 74 6f 72 65 20  */..if (CAstore 
10750 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10760 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
10770 64 5f 76 65 72 69 66 79 5f 73 74 6f 72 65 28 63  d_verify_store(c
10780 74 78 2c 20 46 32 4e 28 43 41 73 74 6f 72 65 2c  tx, F2N(CAstore,
10790 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62 6f 72   &ds))) {...abor
107a0 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
107b0 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
107c0 28 26 64 73 29 3b 0a 09 7d 0a 0a 09 2f 2a 20 53  (&ds);..}.../* S
107d0 65 74 20 66 69 6c 65 20 6f 66 20 43 41 20 63 65  et file of CA ce
107e0 72 74 69 66 69 63 61 74 65 73 20 69 6e 20 50 45  rtificates in PE
107f0 4d 20 66 6f 72 6d 61 74 2e 20 20 2a 2f 0a 09 69  M format.  */..i
10800 66 20 28 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c  f (CAfile != NUL
10810 4c 29 20 7b 0a 09 20 20 20 20 69 66 20 28 21 53  L) {..    if (!S
10820 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
10830 66 79 5f 66 69 6c 65 28 63 74 78 2c 20 46 32 4e  fy_file(ctx, F2N
10840 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 29 20  (CAfile, &ds))) 
10850 7b 0a 09 09 61 62 6f 72 74 2b 2b 3b 0a 09 20 20  {...abort++;..  
10860 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
10870 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 0a  ringFree(&ds);..
10880 09 20 20 20 20 2f 2a 20 53 65 74 20 6c 69 73 74  .    /* Set list
10890 20 6f 66 20 43 41 73 20 74 6f 20 73 65 6e 64 20   of CAs to send 
108a0 74 6f 20 63 6c 69 65 6e 74 20 77 68 65 6e 20 72  to client when r
108b0 65 71 75 65 73 74 69 6e 67 20 61 20 63 6c 69 65  equesting a clie
108c0 6e 74 20 63 65 72 74 69 66 69 63 61 74 65 20 2a  nt certificate *
108d0 2f 0a 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28  /..    STACK_OF(
108e0 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74  X509_NAME) *cert
108f0 4e 61 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64  Names = SSL_load
10900 5f 63 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28  _client_CA_file(
10910 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29  F2N(CAfile, &ds)
10920 29 3b 0a 09 20 20 20 20 69 66 20 28 63 65 72 74  );..    if (cert
10930 4e 61 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b  Names != NULL) {
10940 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63  ...SSL_CTX_set_c
10950 6c 69 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74  lient_CA_list(ct
10960 78 2c 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09  x, certNames);..
10970 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44      }..    Tcl_D
10980 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b  StringFree(&ds);
10990 0a 09 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ..}.#endif.    }
109a0 0a 20 0a 20 20 20 20 69 66 20 28 61 62 6f 72 74  . .    if (abort
109b0 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 72 65 74 75   > 0) {../* retu
109c0 72 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  rn error */.    
109d0 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 74 78  }.    return ctx
109e0 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d  ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
10a30 2a 0a 20 2a 20 53 74 61 74 75 73 4f 62 6a 43 6d  *. * StatusObjCm
10a40 64 20 2d 2d 20 72 65 74 75 72 6e 20 63 65 72 74  d -- return cert
10a50 69 66 69 63 61 74 65 20 66 6f 72 20 63 6f 6e 6e  ificate for conn
10a60 65 63 74 65 64 20 70 65 65 72 20 69 6e 66 6f 2e  ected peer info.
10a70 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
10a80 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
10a90 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
10aa0 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
10ab0 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  .None.. *. *----
10ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ae0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10af0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10b00 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 53   */.static int.S
10b10 74 61 74 75 73 4f 62 6a 43 6d 64 28 43 6c 69 65  tatusObjCmd(Clie
10b20 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
10b30 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  a, Tcl_Interp *i
10b40 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c  nterp, int objc,
10b50 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20   Tcl_Obj *const 
10b60 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 53 74  objv[]) {.    St
10b70 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20  ate *statePtr;. 
10b80 20 20 20 58 35 30 39 20 2a 70 65 65 72 3b 0a 20     X509 *peer;. 
10b90 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
10ba0 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e  tr;.    Tcl_Chan
10bb0 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 63 68  nel chan;.    ch
10bc0 61 72 20 2a 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c  ar *channelName,
10bd0 20 2a 63 69 70 68 65 72 73 3b 0a 20 20 20 20 69   *ciphers;.    i
10be0 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20 63 6f 6e  nt mode;.    con
10bf0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
10c00 20 2a 70 72 6f 74 6f 3b 0a 20 20 20 20 75 6e 73   *proto;.    uns
10c10 69 67 6e 65 64 20 69 6e 74 20 6c 65 6e 3b 0a 20  igned int len;. 
10c20 20 20 20 69 6e 74 20 6e 69 64 2c 20 72 65 73 3b     int nid, res;
10c30 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
10c40 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
10c50 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
10c60 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
10c70 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 20 7c 7c  2 || objc > 3 ||
10c80 20 28 6f 62 6a 63 20 3d 3d 20 33 20 26 26 20 21   (objc == 3 && !
10c90 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
10ca0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22  ring(objv[1]), "
10cb0 2d 6c 6f 63 61 6c 22 29 29 29 20 7b 0a 09 54 63  -local"))) {..Tc
10cc0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10cd0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10ce0 22 3f 2d 6c 6f 63 61 6c 3f 20 63 68 61 6e 6e 65  "?-local? channe
10cf0 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  l");..return TCL
10d00 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
10d10 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65     /* Get channe
10d20 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e  l Id */.    chan
10d30 6e 65 6c 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  nelName = Tcl_Ge
10d40 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 28 6f 62  tString(objv[(ob
10d50 6a 63 20 3d 3d 20 32 20 3f 20 31 20 3a 20 32 29  jc == 2 ? 1 : 2)
10d60 5d 29 3b 0a 20 20 20 20 63 68 61 6e 20 3d 20 54  ]);.    chan = T
10d70 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
10d80 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 4e 61 6d  terp, channelNam
10d90 65 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69  e, &mode);.    i
10da0 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f  f (chan == (Tcl_
10db0 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
10dc0 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
10dd0 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
10de0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f  * Make sure to o
10df0 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f  perate on the to
10e00 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f  pmost channel */
10e10 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
10e20 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68  GetTopChannel(ch
10e30 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c  an);.    if (Tcl
10e40 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28  _GetChannelType(
10e50 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61  chan) != Tls_Cha
10e60 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54  nnelType()) {..T
10e70 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10e80 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61  interp, "bad cha
10e90 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65  nnel \"", Tcl_Ge
10ea0 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
10eb0 6e 29 2c 0a 09 09 22 5c 22 3a 20 6e 6f 74 20 61  n),..."\": not a
10ec0 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28   TLS channel", (
10ed0 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
10ee0 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
10ef0 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
10f00 22 53 54 41 54 55 53 22 2c 20 22 43 48 41 4e 4e  "STATUS", "CHANN
10f10 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20  EL", "INVALID", 
10f20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
10f30 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
10f40 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61  R;.    }.    sta
10f50 74 65 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a  tePtr = (State *
10f60 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  ) Tcl_GetChannel
10f70 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61  InstanceData(cha
10f80 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20  n);..    /* Get 
10f90 63 65 72 74 69 66 69 63 61 74 65 20 66 6f 72 20  certificate for 
10fa0 70 65 65 72 20 6f 72 20 73 65 6c 66 20 2a 2f 0a  peer or self */.
10fb0 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
10fc0 32 29 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c  2) {..peer = SSL
10fd0 5f 67 65 74 5f 70 65 65 72 5f 63 65 72 74 69 66  _get_peer_certif
10fe0 69 63 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e  icate(statePtr->
10ff0 73 73 6c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65  ssl);.    } else
11000 20 7b 0a 09 70 65 65 72 20 3d 20 53 53 4c 5f 67   {..peer = SSL_g
11010 65 74 5f 63 65 72 74 69 66 69 63 61 74 65 28 73  et_certificate(s
11020 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
11030 20 20 20 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20     }.    /* Get 
11040 58 35 30 39 20 63 65 72 74 69 66 69 63 61 74 65  X509 certificate
11050 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66 20   info */.    if 
11060 28 70 65 65 72 29 20 7b 0a 09 6f 62 6a 50 74 72  (peer) {..objPtr
11070 20 3d 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f 62   = Tls_NewX509Ob
11080 6a 28 69 6e 74 65 72 70 2c 20 70 65 65 72 2c 20  j(interp, peer, 
11090 31 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d  1);..if (objc ==
110a0 20 32 29 20 7b 0a 09 20 20 20 20 58 35 30 39 5f   2) {..    X509_
110b0 66 72 65 65 28 70 65 65 72 29 3b 0a 09 20 20 20  free(peer);..   
110c0 20 70 65 65 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d   peer = NULL;..}
110d0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f  .    } else {..o
110e0 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
110f0 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
11100 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
11110 65 65 72 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  eer name */.    
11120 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
11130 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 65 65  rp, objPtr, "pee
11140 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 30  rname", SSL_get0
11150 5f 70 65 65 72 6e 61 6d 65 28 73 74 61 74 65 50  _peername(stateP
11160 74 72 2d 3e 73 73 6c 29 2c 20 2d 31 29 3b 0a 20  tr->ssl), -1);. 
11170 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69     LAPPEND_INT(i
11180 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
11190 73 62 69 74 73 22 2c 20 53 53 4c 5f 67 65 74 5f  sbits", SSL_get_
111a0 63 69 70 68 65 72 5f 62 69 74 73 28 73 74 61 74  cipher_bits(stat
111b0 65 50 74 72 2d 3e 73 73 6c 2c 20 4e 55 4c 4c 29  ePtr->ssl, NULL)
111c0 29 3b 0a 0a 20 20 20 20 63 69 70 68 65 72 73 20  );..    ciphers 
111d0 3d 20 28 63 68 61 72 2a 29 53 53 4c 5f 67 65 74  = (char*)SSL_get
111e0 5f 63 69 70 68 65 72 28 73 74 61 74 65 50 74 72  _cipher(statePtr
111f0 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 4c 41 50 50  ->ssl);.    LAPP
11200 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11210 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 22  objPtr, "cipher"
11220 2c 20 63 69 70 68 65 72 73 2c 20 2d 31 29 3b 0a  , ciphers, -1);.
11230 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74  .    /* Verify t
11240 68 65 20 58 35 30 39 20 63 65 72 74 69 66 69 63  he X509 certific
11250 61 74 65 20 70 72 65 73 65 6e 74 65 64 20 62 79  ate presented by
11260 20 74 68 65 20 70 65 65 72 20 2a 2f 0a 20 20 20   the peer */.   
11270 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74   LAPPEND_STR(int
11280 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
11290 72 69 66 79 52 65 73 75 6c 74 22 2c 0a 09 58 35  rifyResult",..X5
112a0 30 39 5f 76 65 72 69 66 79 5f 63 65 72 74 5f 65  09_verify_cert_e
112b0 72 72 6f 72 5f 73 74 72 69 6e 67 28 53 53 4c 5f  rror_string(SSL_
112c0 67 65 74 5f 76 65 72 69 66 79 5f 72 65 73 75 6c  get_verify_resul
112d0 74 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  t(statePtr->ssl)
112e0 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  ), -1);..    /* 
112f0 56 65 72 69 66 79 20 6d 6f 64 65 20 2a 2f 0a 20  Verify mode */. 
11300 20 20 20 6d 6f 64 65 20 3d 20 53 53 4c 5f 67 65     mode = SSL_ge
11310 74 5f 76 65 72 69 66 79 5f 6d 6f 64 65 28 73 74  t_verify_mode(st
11320 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20  atePtr->ssl);.  
11330 20 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c    if (mode & SSL
11340 5f 56 45 52 49 46 59 5f 4e 4f 4e 45 29 20 7b 0a  _VERIFY_NONE) {.
11350 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11360 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
11370 72 69 66 79 4d 6f 64 65 22 2c 20 22 6e 6f 6e 65  rifyMode", "none
11380 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c  ", -1);.    } el
11390 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6c  se {..Tcl_Obj *l
113a0 69 73 74 4f 62 6a 50 74 72 20 3d 20 54 63 6c 5f  istObjPtr = Tcl_
113b0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
113c0 4c 4c 29 3b 0a 09 69 66 20 28 6d 6f 64 65 20 26  LL);..if (mode &
113d0 20 53 53 4c 5f 56 45 52 49 46 59 5f 50 45 45 52   SSL_VERIFY_PEER
113e0 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
113f0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
11400 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
11410 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
11420 69 6e 67 4f 62 6a 28 22 70 65 65 72 22 2c 20 2d  ingObj("peer", -
11430 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64  1));..}..if (mod
11440 65 20 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 46  e & SSL_VERIFY_F
11450 41 49 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43  AIL_IF_NO_PEER_C
11460 45 52 54 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f  ERT) {..    Tcl_
11470 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
11480 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
11490 74 4f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77  tObjPtr, Tcl_New
114a0 53 74 72 69 6e 67 4f 62 6a 28 22 66 61 69 6c 20  StringObj("fail 
114b0 69 66 20 6e 6f 20 70 65 65 72 20 63 65 72 74 22  if no peer cert"
114c0 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20 28  , -1));..}..if (
114d0 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49 46  mode & SSL_VERIF
114e0 59 5f 43 4c 49 45 4e 54 5f 4f 4e 43 45 29 20 7b  Y_CLIENT_ONCE) {
114f0 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
11500 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11510 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
11520 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11530 4f 62 6a 28 22 63 6c 69 65 6e 74 20 6f 6e 63 65  Obj("client once
11540 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 69 66 20  ", -1));..}..if 
11550 28 6d 6f 64 65 20 26 20 53 53 4c 5f 56 45 52 49  (mode & SSL_VERI
11560 46 59 5f 50 4f 53 54 5f 48 41 4e 44 53 48 41 4b  FY_POST_HANDSHAK
11570 45 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69  E) {..    Tcl_Li
11580 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11590 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  nt(interp, listO
115a0 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
115b0 72 69 6e 67 4f 62 6a 28 22 70 6f 73 74 20 68 61  ringObj("post ha
115c0 6e 64 73 68 61 6b 65 22 2c 20 2d 31 29 29 3b 0a  ndshake", -1));.
115d0 09 7d 0a 09 4c 41 50 50 45 4e 44 5f 4f 42 4a 28  .}..LAPPEND_OBJ(
115e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
115f0 22 76 65 72 69 66 79 4d 6f 64 65 22 2c 20 6c 69  "verifyMode", li
11600 73 74 4f 62 6a 50 74 72 29 0a 20 20 20 20 7d 0a  stObjPtr).    }.
11610 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d  .    /* Verify m
11620 6f 64 65 20 64 65 70 74 68 20 2a 2f 0a 20 20 20  ode depth */.   
11630 20 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74   LAPPEND_INT(int
11640 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65  erp, objPtr, "ve
11650 72 69 66 79 44 65 70 74 68 22 2c 20 53 53 4c 5f  rifyDepth", SSL_
11660 67 65 74 5f 76 65 72 69 66 79 5f 64 65 70 74 68  get_verify_depth
11670 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 29  (statePtr->ssl))
11680 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 70 6f 72 74  ;..    /* Report
11690 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70 72   the selected pr
116a0 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73 75  otocol as a resu
116b0 6c 74 20 6f 66 20 74 68 65 20 6e 65 67 6f 74 69  lt of the negoti
116c0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 53 53 4c  ation */.    SSL
116d0 5f 67 65 74 30 5f 61 6c 70 6e 5f 73 65 6c 65 63  _get0_alpn_selec
116e0 74 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ted(statePtr->ss
116f0 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 29  l, &proto, &len)
11700 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54  ;.    LAPPEND_ST
11710 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
11720 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61 72 20  , "alpn", (char 
11730 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69  *)proto, (Tcl_Si
11740 7a 65 29 20 6c 65 6e 29 3b 0a 20 20 20 20 4c 41  ze) len);.    LA
11750 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11760 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74 6f  , objPtr, "proto
11770 63 6f 6c 22 2c 20 53 53 4c 5f 67 65 74 5f 76 65  col", SSL_get_ve
11780 72 73 69 6f 6e 28 73 74 61 74 65 50 74 72 2d 3e  rsion(statePtr->
11790 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20  ssl), -1);..    
117a0 2f 2a 20 56 61 6c 69 64 20 66 6f 72 20 6e 6f 6e  /* Valid for non
117b0 2d 52 53 41 20 73 69 67 6e 61 74 75 72 65 20 61  -RSA signature a
117c0 6e 64 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20 20  nd TLS 1.3 */.  
117d0 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 32 29    if (objc == 2)
117e0 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65   {..res = SSL_ge
117f0 74 5f 70 65 65 72 5f 73 69 67 6e 61 74 75 72 65  t_peer_signature
11800 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
11810 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
11820 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 53   else {..res = S
11830 53 4c 5f 67 65 74 5f 73 69 67 6e 61 74 75 72 65  SL_get_signature
11840 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73  _nid(statePtr->s
11850 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d  sl, &nid);.    }
11860 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b  .    if (!res) {
11870 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41  nid = 0;}.    LA
11880 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11890 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61  , objPtr, "signa
118a0 74 75 72 65 48 61 73 68 41 6c 67 6f 72 69 74 68  tureHashAlgorith
118b0 6d 22 2c 20 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e  m", OBJ_nid2ln(n
118c0 69 64 29 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f  id), -1);..    /
118d0 2a 20 41 64 64 65 64 20 69 6e 20 4f 70 65 6e 53  * Added in OpenS
118e0 53 4c 20 31 2e 31 2e 31 61 20 2a 2f 0a 23 69 66  SL 1.1.1a */.#if
118f0 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e   OPENSSL_VERSION
11900 5f 4e 55 4d 42 45 52 20 3e 20 30 78 31 30 31 30  _NUMBER > 0x1010
11910 31 30 30 30 4c 0a 20 20 20 20 69 66 20 28 6f 62  1000L.    if (ob
11920 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 72 65 73 20  jc == 2) {..res 
11930 3d 20 53 53 4c 5f 67 65 74 5f 70 65 65 72 5f 73  = SSL_get_peer_s
11940 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e 69  ignature_type_ni
11950 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  d(statePtr->ssl,
11960 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c   &nid);.    } el
11970 73 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f  se {..res = SSL_
11980 67 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 74 79  get_signature_ty
11990 70 65 5f 6e 69 64 28 73 74 61 74 65 50 74 72 2d  pe_nid(statePtr-
119a0 3e 73 73 6c 2c 20 26 6e 69 64 29 3b 0a 20 20 20  >ssl, &nid);.   
119b0 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29   }.    if (!res)
119c0 20 7b 6e 69 64 20 3d 20 30 3b 7d 0a 20 20 20 20   {nid = 0;}.    
119d0 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
119e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 69 67  rp, objPtr, "sig
119f0 6e 61 74 75 72 65 54 79 70 65 22 2c 20 4f 42 4a  natureType", OBJ
11a00 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c 20 2d 31  _nid2ln(nid), -1
11a10 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 54  );.#endif..    T
11a20 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11a30 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b  interp, objPtr);
11a40 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11a50 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
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 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11aa0 0a 20 2a 0a 20 2a 20 43 6f 6e 6e 65 63 74 69 6f  . *. * Connectio
11ab0 6e 49 6e 66 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72  nInfoObjCmd -- r
11ac0 65 74 75 72 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e  eturn connection
11ad0 20 69 6e 66 6f 20 66 72 6f 6d 20 4f 70 65 6e 53   info from OpenS
11ae0 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  SL.. *. * Result
11af0 73 3a 0a 20 2a 09 41 20 6c 69 73 74 20 6f 66 20  s:. *.A list of 
11b00 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 0a  connection info.
11b10 20 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    *. *----------
11b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b50 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73  ---------. */..s
11b60 74 61 74 69 63 20 69 6e 74 20 43 6f 6e 6e 65 63  tatic int Connec
11b70 74 69 6f 6e 49 6e 66 6f 4f 62 6a 43 6d 64 28 43  tionInfoObjCmd(C
11b80 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
11b90 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70  Data, Tcl_Interp
11ba0 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
11bb0 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  jc, Tcl_Obj *con
11bc0 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20  st objv[]) {.   
11bd0 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
11be0 6e 3b 09 09 2f 2a 20 54 68 65 20 63 68 61 6e 6e  n;../* The chann
11bf0 65 6c 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65  el to set a mode
11c00 20 6f 6e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65   on */.    State
11c10 20 2a 73 74 61 74 65 50 74 72 3b 09 09 2f 2a 20   *statePtr;../* 
11c20 63 6c 69 65 6e 74 20 73 74 61 74 65 20 66 6f 72  client state for
11c30 20 73 73 6c 20 73 6f 63 6b 65 74 20 2a 2f 0a 20   ssl socket */. 
11c40 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
11c50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a 20 20  tr, *listPtr;.  
11c60 20 20 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c    const SSL *ssl
11c70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f  ;.    const SSL_
11c80 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 3b 0a  CIPHER *cipher;.
11c90 20 20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 53 45      const SSL_SE
11ca0 53 53 49 4f 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a  SSION *session;.
11cb0 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44      const EVP_MD
11cc0 20 2a 6d 64 3b 0a 20 20 20 20 28 76 6f 69 64 29   *md;.    (void)
11cd0 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
11ce0 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
11cf0 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  d");..    if (ob
11d00 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f  jc != 2) {..Tcl_
11d10 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
11d20 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63  erp, 1, objv, "c
11d30 68 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72  hannel");..retur
11d40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
11d50 20 7d 0a 0a 20 20 20 20 63 68 61 6e 20 3d 20 54   }..    chan = T
11d60 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e  cl_GetChannel(in
11d70 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
11d80 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55  ing(objv[1]), NU
11d90 4c 4c 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  LL);.    if (cha
11da0 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
11db0 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
11dc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11dd0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
11de0 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
11df0 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
11e00 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
11e10 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
11e20 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
11e30 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
11e40 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
11e50 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
11e60 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
11e70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
11e80 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
11e90 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
11ea0 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20  elName(chan),.. 
11eb0 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c     "\": not a TL
11ec0 53 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61  S channel", (cha
11ed0 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c  r *) NULL);..Tcl
11ee0 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
11ef0 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 43 4f  terp, "TLS", "CO
11f00 4e 4e 45 43 54 49 4f 4e 22 2c 20 22 43 48 41 4e  NNECTION", "CHAN
11f10 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
11f20 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
11f30 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
11f40 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6f  OR;.    }..    o
11f50 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c  bjPtr = Tcl_NewL
11f60 69 73 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b  istObj(0, NULL);
11f70 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  ..    /* Connect
11f80 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20  ion info */.    
11f90 73 74 61 74 65 50 74 72 20 3d 20 28 53 74 61 74  statePtr = (Stat
11fa0 65 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e  e *)Tcl_GetChann
11fb0 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
11fc0 68 61 6e 29 3b 0a 20 20 20 20 73 73 6c 20 3d 20  han);.    ssl = 
11fd0 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 3b 0a 20  statePtr->ssl;. 
11fe0 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20 4e 55     if (ssl != NU
11ff0 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73  LL) {..const uns
12000 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
12010 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74  o;..unsigned int
12020 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20 49 6e 69 74   ulen;.../* Init
12030 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6e 69 73  ialization finis
12040 68 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  hed */..LAPPEND_
12050 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
12060 50 74 72 2c 20 22 69 6e 69 74 5f 66 69 6e 69 73  Ptr, "init_finis
12070 68 65 64 22 2c 20 53 53 4c 5f 69 73 5f 69 6e 69  hed", SSL_is_ini
12080 74 5f 66 69 6e 69 73 68 65 64 28 73 73 6c 29 29  t_finished(ssl))
12090 3b 0a 0a 09 2f 2a 20 63 6f 6e 6e 65 63 74 69 6f  ;.../* connectio
120a0 6e 20 73 74 61 74 65 20 2a 2f 0a 09 4c 41 50 50  n state */..LAPP
120b0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
120c0 6f 62 6a 50 74 72 2c 20 22 73 74 61 74 65 22 2c  objPtr, "state",
120d0 20 53 53 4c 5f 73 74 61 74 65 5f 73 74 72 69 6e   SSL_state_strin
120e0 67 5f 6c 6f 6e 67 28 73 73 6c 29 2c 20 2d 31 29  g_long(ssl), -1)
120f0 3b 0a 0a 09 2f 2a 20 47 65 74 20 53 4e 49 20 72  ;.../* Get SNI r
12100 65 71 75 65 73 74 65 64 20 73 65 72 76 65 72 20  equested server 
12110 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
12120 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12130 50 74 72 2c 20 22 73 65 72 76 65 72 6e 61 6d 65  Ptr, "servername
12140 22 2c 20 53 53 4c 5f 67 65 74 5f 73 65 72 76 65  ", SSL_get_serve
12150 72 6e 61 6d 65 28 73 73 6c 2c 20 54 4c 53 45 58  rname(ssl, TLSEX
12160 54 5f 4e 41 4d 45 54 59 50 45 5f 68 6f 73 74 5f  T_NAMETYPE_host_
12170 6e 61 6d 65 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  name), -1);.../*
12180 20 52 65 70 6f 72 74 20 74 68 65 20 73 65 6c 65   Report the sele
12190 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c 20 61 73  cted protocol as
121a0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
121b0 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
121c0 09 53 53 4c 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  .SSL_get0_alpn_s
121d0 65 6c 65 63 74 65 64 28 73 74 61 74 65 50 74 72  elected(statePtr
121e0 2d 3e 73 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26  ->ssl, &proto, &
121f0 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  ulen);..LAPPEND_
12200 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12210 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68 61  tr, "alpn", (cha
12220 72 20 2a 29 70 72 6f 74 6f 2c 20 28 54 63 6c 5f  r *)proto, (Tcl_
12230 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
12240 2a 20 47 65 74 20 70 72 6f 74 6f 63 6f 6c 20 2a  * Get protocol *
12250 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  /..LAPPEND_STR(i
12260 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12270 70 72 6f 74 6f 63 6f 6c 22 2c 20 53 53 4c 5f 67  protocol", SSL_g
12280 65 74 5f 76 65 72 73 69 6f 6e 28 73 73 6c 29 2c  et_version(ssl),
12290 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 65 6e 65 67   -1);.../* Reneg
122a0 6f 74 69 61 74 69 6f 6e 20 61 6c 6c 6f 77 65 64  otiation allowed
122b0 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
122c0 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
122d0 2c 20 22 72 65 6e 65 67 6f 74 69 61 74 69 6f 6e  , "renegotiation
122e0 5f 61 6c 6c 6f 77 65 64 22 2c 20 53 53 4c 5f 67  _allowed", SSL_g
122f0 65 74 5f 73 65 63 75 72 65 5f 72 65 6e 65 67 6f  et_secure_renego
12300 74 69 61 74 69 6f 6e 5f 73 75 70 70 6f 72 74 28  tiation_support(
12310 28 53 53 4c 20 2a 29 20 73 73 6c 29 29 3b 0a 0a  (SSL *) ssl));..
12320 09 2f 2a 20 47 65 74 20 73 65 63 75 72 69 74 79  ./* Get security
12330 20 6c 65 76 65 6c 20 2a 2f 0a 09 4c 41 50 50 45   level */..LAPPE
12340 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12350 62 6a 50 74 72 2c 20 22 73 65 63 75 72 69 74 79  bjPtr, "security
12360 5f 6c 65 76 65 6c 22 2c 20 53 53 4c 5f 67 65 74  _level", SSL_get
12370 5f 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c 28  _security_level(
12380 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 53 65 73 73  ssl));.../* Sess
12390 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41 50  ion info */..LAP
123a0 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70  PEND_BOOL(interp
123b0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
123c0 6f 6e 5f 72 65 75 73 65 64 22 2c 20 53 53 4c 5f  on_reused", SSL_
123d0 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 28 73  session_reused(s
123e0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 73 65  sl));.../* Is se
123f0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 09 4c 41  rver info */..LA
12400 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12410 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 73  p, objPtr, "is_s
12420 65 72 76 65 72 22 2c 20 53 53 4c 5f 69 73 5f 73  erver", SSL_is_s
12430 65 72 76 65 72 28 73 73 6c 29 29 3b 0a 0a 09 2f  erver(ssl));.../
12440 2a 20 49 73 20 44 54 4c 53 20 2a 2f 0a 09 4c 41  * Is DTLS */..LA
12450 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72  PPEND_BOOL(inter
12460 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f 64  p, objPtr, "is_d
12470 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 64 74 6c  tls", SSL_is_dtl
12480 73 28 73 73 6c 29 29 3b 0a 0a 23 69 66 20 4f 50  s(ssl));..#if OP
12490 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55  ENSSL_VERSION_NU
124a0 4d 42 45 52 20 3e 3d 20 30 78 33 30 32 30 30 30  MBER >= 0x302000
124b0 30 30 4c 0a 09 2f 2a 20 49 73 20 51 55 49 43 20  00L../* Is QUIC 
124c0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
124d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
124e0 20 22 69 73 5f 71 75 69 63 22 2c 20 53 53 4c 5f   "is_quic", SSL_
124f0 69 73 5f 71 75 69 63 28 73 73 6c 29 29 3b 0a 0a  is_quic(ssl));..
12500 09 2f 2a 20 49 73 20 54 4c 53 20 2a 2f 0a 09 4c  ./* Is TLS */..L
12510 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65  APPEND_BOOL(inte
12520 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 69 73 5f  rp, objPtr, "is_
12530 74 6c 73 22 2c 20 53 53 4c 5f 69 73 5f 74 6c 73  tls", SSL_is_tls
12540 28 73 73 6c 29 29 3b 0a 23 65 6e 64 69 66 0a 0a  (ssl));.#endif..
12550 09 2f 2a 20 44 41 4e 45 20 54 4c 53 20 61 75 74  ./* DANE TLS aut
12560 68 65 6e 74 69 63 61 74 69 6f 6e 20 2a 2f 0a 09  hentication */..
12570 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74  LAPPEND_BOOL(int
12580 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 64 61  erp, objPtr, "da
12590 6e 65 5f 61 75 74 68 22 2c 20 53 53 4c 5f 67 65  ne_auth", SSL_ge
125a0 74 30 5f 64 61 6e 65 28 28 53 53 4c 20 2a 29 73  t0_dane((SSL *)s
125b0 73 6c 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09  sl) != NULL);...
125c0 2f 2a 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61  /* Waiting for a
125d0 73 79 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  sync */..LAPPEND
125e0 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
125f0 6a 50 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66  jPtr, "waiting_f
12600 6f 72 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77  or_async", SSL_w
12610 61 69 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63  aiting_for_async
12620 28 28 53 53 4c 20 2a 29 73 73 6c 29 29 3b 0a 0a  ((SSL *)ssl));..
12630 09 2f 2a 20 54 69 6d 65 2d 6f 75 74 20 2a 2f 0a  ./* Time-out */.
12640 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
12650 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
12660 69 6d 65 2d 6f 75 74 22 2c 20 53 53 4c 5f 67 65  ime-out", SSL_ge
12670 74 5f 64 65 66 61 75 6c 74 5f 74 69 6d 65 6f 75  t_default_timeou
12680 74 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20 49 73  t(ssl));.../* Is
12690 20 43 65 72 74 69 66 69 63 61 74 65 20 54 72 61   Certificate Tra
126a0 6e 73 70 61 72 65 6e 63 79 20 76 61 6c 69 64 61  nsparency valida
126b0 74 69 6f 6e 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  tion enabled */.
126c0 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69 6e  .LAPPEND_BOOL(in
126d0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
126e0 74 5f 65 6e 61 62 6c 65 64 22 2c 20 53 53 4c 5f  t_enabled", SSL_
126f0 63 74 5f 69 73 5f 65 6e 61 62 6c 65 64 28 73 73  ct_is_enabled(ss
12700 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  l));.    }..    
12710 2f 2a 20 43 69 70 68 65 72 20 69 6e 66 6f 20 2a  /* Cipher info *
12720 2f 0a 20 20 20 20 63 69 70 68 65 72 20 3d 20 53  /.    cipher = S
12730 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63  SL_get_current_c
12740 69 70 68 65 72 28 73 73 6c 29 3b 0a 20 20 20 20  ipher(ssl);.    
12750 69 66 20 28 63 69 70 68 65 72 20 21 3d 20 4e 55  if (cipher != NU
12760 4c 4c 29 20 7b 0a 09 63 68 61 72 20 62 75 66 5b  LL) {..char buf[
12770 42 55 46 53 49 5a 5d 20 3d 20 7b 30 7d 3b 0a 09  BUFSIZ] = {0};..
12780 69 6e 74 20 62 69 74 73 2c 20 61 6c 67 5f 62 69  int bits, alg_bi
12790 74 73 3b 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20  ts;.../* Cipher 
127a0 6e 61 6d 65 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  name */..LAPPEND
127b0 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
127c0 50 74 72 2c 20 22 63 69 70 68 65 72 22 2c 20 53  Ptr, "cipher", S
127d0 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 6e 61  SL_CIPHER_get_na
127e0 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
127f0 0a 0a 09 2f 2a 20 52 46 43 20 6e 61 6d 65 20 6f  .../* RFC name o
12800 66 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50  f cipher */..LAP
12810 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
12820 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 6e 64 61   objPtr, "standa
12830 72 64 5f 6e 61 6d 65 22 2c 20 53 53 4c 5f 43 49  rd_name", SSL_CI
12840 50 48 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61  PHER_standard_na
12850 6d 65 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  me(cipher), -1);
12860 0a 0a 09 2f 2a 20 4f 70 65 6e 53 53 4c 20 6e 61  .../* OpenSSL na
12870 6d 65 20 6f 66 20 63 69 70 68 65 72 20 2a 2f 0a  me of cipher */.
12880 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12890 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6f 70  erp, objPtr, "op
128a0 65 6e 73 73 6c 5f 6e 61 6d 65 22 2c 20 4f 50 45  enssl_name", OPE
128b0 4e 53 53 4c 5f 63 69 70 68 65 72 5f 6e 61 6d 65  NSSL_cipher_name
128c0 28 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e  (SSL_CIPHER_stan
128d0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
128e0 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 6e 75  )), -1);.../* nu
128f0 6d 62 65 72 20 6f 66 20 73 65 63 72 65 74 20 62  mber of secret b
12900 69 74 73 20 75 73 65 64 20 66 6f 72 20 63 69 70  its used for cip
12910 68 65 72 20 2a 2f 0a 09 62 69 74 73 20 3d 20 53  her */..bits = S
12920 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 62 69  SL_CIPHER_get_bi
12930 74 73 28 63 69 70 68 65 72 2c 20 26 61 6c 67 5f  ts(cipher, &alg_
12940 62 69 74 73 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  bits);..LAPPEND_
12950 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12960 74 72 2c 20 22 73 65 63 72 65 74 5f 62 69 74 73  tr, "secret_bits
12970 22 2c 20 62 69 74 73 29 3b 0a 09 4c 41 50 50 45  ", bits);..LAPPE
12980 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12990 62 6a 50 74 72 2c 20 22 61 6c 67 6f 72 69 74 68  bjPtr, "algorith
129a0 6d 5f 62 69 74 73 22 2c 20 61 6c 67 5f 62 69 74  m_bits", alg_bit
129b0 73 29 3b 0a 09 2f 2a 20 61 6c 67 5f 62 69 74 73  s);../* alg_bits
129c0 20 69 73 20 61 63 74 75 61 6c 20 6b 65 79 20 73   is actual key s
129d0 65 63 72 65 74 20 62 69 74 73 2e 20 49 66 20 75  ecret bits. If u
129e0 73 65 20 62 69 74 73 20 61 6e 64 20 73 65 63 72  se bits and secr
129f0 65 74 20 28 61 6c 67 6f 72 69 74 68 6d 29 20 62  et (algorithm) b
12a00 69 74 73 20 64 69 66 66 65 72 2c 0a 09 20 20 20  its differ,..   
12a10 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
12a20 62 69 74 73 20 61 72 65 20 66 69 78 65 64 2c 20  bits are fixed, 
12a30 69 2e 65 2e 20 66 6f 72 20 6c 69 6d 69 74 65 64  i.e. for limited
12a40 20 65 78 70 6f 72 74 20 63 69 70 68 65 72 73 20   export ciphers 
12a50 28 62 69 74 73 20 3c 20 35 36 29 20 2a 2f 0a 0a  (bits < 56) */..
12a60 09 2f 2a 20 49 6e 64 69 63 61 74 65 73 20 77 68  ./* Indicates wh
12a70 69 63 68 20 53 53 4c 2f 54 4c 53 20 70 72 6f 74  ich SSL/TLS prot
12a80 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 20 66 69 72  ocol version fir
12a90 73 74 20 64 65 66 69 6e 65 64 20 74 68 65 20 63  st defined the c
12aa0 69 70 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e  ipher */..LAPPEN
12ab0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12ac0 6a 50 74 72 2c 20 22 6d 69 6e 5f 76 65 72 73 69  jPtr, "min_versi
12ad0 6f 6e 22 2c 20 53 53 4c 5f 43 49 50 48 45 52 5f  on", SSL_CIPHER_
12ae0 67 65 74 5f 76 65 72 73 69 6f 6e 28 63 69 70 68  get_version(ciph
12af0 65 72 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 43  er), -1);.../* C
12b00 69 70 68 65 72 20 4e 49 44 20 2a 2f 0a 09 4c 41  ipher NID */..LA
12b10 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12b20 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65  , objPtr, "ciphe
12b30 72 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29 4f  rNID", (char *)O
12b40 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49  BJ_nid2ln(SSL_CI
12b50 50 48 45 52 5f 67 65 74 5f 63 69 70 68 65 72 5f  PHER_get_cipher_
12b60 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12b70 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  );..LAPPEND_STR(
12b80 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12b90 22 64 69 67 65 73 74 4e 49 44 22 2c 20 28 63 68  "digestNID", (ch
12ba0 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28  ar *)OBJ_nid2ln(
12bb0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 64  SSL_CIPHER_get_d
12bc0 69 67 65 73 74 5f 6e 69 64 28 63 69 70 68 65 72  igest_nid(cipher
12bd0 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  )), -1);..LAPPEN
12be0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
12bf0 6a 50 74 72 2c 20 22 6b 65 79 45 78 63 68 61 6e  jPtr, "keyExchan
12c00 67 65 4e 49 44 22 2c 20 28 63 68 61 72 20 2a 29  geNID", (char *)
12c10 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f 43  OBJ_nid2ln(SSL_C
12c20 49 50 48 45 52 5f 67 65 74 5f 6b 78 5f 6e 69 64  IPHER_get_kx_nid
12c30 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12c40 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12c50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61 75  erp, objPtr, "au
12c60 74 68 65 6e 74 69 63 61 74 69 6f 6e 4e 49 44 22  thenticationNID"
12c70 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69  , (char *)OBJ_ni
12c80 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f  d2ln(SSL_CIPHER_
12c90 67 65 74 5f 61 75 74 68 5f 6e 69 64 28 63 69 70  get_auth_nid(cip
12ca0 68 65 72 29 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a  her)), -1);.../*
12cb0 20 6d 65 73 73 61 67 65 20 61 75 74 68 65 6e 74   message authent
12cc0 69 63 61 74 69 6f 6e 20 63 6f 64 65 20 2d 20 43  ication code - C
12cd0 69 70 68 65 72 20 69 73 20 41 45 41 44 20 28 65  ipher is AEAD (e
12ce0 2e 67 2e 20 47 43 4d 20 6f 72 20 43 68 61 43 68  .g. GCM or ChaCh
12cf0 61 32 30 2f 50 6f 6c 79 31 33 30 35 29 20 6f 72  a20/Poly1305) or
12d00 20 6e 6f 74 20 2a 2f 0a 09 2f 2a 20 41 75 74 68   not */../* Auth
12d10 65 6e 74 69 63 61 74 65 64 20 45 6e 63 72 79 70  enticated Encryp
12d20 74 69 6f 6e 20 77 69 74 68 20 61 73 73 6f 63 69  tion with associ
12d30 61 74 65 64 20 64 61 74 61 20 28 41 45 41 44 29  ated data (AEAD)
12d40 20 63 68 65 63 6b 20 2a 2f 0a 09 4c 41 50 50 45   check */..LAPPE
12d50 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20  ND_BOOL(interp, 
12d60 6f 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f  objPtr, "cipher_
12d70 69 73 5f 61 65 61 64 22 2c 20 53 53 4c 5f 43 49  is_aead", SSL_CI
12d80 50 48 45 52 5f 69 73 5f 61 65 61 64 28 63 69 70  PHER_is_aead(cip
12d90 68 65 72 29 29 3b 0a 0a 09 2f 2a 20 44 69 67 65  her));.../* Dige
12da0 73 74 20 75 73 65 64 20 64 75 72 69 6e 67 20 74  st used during t
12db0 68 65 20 53 53 4c 2f 54 4c 53 20 68 61 6e 64 73  he SSL/TLS hands
12dc0 68 61 6b 65 20 77 68 65 6e 20 75 73 69 6e 67 20  hake when using 
12dd0 74 68 65 20 63 69 70 68 65 72 2e 20 2a 2f 0a 09  the cipher. */..
12de0 6d 64 20 3d 20 53 53 4c 5f 43 49 50 48 45 52 5f  md = SSL_CIPHER_
12df0 67 65 74 5f 68 61 6e 64 73 68 61 6b 65 5f 64 69  get_handshake_di
12e00 67 65 73 74 28 63 69 70 68 65 72 29 3b 0a 09 4c  gest(cipher);..L
12e10 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72  APPEND_STR(inter
12e20 70 2c 20 6f 62 6a 50 74 72 2c 20 22 68 61 6e 64  p, objPtr, "hand
12e30 73 68 61 6b 65 5f 64 69 67 65 73 74 22 2c 20 28  shake_digest", (
12e40 63 68 61 72 20 2a 29 45 56 50 5f 4d 44 5f 6e 61  char *)EVP_MD_na
12e50 6d 65 28 6d 64 29 2c 20 2d 31 29 3b 0a 0a 09 2f  me(md), -1);.../
12e60 2a 20 47 65 74 20 4f 70 65 6e 53 53 4c 2d 73 70  * Get OpenSSL-sp
12e70 65 63 69 66 69 63 20 49 44 2c 20 6e 6f 74 20 49  ecific ID, not I
12e80 41 4e 41 20 49 44 20 2a 2f 0a 09 4c 41 50 50 45  ANA ID */..LAPPE
12e90 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f  ND_INT(interp, o
12ea0 62 6a 50 74 72 2c 20 22 63 69 70 68 65 72 5f 69  bjPtr, "cipher_i
12eb0 64 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49  d", (int) SSL_CI
12ec0 50 48 45 52 5f 67 65 74 5f 69 64 28 63 69 70 68  PHER_get_id(ciph
12ed0 65 72 29 29 3b 0a 0a 09 2f 2a 20 54 77 6f 2d 62  er));.../* Two-b
12ee0 79 74 65 20 49 44 20 75 73 65 64 20 69 6e 20 74  yte ID used in t
12ef0 68 65 20 54 4c 53 20 70 72 6f 74 6f 63 6f 6c 20  he TLS protocol 
12f00 6f 66 20 74 68 65 20 67 69 76 65 6e 20 63 69 70  of the given cip
12f10 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
12f20 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  INT(interp, objP
12f30 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 5f 69 64  tr, "protocol_id
12f40 22 2c 20 28 69 6e 74 29 20 53 53 4c 5f 43 49 50  ", (int) SSL_CIP
12f50 48 45 52 5f 67 65 74 5f 70 72 6f 74 6f 63 6f 6c  HER_get_protocol
12f60 5f 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  _id(cipher));...
12f70 2f 2a 20 54 65 78 74 75 61 6c 20 64 65 73 63 72  /* Textual descr
12f80 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 69  iption of the ci
12f90 70 68 65 72 20 2a 2f 0a 09 69 66 20 28 53 53 4c  pher */..if (SSL
12fa0 5f 43 49 50 48 45 52 5f 64 65 73 63 72 69 70 74  _CIPHER_descript
12fb0 69 6f 6e 28 63 69 70 68 65 72 2c 20 62 75 66 2c  ion(cipher, buf,
12fc0 20 73 69 7a 65 6f 66 28 62 75 66 29 29 20 21 3d   sizeof(buf)) !=
12fd0 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 4c 41   NULL) {..    LA
12fe0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
12ff0 2c 20 6f 62 6a 50 74 72 2c 20 22 64 65 73 63 72  , objPtr, "descr
13000 69 70 74 69 6f 6e 22 2c 20 62 75 66 2c 20 2d 31  iption", buf, -1
13010 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
13020 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f   /* Session info
13030 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 20   */.    session 
13040 3d 20 53 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f  = SSL_get_sessio
13050 6e 28 73 73 6c 29 3b 0a 20 20 20 20 69 66 20 28  n(ssl);.    if (
13060 73 65 73 73 69 6f 6e 20 21 3d 20 4e 55 4c 4c 29  session != NULL)
13070 20 7b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e   {..const unsign
13080 65 64 20 63 68 61 72 20 2a 74 69 63 6b 65 74 3b  ed char *ticket;
13090 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 32 3b 0a 09  ..size_t len2;..
130a0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 75 6c 65  unsigned int ule
130b0 6e 3b 0a 09 63 6f 6e 73 74 20 75 6e 73 69 67 6e  n;..const unsign
130c0 65 64 20 63 68 61 72 20 2a 73 65 73 73 69 6f 6e  ed char *session
130d0 5f 69 64 2c 20 2a 70 72 6f 74 6f 3b 0a 09 75 6e  _id, *proto;..un
130e0 73 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 66  signed char buff
130f0 65 72 5b 53 53 4c 5f 4d 41 58 5f 4d 41 53 54 45  er[SSL_MAX_MASTE
13100 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 5d 3b 0a 0a  R_KEY_LENGTH];..
13110 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
13120 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
13130 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
13140 74 68 65 20 41 4c 50 4e 20 6e 65 67 6f 74 69 61  the ALPN negotia
13150 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f 53 45 53  tion */..SSL_SES
13160 53 49 4f 4e 5f 67 65 74 30 5f 61 6c 70 6e 5f 73  SION_get0_alpn_s
13170 65 6c 65 63 74 65 64 28 73 65 73 73 69 6f 6e 2c  elected(session,
13180 20 26 70 72 6f 74 6f 2c 20 26 6c 65 6e 32 29 3b   &proto, &len2);
13190 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
131a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
131b0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 20 70  lpn", (char *) p
131c0 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29  roto, (Tcl_Size)
131d0 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 52 65 70   len2);.../* Rep
131e0 6f 72 74 20 74 68 65 20 73 65 6c 65 63 74 65 64  ort the selected
131f0 20 70 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72   protocol as a r
13200 65 73 75 6c 74 20 6f 66 20 74 68 65 20 4e 50 4e  esult of the NPN
13210 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a   negotiation */.
13220 23 69 66 64 65 66 20 55 53 45 5f 4e 50 4e 0a 09  #ifdef USE_NPN..
13230 53 53 4c 5f 67 65 74 30 5f 6e 65 78 74 5f 70 72  SSL_get0_next_pr
13240 6f 74 6f 5f 6e 65 67 6f 74 69 61 74 65 64 28 73  oto_negotiated(s
13250 73 6c 2c 20 26 70 72 6f 74 6f 2c 20 26 75 6c 65  sl, &proto, &ule
13260 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52  n);..LAPPEND_STR
13270 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13280 20 22 6e 70 6e 22 2c 20 28 63 68 61 72 20 2a 29   "npn", (char *)
13290 20 70 72 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a   proto, (Tcl_Siz
132a0 65 29 20 75 6c 65 6e 29 3b 0a 23 65 6e 64 69 66  e) ulen);.#endif
132b0 0a 0a 09 2f 2a 20 52 65 73 75 6d 61 62 6c 65 20  .../* Resumable 
132c0 73 65 73 73 69 6f 6e 20 2a 2f 0a 09 4c 41 50 50  session */..LAPP
132d0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
132e0 20 6f 62 6a 50 74 72 2c 20 22 72 65 73 75 6d 61   objPtr, "resuma
132f0 62 6c 65 22 2c 20 53 53 4c 5f 53 45 53 53 49 4f  ble", SSL_SESSIO
13300 4e 5f 69 73 5f 72 65 73 75 6d 61 62 6c 65 28 73  N_is_resumable(s
13310 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 53  ession));.../* S
13320 65 73 73 69 6f 6e 20 73 74 61 72 74 20 74 69 6d  ession start tim
13330 65 20 28 73 65 63 6f 6e 64 73 20 73 69 6e 63 65  e (seconds since
13340 20 65 70 6f 63 68 29 20 2a 2f 0a 09 4c 41 50 50   epoch) */..LAPP
13350 45 4e 44 5f 4c 4f 4e 47 28 69 6e 74 65 72 70 2c  END_LONG(interp,
13360 20 6f 62 6a 50 74 72 2c 20 22 73 74 61 72 74 5f   objPtr, "start_
13370 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45 53 53 49  time", SSL_SESSI
13380 4f 4e 5f 67 65 74 5f 74 69 6d 65 28 73 65 73 73  ON_get_time(sess
13390 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65  ion));.../* Time
133a0 6f 75 74 20 76 61 6c 75 65 20 2d 20 53 53 4c 5f  out value - SSL_
133b0 43 54 58 5f 67 65 74 5f 74 69 6d 65 6f 75 74 20  CTX_get_timeout 
133c0 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
133d0 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
133e0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74  terp, objPtr, "t
133f0 69 6d 65 6f 75 74 22 2c 20 53 53 4c 5f 53 45 53  imeout", SSL_SES
13400 53 49 4f 4e 5f 67 65 74 5f 74 69 6d 65 6f 75 74  SION_get_timeout
13410 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a  (session));.../*
13420 20 53 65 73 73 69 6f 6e 20 69 64 20 2d 20 54 4c   Session id - TL
13430 53 76 31 2e 32 20 61 6e 64 20 62 65 6c 6f 77 20  Sv1.2 and below 
13440 6f 6e 6c 79 20 2a 2f 0a 09 73 65 73 73 69 6f 6e  only */..session
13450 5f 69 64 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f  _id = SSL_SESSIO
13460 4e 5f 67 65 74 5f 69 64 28 73 65 73 73 69 6f 6e  N_get_id(session
13470 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45  , &ulen);..LAPPE
13480 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
13490 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69  , objPtr, "sessi
134a0 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f 6e 5f  on_id", session_
134b0 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
134c0 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69  len);.../* Sessi
134d0 6f 6e 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 73  on context */..s
134e0 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c 5f  ession_id = SSL_
134f0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 69 64 5f  SESSION_get0_id_
13500 63 6f 6e 74 65 78 74 28 73 65 73 73 69 6f 6e 2c  context(session,
13510 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e   &ulen);..LAPPEN
13520 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
13530 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
13540 6e 5f 63 6f 6e 74 65 78 74 22 2c 20 73 65 73 73  n_context", sess
13550 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f 53 69 7a  ion_id, (Tcl_Siz
13560 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f 2a 20 53  e) ulen);.../* S
13570 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2d 20  ession ticket - 
13580 63 6c 69 65 6e 74 20 6f 6e 6c 79 20 2a 2f 0a 09  client only */..
13590 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
135a0 5f 74 69 63 6b 65 74 28 73 65 73 73 69 6f 6e 2c  _ticket(session,
135b0 20 26 74 69 63 6b 65 74 2c 20 26 6c 65 6e 32 29   &ticket, &len2)
135c0 3b 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41  ;..LAPPEND_BARRA
135d0 59 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  Y(interp, objPtr
135e0 2c 20 22 73 65 73 73 69 6f 6e 5f 74 69 63 6b 65  , "session_ticke
135f0 74 22 2c 20 74 69 63 6b 65 74 2c 20 28 54 63 6c  t", ticket, (Tcl
13600 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a 09  _Size) len2);...
13610 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69 63 6b 65  /* Session ticke
13620 74 20 6c 69 66 65 74 69 6d 65 20 68 69 6e 74 20  t lifetime hint 
13630 28 69 6e 20 73 65 63 6f 6e 64 73 29 20 2a 2f 0a  (in seconds) */.
13640 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28 69 6e  .LAPPEND_LONG(in
13650 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6c  terp, objPtr, "l
13660 69 66 65 74 69 6d 65 22 2c 20 53 53 4c 5f 53 45  ifetime", SSL_SE
13670 53 53 49 4f 4e 5f 67 65 74 5f 74 69 63 6b 65 74  SSION_get_ticket
13680 5f 6c 69 66 65 74 69 6d 65 5f 68 69 6e 74 28 73  _lifetime_hint(s
13690 65 73 73 69 6f 6e 29 29 3b 0a 0a 09 2f 2a 20 54  ession));.../* T
136a0 69 63 6b 65 74 20 61 70 70 20 64 61 74 61 20 2a  icket app data *
136b0 2f 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  /.#if OPENSSL_VE
136c0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
136d0 78 33 30 30 30 30 30 30 30 4c 0a 09 53 53 4c 5f  x30000000L..SSL_
136e0 53 45 53 53 49 4f 4e 5f 67 65 74 30 5f 74 69 63  SESSION_get0_tic
136f0 6b 65 74 5f 61 70 70 64 61 74 61 28 28 53 53 4c  ket_appdata((SSL
13700 5f 53 45 53 53 49 4f 4e 20 2a 29 20 73 65 73 73  _SESSION *) sess
13710 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26 6c  ion, &ticket, &l
13720 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  en2);..LAPPEND_B
13730 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 6f 62  ARRAY(interp, ob
13740 6a 50 74 72 2c 20 22 74 69 63 6b 65 74 5f 61 70  jPtr, "ticket_ap
13750 70 5f 64 61 74 61 22 2c 20 74 69 63 6b 65 74 2c  p_data", ticket,
13760 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32   (Tcl_Size) len2
13770 29 3b 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 47  );.#endif.../* G
13780 65 74 20 6d 61 73 74 65 72 20 6b 65 79 20 2a 2f  et master key */
13790 0a 09 6c 65 6e 32 20 3d 20 53 53 4c 5f 53 45 53  ..len2 = SSL_SES
137a0 53 49 4f 4e 5f 67 65 74 5f 6d 61 73 74 65 72 5f  SION_get_master_
137b0 6b 65 79 28 73 65 73 73 69 6f 6e 2c 20 62 75 66  key(session, buf
137c0 66 65 72 2c 20 53 53 4c 5f 4d 41 58 5f 4d 41 53  fer, SSL_MAX_MAS
137d0 54 45 52 5f 4b 45 59 5f 4c 45 4e 47 54 48 29 3b  TER_KEY_LENGTH);
137e0 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
137f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13800 20 22 6d 61 73 74 65 72 5f 6b 65 79 22 2c 20 62   "master_key", b
13810 75 66 66 65 72 2c 20 28 54 63 6c 5f 53 69 7a 65  uffer, (Tcl_Size
13820 29 20 6c 65 6e 32 29 3b 0a 0a 09 2f 2a 20 43 6f  ) len2);.../* Co
13830 6d 70 72 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a  mpression id */.
13840 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 64  .unsigned int id
13850 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
13860 65 74 5f 63 6f 6d 70 72 65 73 73 5f 69 64 28 73  et_compress_id(s
13870 65 73 73 69 6f 6e 29 3b 0a 09 4c 41 50 50 45 4e  ession);..LAPPEN
13880 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13890 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
138a0 6f 6e 5f 69 64 22 2c 20 69 64 20 3d 3d 20 31 20  on_id", id == 1 
138b0 3f 20 22 7a 6c 69 62 22 20 3a 20 22 6e 6f 6e 65  ? "zlib" : "none
138c0 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20  ", -1);.    }.. 
138d0 20 20 20 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f     /* Compressio
138e0 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 69 66  n info */.    if
138f0 20 28 73 73 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b   (ssl != NULL) {
13900 0a 23 69 66 64 65 66 20 48 41 56 45 5f 53 53 4c  .#ifdef HAVE_SSL
13910 5f 43 4f 4d 50 52 45 53 53 49 4f 4e 0a 09 63 6f  _COMPRESSION..co
13920 6e 73 74 20 43 4f 4d 50 5f 4d 45 54 48 4f 44 20  nst COMP_METHOD 
13930 2a 63 6f 6d 70 2c 20 2a 65 78 70 6e 3b 0a 09 63  *comp, *expn;..c
13940 6f 6d 70 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  omp = SSL_get_cu
13950 72 72 65 6e 74 5f 63 6f 6d 70 72 65 73 73 69 6f  rrent_compressio
13960 6e 28 73 73 6c 29 3b 0a 09 65 78 70 6e 20 3d 20  n(ssl);..expn = 
13970 53 53 4c 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f  SSL_get_current_
13980 65 78 70 61 6e 73 69 6f 6e 28 73 73 6c 29 3b 0a  expansion(ssl);.
13990 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e  ..LAPPEND_STR(in
139a0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
139b0 6f 6d 70 72 65 73 73 69 6f 6e 22 2c 20 63 6f 6d  ompression", com
139c0 70 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74  p ? SSL_COMP_get
139d0 5f 6e 61 6d 65 28 63 6f 6d 70 29 20 3a 20 22 6e  _name(comp) : "n
139e0 6f 6e 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50  one", -1);..LAPP
139f0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13a00 6f 62 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69  objPtr, "expansi
13a10 6f 6e 22 2c 20 65 78 70 6e 20 3f 20 53 53 4c 5f  on", expn ? SSL_
13a20 43 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 65 78  COMP_get_name(ex
13a30 70 6e 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31  pn) : "none", -1
13a40 29 3b 0a 23 65 6c 73 65 0a 09 4c 41 50 50 45 4e  );.#else..LAPPEN
13a50 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13a60 6a 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69  jPtr, "compressi
13a70 6f 6e 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  on", "none", -1)
13a80 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
13a90 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13aa0 65 78 70 61 6e 73 69 6f 6e 22 2c 20 22 6e 6f 6e  expansion", "non
13ab0 65 22 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  e", -1);.#endif.
13ac0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
13ad0 72 76 65 72 20 69 6e 66 6f 20 2a 2f 0a 20 20 20  rver info */.   
13ae0 20 7b 0a 09 6c 6f 6e 67 20 6d 6f 64 65 20 3d 20   {..long mode = 
13af0 53 53 4c 5f 43 54 58 5f 67 65 74 5f 73 65 73 73  SSL_CTX_get_sess
13b00 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73  ion_cache_mode(s
13b10 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09  tatePtr->ctx);..
13b20 63 68 61 72 20 2a 6d 73 67 3b 0a 0a 09 69 66 20  char *msg;...if 
13b30 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45 53 53  (mode & SSL_SESS
13b40 5f 43 41 43 48 45 5f 4f 46 46 29 20 7b 0a 09 20  _CACHE_OFF) {.. 
13b50 20 20 20 6d 73 67 20 3d 20 22 6f 66 66 22 3b 0a     msg = "off";.
13b60 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64 65  .} else if (mode
13b70 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43 48   & SSL_SESS_CACH
13b80 45 5f 43 4c 49 45 4e 54 29 20 7b 0a 09 20 20 20  E_CLIENT) {..   
13b90 20 6d 73 67 20 3d 20 22 63 6c 69 65 6e 74 22 3b   msg = "client";
13ba0 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f 64  ..} else if (mod
13bb0 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41 43  e & SSL_SESS_CAC
13bc0 48 45 5f 53 45 52 56 45 52 29 20 7b 0a 09 20 20  HE_SERVER) {..  
13bd0 20 20 6d 73 67 20 3d 20 22 73 65 72 76 65 72 22    msg = "server"
13be0 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6d 6f  ;..} else if (mo
13bf0 64 65 20 26 20 53 53 4c 5f 53 45 53 53 5f 43 41  de & SSL_SESS_CA
13c00 43 48 45 5f 42 4f 54 48 29 20 7b 0a 09 20 20 20  CHE_BOTH) {..   
13c10 20 6d 73 67 20 3d 20 22 62 6f 74 68 22 3b 0a 09   msg = "both";..
13c20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 73  } else {..    ms
13c30 67 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 09  g = "unknown";..
13c40 7d 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  }..LAPPEND_STR(i
13c50 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13c60 73 65 73 73 69 6f 6e 5f 63 61 63 68 65 5f 6d 6f  session_cache_mo
13c70 64 65 22 2c 20 6d 73 67 2c 20 2d 31 29 3b 0a 20  de", msg, -1);. 
13c80 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 41 20     }..    /* CA 
13c90 4c 69 73 74 20 2a 2f 0a 20 20 20 20 2f 2a 20 49  List */.    /* I
13ca0 46 20 6e 6f 74 20 61 20 73 65 72 76 65 72 2c 20  F not a server, 
13cb0 73 61 6d 65 20 61 73 20 53 53 4c 5f 67 65 74 30  same as SSL_get0
13cc0 5f 70 65 65 72 5f 43 41 5f 6c 69 73 74 2e 20 49  _peer_CA_list. I
13cd0 66 20 73 65 72 76 65 72 20 73 61 6d 65 20 61 73  f server same as
13ce0 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 63 6c 69   SSL_CTX_get_cli
13cf0 65 6e 74 5f 43 41 5f 6c 69 73 74 20 2a 2f 0a 20  ent_CA_list */. 
13d00 20 20 20 6c 69 73 74 50 74 72 20 3d 20 54 63 6c     listPtr = Tcl
13d10 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
13d20 55 4c 4c 29 3b 0a 20 20 20 20 53 54 41 43 4b 5f  ULL);.    STACK_
13d30 4f 46 28 58 35 30 39 5f 4e 41 4d 45 29 20 2a 63  OF(X509_NAME) *c
13d40 61 5f 6c 69 73 74 3b 0a 20 20 20 20 69 66 20 28  a_list;.    if (
13d50 28 63 61 5f 6c 69 73 74 20 3d 20 53 53 4c 5f 67  (ca_list = SSL_g
13d60 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69 73  et_client_CA_lis
13d70 74 28 73 73 6c 29 29 20 21 3d 20 4e 55 4c 4c 29  t(ssl)) != NULL)
13d80 20 7b 0a 09 63 68 61 72 20 62 75 66 66 65 72 5b   {..char buffer[
13d90 42 55 46 53 49 5a 5d 3b 0a 09 66 6f 72 20 28 69  BUFSIZ];..for (i
13da0 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b  nt i = 0; i < sk
13db0 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75 6d 28 63  _X509_NAME_num(c
13dc0 61 5f 6c 69 73 74 29 3b 20 69 2b 2b 29 20 7b 0a  a_list); i++) {.
13dd0 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20 2a  .    X509_NAME *
13de0 6e 61 6d 65 20 3d 20 73 6b 5f 58 35 30 39 5f 4e  name = sk_X509_N
13df0 41 4d 45 5f 76 61 6c 75 65 28 63 61 5f 6c 69 73  AME_value(ca_lis
13e00 74 2c 20 69 29 3b 0a 09 20 20 20 20 69 66 20 28  t, i);..    if (
13e10 6e 61 6d 65 29 20 7b 0a 09 09 58 35 30 39 5f 4e  name) {...X509_N
13e20 41 4d 45 5f 6f 6e 65 6c 69 6e 65 28 6e 61 6d 65  AME_oneline(name
13e30 2c 20 62 75 66 66 65 72 2c 20 42 55 46 53 49 5a  , buffer, BUFSIZ
13e40 29 3b 0a 09 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  );...Tcl_ListObj
13e50 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
13e60 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 54  terp, listPtr, T
13e70 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13e80 62 75 66 66 65 72 2c 20 2d 31 29 29 3b 0a 09 20  buffer, -1));.. 
13e90 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20     }..}.    }.  
13ea0 20 20 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e    LAPPEND_OBJ(in
13eb0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
13ec0 61 4c 69 73 74 22 2c 20 6c 69 73 74 50 74 72 29  aList", listPtr)
13ed0 3b 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 49 4e  ;.    LAPPEND_IN
13ee0 54 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  T(interp, objPtr
13ef0 2c 20 22 63 61 4c 69 73 74 43 6f 75 6e 74 22 2c  , "caListCount",
13f00 20 73 6b 5f 58 35 30 39 5f 4e 41 4d 45 5f 6e 75   sk_X509_NAME_nu
13f10 6d 28 63 61 5f 6c 69 73 74 29 29 3b 0a 0a 20 20  m(ca_list));..  
13f20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
13f30 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  lt(interp, objPt
13f40 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  r);.    return T
13f50 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a  CL_OK;.}.../*. *
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 2d 2d 2d  ----------------
13f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13fa0 2d 2d 2d 0a 20 2a 0a 20 2a 20 56 65 72 73 69 6f  ---. *. * Versio
13fb0 6e 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  nObjCmd -- retur
13fc0 6e 20 76 65 72 73 69 6f 6e 20 73 74 72 69 6e 67  n version string
13fd0 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a 20   from OpenSSL.. 
13fe0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
13ff0 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20  .A standard Tcl 
14000 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69  result.. *. * Si
14010 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e  de effects:. *.N
14020 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  one.. *. *------
14030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14050 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14060 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
14070 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65 72  /.static int.Ver
14080 73 69 6f 6e 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  sionObjCmd(Clien
14090 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
140a0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
140b0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
140c0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
140d0 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
140e0 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
140f0 20 20 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44    (void) clientD
14100 61 74 61 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  ata;.    (void) 
14110 6f 62 6a 63 3b 0a 20 20 20 20 28 76 6f 69 64 29  objc;.    (void)
14120 20 6f 62 6a 76 3b 0a 0a 20 20 20 20 64 70 72 69   objv;..    dpri
14130 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a  ntf("Called");..
14140 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
14150 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 4f 50  _NewStringObj(OP
14160 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 54 45  ENSSL_VERSION_TE
14170 58 54 2c 20 2d 31 29 3b 0a 20 20 20 20 54 63 6c  XT, -1);.    Tcl
14180 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
14190 74 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 0a  terp, objPtr);..
141a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
141b0 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
141c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
14200 20 2a 0a 20 2a 20 4d 69 73 63 4f 62 6a 43 6d 64   *. * MiscObjCmd
14210 20 2d 2d 20 6d 69 73 63 20 63 6f 6d 6d 61 6e 64   -- misc command
14220 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  s. *. * Results:
14230 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
14240 63 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  cl result.. *. *
14250 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
14260 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d  *.None.. *. *---
14270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
142b0 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a  . */.static int.
142c0 4d 69 73 63 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  MiscObjCmd(Clien
142d0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
142e0 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
142f0 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
14300 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
14310 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 73 74 61  bjv[]) {.    sta
14320 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
14330 63 6f 6d 6d 61 6e 64 73 20 5b 5d 20 3d 20 7b 20  commands [] = { 
14340 22 72 65 71 22 2c 20 22 73 74 72 72 65 71 22 2c  "req", "strreq",
14350 20 4e 55 4c 4c 20 7d 3b 0a 20 20 20 20 65 6e 75   NULL };.    enu
14360 6d 20 63 6f 6d 6d 61 6e 64 20 7b 20 43 5f 52 45  m command { C_RE
14370 51 2c 20 43 5f 53 54 52 52 45 51 2c 20 43 5f 44  Q, C_STRREQ, C_D
14380 55 4d 4d 59 20 7d 3b 0a 20 20 20 20 54 63 6c 5f  UMMY };.    Tcl_
14390 53 69 7a 65 20 63 6d 64 3b 0a 20 20 20 20 69 6e  Size cmd;.    in
143a0 74 20 69 73 53 74 72 3b 0a 20 20 20 20 63 68 61  t isStr;.    cha
143b0 72 20 62 75 66 66 65 72 5b 31 36 33 38 34 5d 3b  r buffer[16384];
143c0 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
143d0 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
143e0 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
143f0 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
14400 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
14410 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
14420 2c 20 6f 62 6a 76 2c 20 22 73 75 62 63 6f 6d 6d  , objv, "subcomm
14430 61 6e 64 20 3f 61 72 67 73 3f 22 29 3b 0a 09 72  and ?args?");..r
14440 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14450 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 54  .    }.    if (T
14460 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
14470 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14480 31 5d 2c 20 63 6f 6d 6d 61 6e 64 73 2c 20 22 63  1], commands, "c
14490 6f 6d 6d 61 6e 64 22 2c 20 30 2c 20 26 63 6d 64  ommand", 0, &cmd
144a0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
144b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
144c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52  ;.    }..    ERR
144d0 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a  _clear_error();.
144e0 0a 20 20 20 20 69 73 53 74 72 20 3d 20 28 63 6d  .    isStr = (cm
144f0 64 20 3d 3d 20 43 5f 53 54 52 52 45 51 29 3b 0a  d == C_STRREQ);.
14500 20 20 20 20 73 77 69 74 63 68 20 28 28 65 6e 75      switch ((enu
14510 6d 20 63 6f 6d 6d 61 6e 64 29 20 63 6d 64 29 20  m command) cmd) 
14520 7b 0a 09 63 61 73 65 20 43 5f 52 45 51 3a 0a 09  {..case C_REQ:..
14530 63 61 73 65 20 43 5f 53 54 52 52 45 51 3a 20 7b  case C_STRREQ: {
14540 0a 09 20 20 20 20 45 56 50 5f 50 4b 45 59 20 2a  ..    EVP_PKEY *
14550 70 6b 65 79 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20  pkey=NULL;..    
14560 58 35 30 39 20 2a 63 65 72 74 3d 4e 55 4c 4c 3b  X509 *cert=NULL;
14570 0a 09 20 20 20 20 58 35 30 39 5f 4e 41 4d 45 20  ..    X509_NAME 
14580 2a 6e 61 6d 65 3d 4e 55 4c 4c 3b 0a 09 20 20 20  *name=NULL;..   
14590 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6c 69 73 74 76   Tcl_Obj **listv
145a0 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20  ;..    Tcl_Size 
145b0 6c 69 73 74 63 3b 0a 09 20 20 20 20 69 6e 74 20  listc;..    int 
145c0 69 3b 0a 0a 09 20 20 20 20 42 49 4f 20 2a 6f 75  i;...    BIO *ou
145d0 74 3d 4e 55 4c 4c 3b 0a 0a 09 20 20 20 20 63 68  t=NULL;...    ch
145e0 61 72 20 2a 6b 5f 43 3d 22 22 2c 2a 6b 5f 53 54  ar *k_C="",*k_ST
145f0 3d 22 22 2c 2a 6b 5f 4c 3d 22 22 2c 2a 6b 5f 4f  ="",*k_L="",*k_O
14600 3d 22 22 2c 2a 6b 5f 4f 55 3d 22 22 2c 2a 6b 5f  ="",*k_OU="",*k_
14610 43 4e 3d 22 22 2c 2a 6b 5f 45 6d 61 69 6c 3d 22  CN="",*k_Email="
14620 22 3b 0a 09 20 20 20 20 63 68 61 72 20 2a 6b 65  ";..    char *ke
14630 79 6f 75 74 2c 2a 70 65 6d 6f 75 74 2c 2a 73 74  yout,*pemout,*st
14640 72 3b 0a 09 20 20 20 20 69 6e 74 20 6b 65 79 73  r;..    int keys
14650 69 7a 65 2c 73 65 72 69 61 6c 3d 30 2c 64 61 79  ize,serial=0,day
14660 73 3d 33 36 35 3b 0a 0a 23 69 66 20 4f 50 45 4e  s=365;..#if OPEN
14670 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
14680 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
14690 0a 09 20 20 20 20 42 49 47 4e 55 4d 20 2a 62 6e  ..    BIGNUM *bn
146a0 65 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 52  e = NULL;..    R
146b0 53 41 20 2a 72 73 61 20 3d 20 4e 55 4c 4c 3b 0a  SA *rsa = NULL;.
146c0 23 65 6c 73 65 0a 09 20 20 20 20 45 56 50 5f 50  #else..    EVP_P
146d0 4b 45 59 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e  KEY_CTX *ctx = N
146e0 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a 0a 09 20 20  ULL;.#endif...  
146f0 20 20 69 66 20 28 28 6f 62 6a 63 3c 35 29 20 7c    if ((objc<5) |
14700 7c 20 28 6f 62 6a 63 3e 36 29 29 20 7b 0a 09 09  | (objc>6)) {...
14710 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
14720 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
14730 2c 20 22 6b 65 79 73 69 7a 65 20 6b 65 79 66 69  , "keysize keyfi
14740 6c 65 20 63 65 72 74 66 69 6c 65 20 3f 69 6e 66  le certfile ?inf
14750 6f 3f 22 29 3b 0a 09 09 72 65 74 75 72 6e 20 54  o?");...return T
14760 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d  CL_ERROR;..    }
14770 0a 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f 47  ...    if (Tcl_G
14780 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
14790 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6b  erp, objv[2], &k
147a0 65 79 73 69 7a 65 29 20 21 3d 20 54 43 4c 5f 4f  eysize) != TCL_O
147b0 4b 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43  K) {...return TC
147c0 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a  L_ERROR;..    }.
147d0 09 20 20 20 20 6b 65 79 6f 75 74 3d 54 63 6c 5f  .    keyout=Tcl_
147e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
147f0 5d 29 3b 0a 09 20 20 20 20 70 65 6d 6f 75 74 3d  ]);..    pemout=
14800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
14810 6a 76 5b 34 5d 29 3b 0a 09 20 20 20 20 69 66 20  jv[4]);..    if 
14820 28 69 73 53 74 72 29 20 7b 0a 09 09 54 63 6c 5f  (isStr) {...Tcl_
14830 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 6b 65  SetVar(interp,ke
14840 79 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 09 54 63  yout,"",0);...Tc
14850 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
14860 70 65 6d 6f 75 74 2c 22 22 2c 30 29 3b 0a 09 20  pemout,"",0);.. 
14870 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 28 6f     }...    if (o
14880 62 6a 63 3e 3d 36 29 20 7b 0a 09 09 69 66 20 28  bjc>=6) {...if (
14890 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c  Tcl_ListObjGetEl
148a0 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f  ements(interp, o
148b0 62 6a 76 5b 35 5d 2c 20 26 6c 69 73 74 63 2c 20  bjv[5], &listc, 
148c0 26 6c 69 73 74 76 29 20 21 3d 20 54 43 4c 5f 4f  &listv) != TCL_O
148d0 4b 29 20 7b 0a 09 09 20 20 20 20 72 65 74 75 72  K) {...    retur
148e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d  n TCL_ERROR;...}
148f0 0a 0a 09 09 69 66 20 28 28 6c 69 73 74 63 25 32  ....if ((listc%2
14900 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 20  ) != 0) {...    
14910 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
14920 74 65 72 70 2c 22 49 6e 66 6f 72 6d 61 74 69 6f  terp,"Informatio
14930 6e 20 6c 69 73 74 20 6d 75 73 74 20 68 61 76 65  n list must have
14940 20 65 76 65 6e 20 6e 75 6d 62 65 72 20 6f 66 20   even number of 
14950 61 72 67 75 6d 65 6e 74 73 22 2c 4e 55 4c 4c 29  arguments",NULL)
14960 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
14970 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09 09  CL_ERROR;...}...
14980 66 6f 72 20 28 69 3d 30 3b 20 69 3c 6c 69 73 74  for (i=0; i<list
14990 63 3b 20 69 2b 3d 32 29 20 7b 0a 09 09 20 20 20  c; i+=2) {...   
149a0 20 73 74 72 3d 54 63 6c 5f 47 65 74 53 74 72 69   str=Tcl_GetStri
149b0 6e 67 28 6c 69 73 74 76 5b 69 5d 29 3b 0a 09 09  ng(listv[i]);...
149c0 20 20 20 20 69 66 20 28 73 74 72 63 6d 70 28 73      if (strcmp(s
149d0 74 72 2c 22 64 61 79 73 22 29 3d 3d 30 29 20 7b  tr,"days")==0) {
149e0 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
149f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14a00 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 64 61 79  ,listv[i+1],&day
14a10 73 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09 09 20  s)!=TCL_OK).... 
14a20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
14a30 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73  ROR;...    } els
14a40 65 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72  e if (strcmp(str
14a50 2c 22 73 65 72 69 61 6c 22 29 3d 3d 30 29 20 7b  ,"serial")==0) {
14a60 0a 09 09 09 69 66 20 28 54 63 6c 5f 47 65 74 49  ....if (Tcl_GetI
14a70 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
14a80 2c 6c 69 73 74 76 5b 69 2b 31 5d 2c 26 73 65 72  ,listv[i+1],&ser
14a90 69 61 6c 29 21 3d 54 43 4c 5f 4f 4b 29 0a 09 09  ial)!=TCL_OK)...
14aa0 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14ab0 45 52 52 4f 52 3b 0a 09 09 20 20 20 20 7d 20 65  ERROR;...    } e
14ac0 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
14ad0 74 72 2c 22 43 22 29 3d 3d 30 29 20 7b 0a 09 09  tr,"C")==0) {...
14ae0 09 6b 5f 43 3d 54 63 6c 5f 47 65 74 53 74 72 69  .k_C=Tcl_GetStri
14af0 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a  ng(listv[i+1]);.
14b00 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ..    } else if 
14b10 28 73 74 72 63 6d 70 28 73 74 72 2c 22 53 54 22  (strcmp(str,"ST"
14b20 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 53 54 3d  )==0) {....k_ST=
14b30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14b40 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14b50 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14b60 6d 70 28 73 74 72 2c 22 4c 22 29 3d 3d 30 29 20  mp(str,"L")==0) 
14b70 7b 0a 09 09 09 6b 5f 4c 3d 54 63 6c 5f 47 65 74  {....k_L=Tcl_Get
14b80 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14b90 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14ba0 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14bb0 22 4f 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f  "O")==0) {....k_
14bc0 4f 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  O=Tcl_GetString(
14bd0 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20  listv[i+1]);... 
14be0 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74     } else if (st
14bf0 72 63 6d 70 28 73 74 72 2c 22 4f 55 22 29 3d 3d  rcmp(str,"OU")==
14c00 30 29 20 7b 0a 09 09 09 6b 5f 4f 55 3d 54 63 6c  0) {....k_OU=Tcl
14c10 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76  _GetString(listv
14c20 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20  [i+1]);...    } 
14c30 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28  else if (strcmp(
14c40 73 74 72 2c 22 43 4e 22 29 3d 3d 30 29 20 7b 0a  str,"CN")==0) {.
14c50 09 09 09 6b 5f 43 4e 3d 54 63 6c 5f 47 65 74 53  ...k_CN=Tcl_GetS
14c60 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d  tring(listv[i+1]
14c70 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20  );...    } else 
14c80 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22  if (strcmp(str,"
14c90 45 6d 61 69 6c 22 29 3d 3d 30 29 20 7b 0a 09 09  Email")==0) {...
14ca0 09 6b 5f 45 6d 61 69 6c 3d 54 63 6c 5f 47 65 74  .k_Email=Tcl_Get
14cb0 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14cc0 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14cd0 20 7b 0a 09 09 09 54 63 6c 5f 53 65 74 52 65 73   {....Tcl_SetRes
14ce0 75 6c 74 28 69 6e 74 65 72 70 2c 22 55 6e 6b 6e  ult(interp,"Unkn
14cf0 6f 77 6e 20 70 61 72 61 6d 65 74 65 72 22 2c 4e  own parameter",N
14d00 55 4c 4c 29 3b 0a 09 09 09 72 65 74 75 72 6e 20  ULL);....return 
14d10 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20 20  TCL_ERROR;...   
14d20 20 7d 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 0a 23   }...}..    }..#
14d30 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
14d40 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
14d50 30 30 30 30 30 30 4c 0a 09 20 20 20 20 62 6e 65  000000L..    bne
14d60 20 3d 20 42 4e 5f 6e 65 77 28 29 3b 0a 09 20 20   = BN_new();..  
14d70 20 20 72 73 61 20 3d 20 52 53 41 5f 6e 65 77 28    rsa = RSA_new(
14d80 29 3b 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  );..    pkey = E
14d90 56 50 5f 50 4b 45 59 5f 6e 65 77 28 29 3b 0a 09  VP_PKEY_new();..
14da0 20 20 20 20 69 66 20 28 62 6e 65 20 3d 3d 20 4e      if (bne == N
14db0 55 4c 4c 20 7c 7c 20 72 73 61 20 3d 3d 20 4e 55  ULL || rsa == NU
14dc0 4c 4c 20 7c 7c 20 70 6b 65 79 20 3d 3d 20 4e 55  LL || pkey == NU
14dd0 4c 4c 20 7c 7c 20 21 42 4e 5f 73 65 74 5f 77 6f  LL || !BN_set_wo
14de0 72 64 28 62 6e 65 2c 52 53 41 5f 46 34 29 20 7c  rd(bne,RSA_F4) |
14df0 7c 0a 09 09 21 52 53 41 5f 67 65 6e 65 72 61 74  |...!RSA_generat
14e00 65 5f 6b 65 79 5f 65 78 28 72 73 61 2c 20 6b 65  e_key_ex(rsa, ke
14e10 79 73 69 7a 65 2c 20 62 6e 65 2c 20 4e 55 4c 4c  ysize, bne, NULL
14e20 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 61  ) || !EVP_PKEY_a
14e30 73 73 69 67 6e 5f 52 53 41 28 70 6b 65 79 2c 20  ssign_RSA(pkey, 
14e40 72 73 61 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b  rsa)) {...EVP_PK
14e50 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09  EY_free(pkey);..
14e60 09 2f 2a 20 52 53 41 5f 66 72 65 65 28 72 73 61  ./* RSA_free(rsa
14e70 29 3b 20 66 72 65 65 64 20 62 79 20 45 56 50 5f  ); freed by EVP_
14e80 50 4b 45 59 5f 66 72 65 65 20 2a 2f 0a 09 09 42  PKEY_free */...B
14e90 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6c  N_free(bne);.#el
14ea0 73 65 0a 09 20 20 20 20 70 6b 65 79 20 3d 20 45  se..    pkey = E
14eb0 56 50 5f 52 53 41 5f 67 65 6e 28 28 75 6e 73 69  VP_RSA_gen((unsi
14ec0 67 6e 65 64 20 69 6e 74 29 20 6b 65 79 73 69 7a  gned int) keysiz
14ed0 65 29 3b 0a 09 20 20 20 20 63 74 78 20 3d 20 45  e);..    ctx = E
14ee0 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65 77 28  VP_PKEY_CTX_new(
14ef0 70 6b 65 79 2c 4e 55 4c 4c 29 3b 0a 09 20 20 20  pkey,NULL);..   
14f00 20 69 66 20 28 70 6b 65 79 20 3d 3d 20 4e 55 4c   if (pkey == NUL
14f10 4c 20 7c 7c 20 63 74 78 20 3d 3d 20 4e 55 4c 4c  L || ctx == NULL
14f20 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59 5f 6b 65   || !EVP_PKEY_ke
14f30 79 67 65 6e 5f 69 6e 69 74 28 63 74 78 29 20 7c  ygen_init(ctx) |
14f40 7c 0a 09 09 21 45 56 50 5f 50 4b 45 59 5f 43 54  |...!EVP_PKEY_CT
14f50 58 5f 73 65 74 5f 72 73 61 5f 6b 65 79 67 65 6e  X_set_rsa_keygen
14f60 5f 62 69 74 73 28 63 74 78 2c 20 6b 65 79 73 69  _bits(ctx, keysi
14f70 7a 65 29 20 7c 7c 20 21 45 56 50 5f 50 4b 45 59  ze) || !EVP_PKEY
14f80 5f 6b 65 79 67 65 6e 28 63 74 78 2c 20 26 70 6b  _keygen(ctx, &pk
14f90 65 79 29 29 20 7b 0a 09 09 45 56 50 5f 50 4b 45  ey)) {...EVP_PKE
14fa0 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a 09 09  Y_free(pkey);...
14fb0 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 66 72 65  EVP_PKEY_CTX_fre
14fc0 65 28 63 74 78 29 3b 0a 23 65 6e 64 69 66 0a 09  e(ctx);.#endif..
14fd0 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69  .Tcl_SetResult(i
14fe0 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 67 65 6e  nterp,"Error gen
14ff0 65 72 61 74 69 6e 67 20 70 72 69 76 61 74 65 20  erating private 
15000 6b 65 79 22 2c 4e 55 4c 4c 29 3b 0a 09 09 72 65  key",NULL);...re
15010 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15020 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
15030 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09 20  if (isStr) {... 
15040 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28 42     out=BIO_new(B
15050 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09 20  IO_s_mem());... 
15060 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f     PEM_write_bio
15070 5f 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  _PrivateKey(out,
15080 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c 4c 2c 30  pkey,NULL,NULL,0
15090 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a 09 09 20  ,NULL,NULL);... 
150a0 20 20 20 69 3d 42 49 4f 5f 72 65 61 64 28 6f 75     i=BIO_read(ou
150b0 74 2c 62 75 66 66 65 72 2c 73 69 7a 65 6f 66 28  t,buffer,sizeof(
150c0 62 75 66 66 65 72 29 2d 31 29 3b 0a 09 09 20 20  buffer)-1);...  
150d0 20 20 69 3d 28 69 3c 30 29 20 3f 20 30 20 3a 20    i=(i<0) ? 0 : 
150e0 69 3b 0a 09 09 20 20 20 20 62 75 66 66 65 72 5b  i;...    buffer[
150f0 69 5d 3d 27 5c 30 27 3b 0a 09 09 20 20 20 20 54  i]='\0';...    T
15100 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
15110 2c 6b 65 79 6f 75 74 2c 62 75 66 66 65 72 2c 30  ,keyout,buffer,0
15120 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66 6c 75  );...    BIO_flu
15130 73 68 28 6f 75 74 29 3b 0a 09 09 20 20 20 20 42  sh(out);...    B
15140 49 4f 5f 66 72 65 65 28 6f 75 74 29 3b 0a 09 09  IO_free(out);...
15150 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 6f  } else {...    o
15160 75 74 3d 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73  ut=BIO_new(BIO_s
15170 5f 66 69 6c 65 28 29 29 3b 0a 09 09 20 20 20 20  _file());...    
15180 42 49 4f 5f 77 72 69 74 65 5f 66 69 6c 65 6e 61  BIO_write_filena
15190 6d 65 28 6f 75 74 2c 6b 65 79 6f 75 74 29 3b 0a  me(out,keyout);.
151a0 09 09 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f  ..    PEM_write_
151b0 62 69 6f 5f 50 72 69 76 61 74 65 4b 65 79 28 6f  bio_PrivateKey(o
151c0 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c 2c 4e 55 4c  ut,pkey,NULL,NUL
151d0 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c 4c 29 3b 0a  L,0,NULL,NULL);.
151e0 09 09 20 20 20 20 2f 2a 20 50 45 4d 5f 77 72 69  ..    /* PEM_wri
151f0 74 65 5f 62 69 6f 5f 52 53 41 50 72 69 76 61 74  te_bio_RSAPrivat
15200 65 4b 65 79 28 6f 75 74 2c 20 72 73 61 2c 20 4e  eKey(out, rsa, N
15210 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 30 2c 20 4e 55  ULL, NULL, 0, NU
15220 4c 4c 2c 20 4e 55 4c 4c 29 3b 20 2a 2f 0a 09 09  LL, NULL); */...
15230 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61 6c 6c      BIO_free_all
15240 28 6f 75 74 29 3b 0a 09 20 09 7d 0a 0a 09 09 69  (out);.. .}....i
15250 66 20 28 28 63 65 72 74 3d 58 35 30 39 5f 6e 65  f ((cert=X509_ne
15260 77 28 29 29 3d 3d 4e 55 4c 4c 29 20 7b 0a 09 09  w())==NULL) {...
15270 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
15280 74 28 69 6e 74 65 72 70 2c 22 45 72 72 6f 72 20  t(interp,"Error 
15290 67 65 6e 65 72 61 74 69 6e 67 20 63 65 72 74 69  generating certi
152a0 66 69 63 61 74 65 20 72 65 71 75 65 73 74 22 2c  ficate request",
152b0 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 45 56 50  NULL);...    EVP
152c0 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29  _PKEY_free(pkey)
152d0 3b 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45  ;.#if OPENSSL_VE
152e0 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30  RSION_NUMBER < 0
152f0 78 33 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20  x30000000L...   
15300 20 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23   BN_free(bne);.#
15310 65 6e 64 69 66 0a 09 09 20 20 20 20 72 65 74 75  endif...    retu
15320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
15330 7d 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 76 65  }....X509_set_ve
15340 72 73 69 6f 6e 28 63 65 72 74 2c 32 29 3b 0a 09  rsion(cert,2);..
15350 09 41 53 4e 31 5f 49 4e 54 45 47 45 52 5f 73 65  .ASN1_INTEGER_se
15360 74 28 58 35 30 39 5f 67 65 74 5f 73 65 72 69 61  t(X509_get_seria
15370 6c 4e 75 6d 62 65 72 28 63 65 72 74 29 2c 73 65  lNumber(cert),se
15380 72 69 61 6c 29 3b 0a 09 09 58 35 30 39 5f 67 6d  rial);...X509_gm
15390 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
153a0 74 6d 5f 6e 6f 74 42 65 66 6f 72 65 28 63 65 72  tm_notBefore(cer
153b0 74 29 2c 30 29 3b 0a 09 09 58 35 30 39 5f 67 6d  t),0);...X509_gm
153c0 74 69 6d 65 5f 61 64 6a 28 58 35 30 39 5f 67 65  time_adj(X509_ge
153d0 74 6d 5f 6e 6f 74 41 66 74 65 72 28 63 65 72 74  tm_notAfter(cert
153e0 29 2c 28 6c 6f 6e 67 29 36 30 2a 36 30 2a 32 34  ),(long)60*60*24
153f0 2a 64 61 79 73 29 3b 0a 09 09 58 35 30 39 5f 73  *days);...X509_s
15400 65 74 5f 70 75 62 6b 65 79 28 63 65 72 74 2c 70  et_pubkey(cert,p
15410 6b 65 79 29 3b 0a 0a 09 09 6e 61 6d 65 3d 58 35  key);....name=X5
15420 30 39 5f 67 65 74 5f 73 75 62 6a 65 63 74 5f 6e  09_get_subject_n
15430 61 6d 65 28 63 65 72 74 29 3b 0a 0a 09 09 58 35  ame(cert);....X5
15440 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72  09_NAME_add_entr
15450 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 43  y_by_txt(name,"C
15460 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c  ", MBSTRING_ASC,
15470 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
15480 20 63 68 61 72 20 2a 29 20 6b 5f 43 2c 20 2d 31   char *) k_C, -1
15490 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
154a0 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
154b0 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 53 54 22  by_txt(name,"ST"
154c0 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20  , MBSTRING_ASC, 
154d0 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
154e0 63 68 61 72 20 2a 29 20 6b 5f 53 54 2c 20 2d 31  char *) k_ST, -1
154f0 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39  , -1, 0);...X509
15500 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f  _NAME_add_entry_
15510 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22 4c 22 2c  by_txt(name,"L",
15520 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
15530 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
15540 68 61 72 20 2a 29 20 6b 5f 4c 2c 20 2d 31 2c 20  har *) k_L, -1, 
15550 2d 31 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e  -1, 0);...X509_N
15560 41 4d 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79  AME_add_entry_by
15570 5f 74 78 74 28 6e 61 6d 65 2c 22 4f 22 2c 20 4d  _txt(name,"O", M
15580 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f  BSTRING_ASC, (co
15590 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
155a0 72 20 2a 29 20 6b 5f 4f 2c 20 2d 31 2c 20 2d 31  r *) k_O, -1, -1
155b0 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
155c0 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
155d0 78 74 28 6e 61 6d 65 2c 22 4f 55 22 2c 20 4d 42  xt(name,"OU", MB
155e0 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
155f0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15600 20 2a 29 20 6b 5f 4f 55 2c 20 2d 31 2c 20 2d 31   *) k_OU, -1, -1
15610 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
15620 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
15630 78 74 28 6e 61 6d 65 2c 22 43 4e 22 2c 20 4d 42  xt(name,"CN", MB
15640 53 54 52 49 4e 47 5f 41 53 43 2c 20 28 63 6f 6e  STRING_ASC, (con
15650 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
15660 20 2a 29 20 6b 5f 43 4e 2c 20 2d 31 2c 20 2d 31   *) k_CN, -1, -1
15670 2c 20 30 29 3b 0a 09 09 58 35 30 39 5f 4e 41 4d  , 0);...X509_NAM
15680 45 5f 61 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74  E_add_entry_by_t
15690 78 74 28 6e 61 6d 65 2c 22 45 6d 61 69 6c 22 2c  xt(name,"Email",
156a0 20 4d 42 53 54 52 49 4e 47 5f 41 53 43 2c 20 28   MBSTRING_ASC, (
156b0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
156c0 68 61 72 20 2a 29 20 6b 5f 45 6d 61 69 6c 2c 20  har *) k_Email, 
156d0 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 0a 09 09 58  -1, -1, 0);....X
156e0 35 30 39 5f 73 65 74 5f 73 75 62 6a 65 63 74 5f  509_set_subject_
156f0 6e 61 6d 65 28 63 65 72 74 2c 6e 61 6d 65 29 3b  name(cert,name);
15700 0a 0a 09 09 69 66 20 28 21 58 35 30 39 5f 73 69  ....if (!X509_si
15710 67 6e 28 63 65 72 74 2c 70 6b 65 79 2c 45 56 50  gn(cert,pkey,EVP
15720 5f 73 68 61 32 35 36 28 29 29 29 20 7b 0a 09 09  _sha256())) {...
15730 20 20 20 20 58 35 30 39 5f 66 72 65 65 28 63 65      X509_free(ce
15740 72 74 29 3b 0a 09 09 20 20 20 20 45 56 50 5f 50  rt);...    EVP_P
15750 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b 0a  KEY_free(pkey);.
15760 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
15770 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
15780 30 30 30 30 30 30 30 4c 0a 09 09 20 20 20 20 42  0000000L...    B
15790 4e 5f 66 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e  N_free(bne);.#en
157a0 64 69 66 0a 09 09 20 20 20 20 54 63 6c 5f 53 65  dif...    Tcl_Se
157b0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22  tResult(interp,"
157c0 45 72 72 6f 72 20 73 69 67 6e 69 6e 67 20 63 65  Error signing ce
157d0 72 74 69 66 69 63 61 74 65 22 2c 4e 55 4c 4c 29  rtificate",NULL)
157e0 3b 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20 54  ;...    return T
157f0 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 0a 09  CL_ERROR;...}...
15800 09 69 66 20 28 69 73 53 74 72 29 20 7b 0a 09 09  .if (isStr) {...
15810 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
15820 42 49 4f 5f 73 5f 6d 65 6d 28 29 29 3b 0a 09 09  BIO_s_mem());...
15830 20 20 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69      PEM_write_bi
15840 6f 5f 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29  o_X509(out,cert)
15850 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f 72 65  ;...    i=BIO_re
15860 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c 73 69  ad(out,buffer,si
15870 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31 29 3b  zeof(buffer)-1);
15880 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29 20 3f  ...    i=(i<0) ?
15890 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20 62 75   0 : i;...    bu
158a0 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a 09 09  ffer[i]='\0';...
158b0 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
158c0 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 62 75 66  nterp,pemout,buf
158d0 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20 42 49  fer,0);...    BI
158e0 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a 09 09  O_flush(out);...
158f0 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f 75 74      BIO_free(out
15900 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  );...} else {...
15910 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65 77 28      out=BIO_new(
15920 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b 0a 09  BIO_s_file());..
15930 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65 5f 66  .    BIO_write_f
15940 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 70 65 6d 6f  ilename(out,pemo
15950 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ut);...    PEM_w
15960 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
15970 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 42  t,cert);...    B
15980 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 6f 75 74 29  IO_free_all(out)
15990 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39 5f 66 72  ;...}....X509_fr
159a0 65 65 28 63 65 72 74 29 3b 0a 09 09 45 56 50 5f  ee(cert);...EVP_
159b0 50 4b 45 59 5f 66 72 65 65 28 70 6b 65 79 29 3b  PKEY_free(pkey);
159c0 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52  .#if OPENSSL_VER
159d0 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78  SION_NUMBER < 0x
159e0 33 30 30 30 30 30 30 30 4c 0a 09 09 42 4e 5f 66  30000000L...BN_f
159f0 72 65 65 28 62 6e 65 29 3b 0a 23 65 6e 64 69 66  ree(bne);.#endif
15a00 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 62 72 65 61  ..    }..}..brea
15a10 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
15a20 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20  .break;.    }.  
15a30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
15a40 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}.../**********
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20 49  **********/./* I
15a60 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
15a70 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */./************
15a80 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a  ********/../*. *
15a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ad0 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 46 72  ---. *. * Tls_Fr
15ae0 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  ee --. *. *.This
15af0 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e   procedure clean
15b00 73 20 75 70 20 77 68 65 6e 20 61 20 53 53 4c 20  s up when a SSL 
15b10 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63 68 61  socket based cha
15b20 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f 73 65  nnel. *.is close
15b30 64 20 61 6e 64 20 69 74 73 20 72 65 66 65 72 65  d and its refere
15b40 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c 73 20  nce count falls 
15b50 62 65 6c 6f 77 20 31 0a 20 2a 0a 20 2a 20 52 65  below 1. *. * Re
15b60 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20  sults:. *.none. 
15b70 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
15b80 73 3a 0a 20 2a 09 46 72 65 65 73 20 61 6c 6c 20  s:. *.Frees all 
15b90 74 68 65 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d  the state. *. *-
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f  --. */.void.Tls_
15bf0 46 72 65 65 28 74 6c 73 5f 66 72 65 65 5f 74 79  Free(tls_free_ty
15c00 70 65 20 2a 62 6c 6f 63 6b 50 74 72 29 20 7b 0a  pe *blockPtr) {.
15c10 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
15c20 50 74 72 20 3d 20 28 53 74 61 74 65 20 2a 29 62  Ptr = (State *)b
15c30 6c 6f 63 6b 50 74 72 3b 0a 0a 20 20 20 20 64 70  lockPtr;..    dp
15c40 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
15c50 0a 0a 20 20 20 20 54 6c 73 5f 43 6c 65 61 6e 28  ..    Tls_Clean(
15c60 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 63  statePtr);.    c
15c70 6b 66 72 65 65 28 62 6c 6f 63 6b 50 74 72 29 3b  kfree(blockPtr);
15c80 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
15c90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ca0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
15cd0 0a 20 2a 20 54 6c 73 5f 43 6c 65 61 6e 20 2d 2d  . * Tls_Clean --
15ce0 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70 72 6f 63  . *. *.This proc
15cf0 65 64 75 72 65 20 63 6c 65 61 6e 73 20 75 70 20  edure cleans up 
15d00 77 68 65 6e 20 61 20 53 53 4c 20 73 6f 63 6b 65  when a SSL socke
15d10 74 20 62 61 73 65 64 20 63 68 61 6e 6e 65 6c 0a  t based channel.
15d20 20 2a 09 69 73 20 63 6c 6f 73 65 64 20 61 6e 64   *.is closed and
15d30 20 69 74 73 20 72 65 66 65 72 65 6e 63 65 20 63   its reference c
15d40 6f 75 6e 74 20 66 61 6c 6c 73 20 62 65 6c 6f 77  ount falls below
15d50 20 31 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64   1.  This should
15d60 0a 20 2a 09 62 65 20 63 61 6c 6c 65 64 20 73 79  . *.be called sy
15d70 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 62 79 20 74  nchronously by t
15d80 68 65 20 43 6c 6f 73 65 50 72 6f 63 2c 20 6e 6f  he CloseProc, no
15d90 74 20 69 6e 20 74 68 65 0a 20 2a 09 45 76 65 6e  t in the. *.Even
15da0 74 75 61 6c 6c 79 46 72 65 65 20 63 61 6c 6c 62  tuallyFree callb
15db0 61 63 6b 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ack.. *. * Resul
15dc0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20  ts:. *.none. *. 
15dd0 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a  * Side effects:.
15de0 20 2a 09 46 72 65 65 73 20 61 6c 6c 20 74 68 65   *.Frees all the
15df0 20 73 74 61 74 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d   state. *. *----
15e00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
15e40 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 43 6c 65   */.void Tls_Cle
15e50 61 6e 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  an(State *stateP
15e60 74 72 29 20 7b 0a 20 20 20 20 64 70 72 69 6e 74  tr) {.    dprint
15e70 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
15e80 20 20 2f 2a 0a 20 20 20 20 20 2a 20 77 65 27 72    /*.     * we'r
15e90 65 20 61 73 73 75 6d 69 6e 67 20 68 65 72 65 20  e assuming here 
15ea0 74 68 61 74 20 77 65 27 72 65 20 73 69 6e 67 6c  that we're singl
15eb0 65 2d 74 68 72 65 61 64 65 64 0a 20 20 20 20 20  e-threaded.     
15ec0 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65  */.    if (state
15ed0 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54  Ptr->timer != (T
15ee0 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e  cl_TimerToken) N
15ef0 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65  ULL) {..Tcl_Dele
15f00 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73  teTimerHandler(s
15f10 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b  tatePtr->timer);
15f20 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65  ..statePtr->time
15f30 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  r = NULL;.    }.
15f40 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63  .    /* Remove c
15f50 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
15f60 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61  if (statePtr->ca
15f70 6c 6c 62 61 63 6b 29 20 7b 0a 09 54 63 6c 5f 44  llback) {..Tcl_D
15f80 65 63 72 52 65 66 43 6f 75 6e 74 28 73 74 61 74  ecrRefCount(stat
15f90 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b  ePtr->callback);
15fa0 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  ..statePtr->call
15fb0 62 61 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  back = NULL;.   
15fc0 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 74 65   }.    if (state
15fd0 50 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 20 7b  Ptr->password) {
15fe0 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ..Tcl_DecrRefCou
15ff0 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
16000 73 77 6f 72 64 29 3b 0a 09 73 74 61 74 65 50 74  sword);..statePt
16010 72 2d 3e 70 61 73 73 77 6f 72 64 20 3d 20 4e 55  r->password = NU
16020 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  LL;.    }.    if
16030 20 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64   (statePtr->vcmd
16040 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  ) {..Tcl_DecrRef
16050 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72 2d 3e  Count(statePtr->
16060 76 63 6d 64 29 3b 0a 09 73 74 61 74 65 50 74 72  vcmd);..statePtr
16070 2d 3e 76 63 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20  ->vcmd = NULL;. 
16080 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
16090 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 29 20  atePtr->protos) 
160a0 7b 0a 09 63 6b 66 72 65 65 28 73 74 61 74 65 50  {..ckfree(stateP
160b0 74 72 2d 3e 70 72 6f 74 6f 73 29 3b 0a 09 73 74  tr->protos);..st
160c0 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 3d  atePtr->protos =
160d0 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20   NULL;.    }..  
160e0 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
160f0 62 69 6f 29 20 7b 0a 09 2f 2a 20 54 68 69 73 20  bio) {../* This 
16100 77 69 6c 6c 20 63 61 6c 6c 20 53 53 4c 5f 73 68  will call SSL_sh
16110 75 74 64 6f 77 6e 2e 20 42 75 67 20 31 34 31 34  utdown. Bug 1414
16120 30 34 35 20 2a 2f 0a 09 64 70 72 69 6e 74 66 28  045 */..dprintf(
16130 22 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 25 70  "BIO_free_all(%p
16140 29 22 2c 20 73 74 61 74 65 50 74 72 2d 3e 62 69  )", statePtr->bi
16150 6f 29 3b 0a 09 42 49 4f 5f 66 72 65 65 5f 61 6c  o);..BIO_free_al
16160 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29  l(statePtr->bio)
16170 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 62 69 6f  ;..statePtr->bio
16180 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a   = NULL;.    }..
16190 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72      if (statePtr
161a0 2d 3e 73 73 6c 29 20 7b 0a 09 64 70 72 69 6e 74  ->ssl) {..dprint
161b0 66 28 22 53 53 4c 5f 66 72 65 65 28 25 70 29 22  f("SSL_free(%p)"
161c0 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  , statePtr->ssl)
161d0 3b 0a 09 53 53 4c 5f 66 72 65 65 28 73 74 61 74  ;..SSL_free(stat
161e0 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 73 74 61  ePtr->ssl);..sta
161f0 74 65 50 74 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c  tePtr->ssl = NUL
16200 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
16210 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29   (statePtr->ctx)
16220 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 66 72 65 65   {..SSL_CTX_free
16230 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b  (statePtr->ctx);
16240 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20  ..statePtr->ctx 
16250 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20  = NULL;.    }.. 
16260 20 20 20 64 70 72 69 6e 74 66 28 22 52 65 74 75     dprintf("Retu
16270 72 6e 69 6e 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a  rning");.}.../*.
16280 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
162c0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42  --------. *. * B
162d0 75 69 6c 64 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e  uild Info Comman
162e0 64 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74  d --. *. *.Creat
162f0 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 74  e command to ret
16300 75 72 6e 20 62 75 69 6c 64 20 69 6e 66 6f 20 66  urn build info f
16310 6f 72 20 70 61 63 6b 61 67 65 2e 0a 20 2a 0a 20  or package.. *. 
16320 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
16330 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
16340 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ult. *. * Side e
16350 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74  ffects:. *.Creat
16360 65 64 20 62 75 69 6c 64 2d 69 6e 66 6f 20 63 6f  ed build-info co
16370 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  mmand.. *. *----
16380 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16390 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
163c0 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  --. */..#ifndef 
163d0 53 54 52 49 4e 47 49 46 59 0a 23 20 20 64 65 66  STRINGIFY.#  def
163e0 69 6e 65 20 53 54 52 49 4e 47 49 46 59 28 78 29  ine STRINGIFY(x)
163f0 20 53 54 52 49 4e 47 49 46 59 31 28 78 29 0a 23   STRINGIFY1(x).#
16400 20 20 64 65 66 69 6e 65 20 53 54 52 49 4e 47 49    define STRINGI
16410 46 59 31 28 78 29 20 23 78 0a 23 65 6e 64 69 66  FY1(x) #x.#endif
16420 0a 0a 69 6e 74 0a 42 75 69 6c 64 49 6e 66 6f 43  ..int.BuildInfoC
16430 6f 6d 6d 61 6e 64 28 54 63 6c 5f 49 6e 74 65 72  ommand(Tcl_Inter
16440 70 2a 20 69 6e 74 65 72 70 29 20 7b 0a 20 20 20  p* interp) {.   
16450 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 69 6e 66   Tcl_CmdInfo inf
16460 6f 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f  o;..    if (Tcl_
16470 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
16480 6e 74 65 72 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62  nterp, "::tcl::b
16490 75 69 6c 64 2d 69 6e 66 6f 22 2c 20 26 69 6e 66  uild-info", &inf
164a0 6f 29 29 20 7b 0a 09 54 63 6c 5f 43 72 65 61 74  o)) {..Tcl_Creat
164b0 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
164c0 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c  rp, "::tls::buil
164d0 64 2d 69 6e 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62  d-info", info.ob
164e0 6a 50 72 6f 63 2c 20 28 76 6f 69 64 20 2a 29 28  jProc, (void *)(
164f0 0a 09 09 50 41 43 4b 41 47 45 5f 56 45 52 53 49  ...PACKAGE_VERSI
16500 4f 4e 20 22 2b 22 20 53 54 52 49 4e 47 49 46 59  ON "+" STRINGIFY
16510 28 54 4c 53 5f 56 45 52 53 49 4f 4e 5f 55 55 49  (TLS_VERSION_UUI
16520 44 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  D).#if defined(_
16530 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 64 65 66  _clang__) && def
16540 69 6e 65 64 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a  ined(__clang_maj
16550 6f 72 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63  or__)....    ".c
16560 6c 61 6e 67 2d 22 20 53 54 52 49 4e 47 49 46 59  lang-" STRINGIFY
16570 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f  (__clang_major__
16580 29 0a 23 69 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69  ).#if __clang_mi
16590 6e 6f 72 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20  nor__ < 10....  
165a0 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09 09    "0".#endif....
165b0 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f 5f      STRINGIFY(__
165c0 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23  clang_minor__).#
165d0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
165e0 64 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 20 26  d(__cplusplus) &
165f0 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 4f 42 4a  & !defined(__OBJ
16600 43 5f 5f 29 0a 09 09 09 20 20 20 20 22 2e 63 70  C__)....    ".cp
16610 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64 69 66 0a  lusplus".#endif.
16620 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 09  #ifndef NDEBUG..
16630 09 09 20 20 20 20 22 2e 64 65 62 75 67 22 0a 23  ..    ".debug".#
16640 65 6e 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e  endif.#if !defin
16650 65 64 28 5f 5f 63 6c 61 6e 67 5f 5f 29 20 26 26  ed(__clang__) &&
16660 20 21 64 65 66 69 6e 65 64 28 5f 5f 49 4e 54 45   !defined(__INTE
16670 4c 5f 43 4f 4d 50 49 4c 45 52 29 20 26 26 20 64  L_COMPILER) && d
16680 65 66 69 6e 65 64 28 5f 5f 47 4e 55 43 5f 5f 29  efined(__GNUC__)
16690 0a 09 09 09 20 20 20 20 22 2e 67 63 63 2d 22 20  ....    ".gcc-" 
166a0 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55 43  STRINGIFY(__GNUC
166b0 5f 5f 29 0a 23 69 66 20 5f 5f 47 4e 55 43 5f 4d  __).#if __GNUC_M
166c0 49 4e 4f 52 5f 5f 20 3c 20 31 30 0a 09 09 09 20  INOR__ < 10.... 
166d0 20 20 20 22 30 22 0a 23 65 6e 64 69 66 0a 09 09     "0".#endif...
166e0 09 20 20 20 20 53 54 52 49 4e 47 49 46 59 28 5f  .    STRINGIFY(_
166f0 5f 47 4e 55 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23  _GNUC_MINOR__).#
16700 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 49  endif.#ifdef __I
16710 4e 54 45 4c 5f 43 4f 4d 50 49 4c 45 52 0a 09 09  NTEL_COMPILER...
16720 09 20 20 20 20 22 2e 69 63 63 2d 22 20 53 54 52  .    ".icc-" STR
16730 49 4e 47 49 46 59 28 5f 5f 49 4e 54 45 4c 5f 43  INGIFY(__INTEL_C
16740 4f 4d 50 49 4c 45 52 29 0a 23 65 6e 64 69 66 0a  OMPILER).#endif.
16750 23 69 66 64 65 66 20 54 43 4c 5f 4d 45 4d 5f 44  #ifdef TCL_MEM_D
16760 45 42 55 47 0a 09 09 09 20 20 20 20 22 2e 6d 65  EBUG....    ".me
16770 6d 64 65 62 75 67 22 0a 23 65 6e 64 69 66 0a 23  mdebug".#endif.#
16780 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f  if defined(_MSC_
16790 56 45 52 29 0a 09 09 09 20 20 20 20 22 2e 6d 73  VER)....    ".ms
167a0 76 63 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f  vc-" STRINGIFY(_
167b0 4d 53 43 5f 56 45 52 29 0a 23 65 6e 64 69 66 0a  MSC_VER).#endif.
167c0 23 69 66 64 65 66 20 55 53 45 5f 4e 4d 41 4b 45  #ifdef USE_NMAKE
167d0 0a 09 09 09 20 20 20 20 22 2e 6e 6d 61 6b 65 22  ....    ".nmake"
167e0 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
167f0 54 43 4c 5f 43 46 47 5f 4f 50 54 49 4d 49 5a 45  TCL_CFG_OPTIMIZE
16800 44 0a 09 09 09 20 20 20 20 22 2e 6e 6f 2d 6f 70  D....    ".no-op
16810 74 69 6d 69 7a 65 22 0a 23 65 6e 64 69 66 0a 23  timize".#endif.#
16820 69 66 64 65 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09  ifdef __OBJC__..
16830 09 09 20 20 20 20 22 2e 6f 62 6a 65 63 74 69 76  ..    ".objectiv
16840 65 2d 63 22 0a 23 69 66 20 64 65 66 69 6e 65 64  e-c".#if defined
16850 28 5f 5f 63 70 6c 75 73 70 6c 75 73 29 0a 09 09  (__cplusplus)...
16860 09 20 20 20 20 22 70 6c 75 73 70 6c 75 73 22 0a  .    "plusplus".
16870 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69  #endif.#endif.#i
16880 66 64 65 66 20 54 43 4c 5f 43 46 47 5f 50 52 4f  fdef TCL_CFG_PRO
16890 46 49 4c 45 44 0a 09 09 09 20 20 20 20 22 2e 70  FILED....    ".p
168a0 72 6f 66 69 6c 65 22 0a 23 65 6e 64 69 66 0a 23  rofile".#endif.#
168b0 69 66 64 65 66 20 50 55 52 49 46 59 0a 09 09 09  ifdef PURIFY....
168c0 20 20 20 20 22 2e 70 75 72 69 66 79 22 0a 23 65      ".purify".#e
168d0 6e 64 69 66 0a 23 69 66 64 65 66 20 53 54 41 54  ndif.#ifdef STAT
168e0 49 43 5f 42 55 49 4c 44 0a 09 09 09 20 20 20 20  IC_BUILD....    
168f0 22 2e 73 74 61 74 69 63 22 0a 23 65 6e 64 69 66  ".static".#endif
16900 0a 09 09 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  ...), NULL);.   
16910 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43   }.    return TC
16920 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  L_OK;.}.../*. *-
16930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16960 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73  -----*. *. * Tls
16970 4c 69 62 53 68 75 74 64 6f 77 6e 20 2d 2d 0a 20  LibShutdown --. 
16980 2a 0a 20 2a 09 53 68 75 74 64 6f 77 6e 20 53 53  *. *.Shutdown SS
16990 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20 70  L library once p
169a0 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a 20  er application. 
169b0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
169c0 09 41 20 73 74 61 6e 64 61 72 64 20 54 43 4c 20  .A standard TCL 
169d0 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69 64  result. *. * Sid
169e0 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 68  e effects:. *.Sh
169f0 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69 62 72 61  utdown SSL libra
16a00 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  ry. *. *--------
16a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a  --------------*.
16a40 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 4c 69 62 53   */.void TlsLibS
16a50 68 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74 44 61  hutdown(ClientDa
16a60 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b  ta clientData) {
16a70 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
16a80 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 42 49 4f  lled");..    BIO
16a90 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 7d 0a 0a 2f  _cleanup();.}../
16aa0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
16ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20  ----------*. *. 
16ae0 2a 09 54 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a  *.TlsLibInit --.
16af0 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65   *. *.Initialize
16b00 73 20 53 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e  s SSL library on
16b10 63 65 20 70 65 72 20 61 70 70 6c 69 63 61 74 69  ce per applicati
16b20 6f 6e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73  on. *. * Results
16b30 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20  :. *.A standard 
16b40 54 63 6c 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a  Tcl result. *. *
16b50 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
16b60 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53 53  *.Initializes SS
16b70 4c 20 6c 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d  L library. *. *-
16b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16bb0 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69  -----*. */.stati
16bc0 63 20 69 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74  c int TlsLibInit
16bd0 28 29 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  () {.    static 
16be0 69 6e 74 20 69 6e 69 74 69 61 6c 69 7a 65 64 20  int initialized 
16bf0 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74  = 0;..    dprint
16c00 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20  f("Called");..  
16c10 20 20 69 66 20 28 21 69 6e 69 74 69 61 6c 69 7a    if (!initializ
16c20 65 64 29 20 7b 0a 09 2f 2a 20 49 6e 69 74 69 61  ed) {../* Initia
16c30 6c 69 7a 65 20 42 4f 54 48 20 6c 69 62 63 72 79  lize BOTH libcry
16c40 70 74 6f 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20  pto and libssl. 
16c50 2a 2f 0a 09 69 66 20 28 21 4f 50 45 4e 53 53 4c  */..if (!OPENSSL
16c60 5f 69 6e 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53  _init_ssl(OPENSS
16c70 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f  L_INIT_LOAD_SSL_
16c80 53 54 52 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53  STRINGS | OPENSS
16c90 4c 5f 49 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50  L_INIT_LOAD_CRYP
16ca0 54 4f 5f 53 54 52 49 4e 47 53 0a 09 20 20 20 20  TO_STRINGS..    
16cb0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41  | OPENSSL_INIT_A
16cc0 44 44 5f 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c  DD_ALL_CIPHERS |
16cd0 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44   OPENSSL_INIT_AD
16ce0 44 5f 41 4c 4c 5f 44 49 47 45 53 54 53 0a 09 20  D_ALL_DIGESTS.. 
16cf0 20 20 20 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49     | OPENSSL_INI
16d00 54 5f 4c 4f 41 44 5f 43 4f 4e 46 49 47 20 7c 20  T_LOAD_CONFIG | 
16d10 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 53 59  OPENSSL_INIT_ASY
16d20 4e 43 2c 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20  NC, NULL)) {..  
16d30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16d40 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61  OR;..}.../* Crea
16d50 74 65 20 42 49 4f 20 68 61 6e 64 6c 65 72 73 20  te BIO handlers 
16d60 2a 2f 0a 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28  */..BIO_new_tcl(
16d70 4e 55 4c 4c 2c 20 30 29 3b 0a 0a 09 2f 2a 20 43  NULL, 0);.../* C
16d80 72 65 61 74 65 20 65 78 69 74 20 68 61 6e 64 6c  reate exit handl
16d90 65 72 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74  er */..Tcl_Creat
16da0 65 45 78 69 74 48 61 6e 64 6c 65 72 28 54 6c 73  eExitHandler(Tls
16db0 4c 69 62 53 68 75 74 64 6f 77 6e 2c 20 4e 55 4c  LibShutdown, NUL
16dc0 4c 29 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64  L);..initialized
16dd0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
16de0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
16df0 0a 0c 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 70  .../* Init scrip
16e00 74 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  t */.static cons
16e10 74 20 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69  t char tlsTclIni
16e20 74 53 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69  tScript[] = {.#i
16e30 6e 63 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e  nclude "tls.tcl.
16e40 68 22 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  h".};../*. *----
16e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
16e90 20 2a 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d   *. * Tls_Init -
16ea0 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20  -. *. *.This is 
16eb0 61 20 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61  a package initia
16ec0 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75  lization procedu
16ed0 72 65 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c  re, which is cal
16ee0 6c 65 64 0a 20 2a 09 62 79 20 54 43 4c 20 77 68  led. *.by TCL wh
16ef0 65 6e 20 74 68 69 73 20 70 61 63 6b 61 67 65 20  en this package 
16f00 69 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  is to be added t
16f10 6f 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72  o an interpreter
16f20 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
16f30 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20  . *.Initializes 
16f40 73 74 72 75 63 74 75 72 65 73 20 61 6e 64 20 63  structures and c
16f50 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 2e  reates commands.
16f60 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
16f70 63 74 73 3a 0a 20 2a 09 20 43 72 65 61 74 65 20  cts:. *. Create 
16f80 74 68 65 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a  the commands. *.
16f90 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
16fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16fd0 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54  -----. */..#if T
16fe0 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e  CL_MAJOR_VERSION
16ff0 20 3e 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e   > 8.#define MIN
17000 5f 56 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23  _VERSION "9.0".#
17010 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e  else.#define MIN
17020 5f 56 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23  _VERSION "8.5".#
17030 65 6e 64 69 66 0a 0a 44 4c 4c 45 58 50 4f 52 54  endif..DLLEXPORT
17040 20 69 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63   int Tls_Init(Tc
17050 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
17060 29 20 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ) {..    dprintf
17070 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66  ("Called");..#if
17080 64 65 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42  def USE_TCL_STUB
17090 53 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e  S.    if (Tcl_In
170a0 69 74 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20  itStubs(interp, 
170b0 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20  MIN_VERSION, 0) 
170c0 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  == NULL) {..retu
170d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
170e0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 69 66    }.#else.    if
170f0 20 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65   (Tcl_PkgRequire
17100 45 78 28 69 6e 74 65 72 70 2c 20 22 54 63 6c 22  Ex(interp, "Tcl"
17110 2c 20 4d 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30  , MIN_VERSION, 0
17120 2c 20 4e 55 4c 4c 29 20 3d 3d 20 4e 55 4c 4c 29  , NULL) == NULL)
17130 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
17140 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  RROR;.    }.#end
17150 69 66 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c  if..    if (TlsL
17160 69 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f  ibInit() != TCL_
17170 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  OK) {..Tcl_Appen
17180 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17190 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69  "could not initi
171a0 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72  alize SSL librar
171b0 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  y", (char *) NUL
171c0 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
171d0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
171e0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
171f0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
17200 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c  ::tls::ciphers",
17210 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20   CiphersObjCmd, 
17220 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
17230 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
17240 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
17250 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
17260 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
17270 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74   "::tls::connect
17280 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e  ion", Connection
17290 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  InfoObjCmd, (Cli
172a0 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
172b0 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
172c0 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
172d0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
172e0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
172f0 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
17300 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
17310 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
17320 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
17330 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
17340 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
17350 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
17360 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72  p, "::tls::impor
17370 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  t", ImportObjCmd
17380 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
17390 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
173a0 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
173b0 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
173c0 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
173d0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70  p, "::tls::unimp
173e0 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
173f0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
17400 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
17410 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
17420 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
17430 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17440 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75  nterp, "::tls::u
17450 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72  nstack", Unimpor
17460 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
17470 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
17480 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
17490 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
174a0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
174b0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
174c0 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75  ::status", Statu
174d0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
174e0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
174f0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
17500 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
17510 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17520 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
17530 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
17540 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ionObjCmd, (Clie
17550 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
17560 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
17570 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
17580 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17590 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
175a0 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
175b0 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
175c0 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
175d0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
175e0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
175f0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
17600 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
17610 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
17620 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  ocolsObjCmd, (Cl
17630 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
17640 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
17650 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20  oc *) NULL);..  
17660 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61    BuildInfoComma
17670 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20  nd(interp);..   
17680 20 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54   if (interp && T
17690 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
176a0 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
176b0 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
176c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
176d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
176e0 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn Tcl_PkgProvi
176f0 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41  de(interp, PACKA
17700 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45  GE_NAME, PACKAGE
17710 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a  _VERSION);.}../*
17720 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
17730 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17760 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73  ------. *. *.Tls
17770 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a  _SafeInit --. *.
17780 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
17790 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
177a0 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ion procedure fo
177b0 72 20 73 61 66 65 20 69 6e 74 65 72 70 73 2e 0a  r safe interps..
177c0 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
177d0 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c  *.Same as of 'Tl
177e0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69  s_Init'. *. * Si
177f0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
17800 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49  ame as of 'Tls_I
17810 6e 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nit'. *. *------
17820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
17860 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  /.DLLEXPORT int 
17870 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  Tls_SafeInit(Tcl
17880 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
17890 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
178a0 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  Called");.    re
178b0 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e  turn Tls_Init(in
178c0 74 65 72 70 29 3b 0a 7d 0a                       terp);.}.