Hex Artifact Content

Artifact b62ec44bb1a99d210d29c09ee09ef5b457be37369ee7d899f0e7af8f764118e8:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 31 39 39 37 2d 31 39 39 39 20 4d 61  (C) 1997-1999 Ma
0020: 74 74 20 4e 65 77 6d 61 6e 20 3c 6d 61 74 74 40  tt Newman <matt@
0030: 6e 6f 76 61 64 69 67 6d 2e 63 6f 6d 3e 0a 20 2a  novadigm.com>. *
0040: 20 73 6f 6d 65 20 6d 6f 64 69 66 69 63 61 74 69   some modificati
0050: 6f 6e 73 3a 0a 20 2a 09 43 6f 70 79 72 69 67 68  ons:. *.Copyrigh
0060: 74 20 28 43 29 20 32 30 30 30 20 41 6a 75 62 61  t (C) 2000 Ajuba
0070: 20 53 6f 6c 75 74 69 6f 6e 73 0a 20 2a 09 43 6f   Solutions. *.Co
0080: 70 79 72 69 67 68 74 20 28 43 29 20 32 30 30 32  pyright (C) 2002
0090: 20 41 63 74 69 76 65 53 74 61 74 65 20 43 6f 72   ActiveState Cor
00a0: 70 6f 72 61 74 69 6f 6e 0a 20 2a 09 43 6f 70 79  poration. *.Copy
00b0: 72 69 67 68 74 20 28 43 29 20 32 30 30 34 20 53  right (C) 2004 S
00c0: 74 61 72 66 69 73 68 20 53 79 73 74 65 6d 73 0a  tarfish Systems.
00d0: 20 2a 09 43 6f 70 79 72 69 67 68 74 20 28 43 29   *.Copyright (C)
00e0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61   2023 Brian O'Ha
00f0: 67 61 6e 0a 20 2a 0a 20 2a 20 54 4c 53 20 28 61  gan. *. * TLS (a
0100: 6b 61 20 53 53 4c 29 20 43 68 61 6e 6e 65 6c 20  ka SSL) Channel 
0110: 2d 20 63 61 6e 20 62 65 20 6c 61 79 65 72 65 64  - can be layered
0120: 20 6f 6e 20 61 6e 79 20 62 69 2d 64 69 72 65 63   on any bi-direc
0130: 74 69 6f 6e 61 6c 0a 20 2a 20 54 63 6c 5f 43 68  tional. * Tcl_Ch
0140: 61 6e 6e 65 6c 20 28 4e 6f 74 65 3a 20 52 65 71  annel (Note: Req
0150: 75 69 72 65 73 20 54 72 66 20 43 6f 72 65 20 50  uires Trf Core P
0160: 61 74 63 68 29 0a 20 2a 0a 20 2a 20 54 68 69 73  atch). *. * This
0170: 20 77 61 73 20 62 75 69 6c 74 20 28 61 6c 6d 6f   was built (almo
0180: 73 74 29 20 66 72 6f 6d 20 73 63 72 61 74 63 68  st) from scratch
0190: 20 62 61 73 65 64 20 75 70 6f 6e 20 6f 62 73 65   based upon obse
01a0: 72 76 61 74 69 6f 6e 20 6f 66 0a 20 2a 20 4f 70  rvation of. * Op
01b0: 65 6e 53 53 4c 20 30 2e 39 2e 32 42 0a 20 2a 0a  enSSL 0.9.2B. *.
01c0: 20 2a 20 41 64 64 69 74 69 6f 6e 20 63 72 65 64   * Addition cred
01d0: 69 74 20 69 73 20 64 75 65 20 66 6f 72 20 41 6e  it is due for An
01e0: 64 72 65 61 73 20 4b 75 70 72 69 65 73 20 28 61  dreas Kupries (a
01f0: 2e 6b 75 70 72 69 65 73 40 77 65 73 74 65 6e 64  .kupries@westend
0200: 2e 63 6f 6d 29 2c 20 66 6f 72 0a 20 2a 20 70 72  .com), for. * pr
0210: 6f 76 69 64 69 6e 67 20 74 68 65 20 54 63 6c 5f  oviding the Tcl_
0220: 52 65 70 6c 61 63 65 43 68 61 6e 6e 65 6c 20 6d  ReplaceChannel m
0230: 65 63 68 61 6e 69 73 6d 20 61 6e 64 20 77 6f 72  echanism and wor
0240: 6b 69 6e 67 20 63 6c 6f 73 65 6c 79 20 77 69 74  king closely wit
0250: 68 20 6d 65 0a 20 2a 20 74 6f 20 65 6e 68 61 6e  h me. * to enhan
0260: 63 65 20 69 74 20 74 6f 20 73 75 70 70 6f 72 74  ce it to support
0270: 20 66 75 6c 6c 20 66 69 6c 65 65 76 65 6e 74 20   full fileevent 
0280: 73 65 6d 61 6e 74 69 63 73 2e 0a 20 2a 0a 20 2a  semantics.. *. *
0290: 20 41 6c 73 6f 20 77 6f 72 6b 20 64 6f 6e 65 20   Also work done 
02a0: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 20 70 65  by the follow pe
02b0: 6f 70 6c 65 20 70 72 6f 76 69 64 65 64 20 74 68  ople provided th
02c0: 65 20 69 6d 70 65 74 75 73 20 74 6f 20 64 6f 20  e impetus to do 
02d0: 74 68 69 73 20 22 72 69 67 68 74 22 3a 0a 20 2a  this "right":. *
02e0: 09 74 63 6c 53 53 4c 20 28 43 6f 6c 69 6e 20 4d  .tclSSL (Colin M
02f0: 63 43 6f 72 6d 61 63 6b 2c 20 53 68 61 72 65 64  cCormack, Shared
0300: 20 54 65 63 68 6e 6f 6c 6f 67 79 29 0a 20 2a 09   Technology). *.
0310: 53 53 4c 74 63 6c 20 28 50 65 74 65 72 20 41 6e  SSLtcl (Peter An
0320: 74 6d 61 6e 29 0a 20 2a 0a 20 2a 2f 0a 0a 23 69  tman). *. */..#i
0330: 6e 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68  nclude "tlsInt.h
0340: 22 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f  ".#include "tclO
0350: 70 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  pts.h".#include 
0360: 22 74 6c 73 55 75 69 64 2e 68 22 0a 23 69 6e 63  "tlsUuid.h".#inc
0370: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0380: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0390: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65  h>.#include <ope
03a0: 6e 73 73 6c 2f 73 73 6c 2e 68 3e 0a 23 69 6e 63  nssl/ssl.h>.#inc
03b0: 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 72  lude <openssl/cr
03c0: 79 70 74 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ypto.h>.#include
03d0: 20 3c 6f 70 65 6e 73 73 6c 2f 6f 70 65 6e 73 73   <openssl/openss
03e0: 6c 63 6f 6e 66 2e 68 3e 0a 23 69 6e 63 6c 75 64  lconf.h>.#includ
03f0: 65 20 3c 6f 70 65 6e 73 73 6c 2f 72 73 61 2e 68  e <openssl/rsa.h
0400: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e  >.#include <open
0410: 73 73 6c 2f 73 61 66 65 73 74 61 63 6b 2e 68 3e  ssl/safestack.h>
0420: 0a 0a 2f 2a 20 4d 69 6e 20 4f 70 65 6e 53 53 4c  ../* Min OpenSSL
0430: 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 23 69 66 20   version */.#if 
0440: 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f  OPENSSL_VERSION_
0450: 4e 55 4d 42 45 52 20 3c 20 30 78 31 30 31 30 31  NUMBER < 0x10101
0460: 30 30 30 4c 0a 23 65 72 72 6f 72 20 22 4f 6e 6c  000L.#error "Onl
0470: 79 20 4f 70 65 6e 53 53 4c 20 76 31 2e 31 2e 31  y OpenSSL v1.1.1
0480: 20 6f 72 20 6c 61 74 65 72 20 69 73 20 73 75 70   or later is sup
0490: 70 6f 72 74 65 64 22 0a 23 65 6e 64 69 66 0a 0a  ported".#endif..
04a0: 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 64 20 64  ./*. * Forward d
04b0: 65 63 6c 61 72 61 74 69 6f 6e 73 0a 20 2a 2f 0a  eclarations. */.
04c0: 0a 23 64 65 66 69 6e 65 20 46 32 4e 28 6b 65 79  .#define F2N(key
04d0: 2c 20 64 73 70 29 20 5c 0a 09 28 28 28 6b 65 79  , dsp) \..(((key
04e0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 3f 20 28 63 68  ) == NULL) ? (ch
04f0: 61 72 20 2a 29 20 4e 55 4c 4c 20 3a 20 5c 0a 09  ar *) NULL : \..
0500: 09 54 63 6c 5f 54 72 61 6e 73 6c 61 74 65 46 69  .Tcl_TranslateFi
0510: 6c 65 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 28  leName(interp, (
0520: 6b 65 79 29 2c 20 28 64 73 70 29 29 29 0a 0a 73  key), (dsp)))..s
0530: 74 61 74 69 63 20 53 53 4c 5f 43 54 58 20 2a 43  tatic SSL_CTX *C
0540: 54 58 5f 49 6e 69 74 28 53 74 61 74 65 20 2a 73  TX_Init(State *s
0550: 74 61 74 65 50 74 72 2c 20 69 6e 74 20 69 73 53  tatePtr, int isS
0560: 65 72 76 65 72 2c 20 69 6e 74 20 70 72 6f 74 6f  erver, int proto
0570: 2c 20 63 68 61 72 20 2a 6b 65 79 2c 0a 09 09 63  , char *key,...c
0580: 68 61 72 20 2a 63 65 72 74 66 69 6c 65 2c 20 75  har *certfile, u
0590: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65  nsigned char *ke
05a0: 79 5f 61 73 6e 31 2c 20 75 6e 73 69 67 6e 65 64  y_asn1, unsigned
05b0: 20 63 68 61 72 20 2a 63 65 72 74 5f 61 73 6e 31   char *cert_asn1
05c0: 2c 0a 09 09 54 63 6c 5f 53 69 7a 65 20 6b 65 79  ,...Tcl_Size key
05d0: 5f 61 73 6e 31 5f 6c 65 6e 2c 20 54 63 6c 5f 53  _asn1_len, Tcl_S
05e0: 69 7a 65 20 63 65 72 74 5f 61 73 6e 31 5f 6c 65  ize cert_asn1_le
05f0: 6e 2c 20 63 68 61 72 20 2a 43 41 70 61 74 68 2c  n, char *CApath,
0600: 20 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 0a   char *CAstore,.
0610: 09 09 63 68 61 72 20 2a 43 41 66 69 6c 65 2c 20  ..char *CAfile, 
0620: 63 68 61 72 20 2a 63 69 70 68 65 72 73 2c 20 63  char *ciphers, c
0630: 68 61 72 20 2a 63 69 70 68 65 72 73 75 69 74 65  har *ciphersuite
0640: 73 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68  s, int level, ch
0650: 61 72 20 2a 44 48 70 61 72 61 6d 73 29 3b 0a 0a  ar *DHparams);..
0660: 23 64 65 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54  #define TLS_PROT
0670: 4f 5f 53 53 4c 32 09 09 30 78 30 31 0a 23 64 65  O_SSL2..0x01.#de
0680: 66 69 6e 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 53  fine TLS_PROTO_S
0690: 53 4c 33 09 09 30 78 30 32 0a 23 64 65 66 69 6e  SL3..0x02.#defin
06a0: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
06b0: 09 09 30 78 30 34 0a 23 64 65 66 69 6e 65 20 54  ..0x04.#define T
06c0: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 31 09  LS_PROTO_TLS1_1.
06d0: 30 78 30 38 0a 23 64 65 66 69 6e 65 20 54 4c 53  0x08.#define TLS
06e0: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 09 30 78  _PROTO_TLS1_2.0x
06f0: 31 30 0a 23 64 65 66 69 6e 65 20 54 4c 53 5f 50  10.#define TLS_P
0700: 52 4f 54 4f 5f 54 4c 53 31 5f 33 09 30 78 32 30  ROTO_TLS1_3.0x20
0710: 0a 23 64 65 66 69 6e 65 20 45 4e 41 42 4c 45 44  .#define ENABLED
0720: 28 66 6c 61 67 2c 20 6d 61 73 6b 29 09 28 28 28  (flag, mask).(((
0730: 66 6c 61 67 29 20 26 20 28 6d 61 73 6b 29 29 20  flag) & (mask)) 
0740: 3d 3d 20 28 6d 61 73 6b 29 29 0a 0a 23 64 65 66  == (mask))..#def
0750: 69 6e 65 20 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  ine SSLKEYLOGFIL
0760: 45 09 09 22 53 53 4c 4b 45 59 4c 4f 47 46 49 4c  E.."SSLKEYLOGFIL
0770: 45 22 0a 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  E"..../*********
0780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a 20  ***********/./* 
0790: 43 61 6c 6c 62 61 63 6b 73 20 20 20 20 20 20 20  Callbacks       
07a0: 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   */./***********
07b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20  *********/../*. 
07c0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
07d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0800: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 45 76 61 6c 20  ----. *. * Eval 
0810: 43 61 6c 6c 62 61 63 6b 20 43 6f 6d 6d 61 6e 64  Callback Command
0820: 20 2d 2d 0a 20 2a 0a 20 2a 09 45 76 61 6c 20 63   --. *. *.Eval c
0830: 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20  allback command 
0840: 61 6e 64 20 63 61 74 63 68 20 61 6e 79 20 65 72  and catch any er
0850: 72 6f 72 73 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  rors. *. * Resul
0860: 74 73 3a 0a 20 2a 09 30 20 3d 20 43 6f 6d 6d 61  ts:. *.0 = Comma
0870: 6e 64 20 72 65 74 75 72 6e 65 64 20 66 61 69 6c  nd returned fail
0880: 20 6f 72 20 65 76 61 6c 20 72 65 74 75 72 6e 65   or eval returne
0890: 64 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 09 31  d TCL_ERROR. *.1
08a0: 20 3d 20 43 6f 6d 6d 61 6e 64 20 72 65 74 75 72   = Command retur
08b0: 6e 65 64 20 73 75 63 63 65 73 73 20 6f 72 20 65  ned success or e
08c0: 76 61 6c 20 72 65 74 75 72 6e 65 64 20 54 43 4c  val returned TCL
08d0: 5f 4f 4b 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  _OK. *. * Side e
08e0: 66 66 65 63 74 73 3a 0a 20 2a 09 45 76 61 6c 75  ffects:. *.Evalu
08f0: 61 74 65 73 20 63 61 6c 6c 62 61 63 6b 20 63 6f  ates callback co
0900: 6d 6d 61 6e 64 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  mmand. *. *-----
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0950: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 45 76  */.static int.Ev
0960: 61 6c 43 61 6c 6c 62 61 63 6b 28 54 63 6c 5f 49  alCallback(Tcl_I
0970: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 53  nterp *interp, S
0980: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20  tate *statePtr, 
0990: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 29  Tcl_Obj *cmdPtr)
09a0: 20 7b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65 2c   {.    int code,
09b0: 20 6f 6b 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70   ok = 0;..    dp
09c0: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
09d0: 0a 0a 20 20 20 20 54 63 6c 5f 50 72 65 73 65 72  ..    Tcl_Preser
09e0: 76 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  ve((ClientData) 
09f0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
0a00: 5f 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e  _Preserve((Clien
0a10: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 29  tData) statePtr)
0a20: 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63  ;..    /* Eval c
0a30: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 73 75 63  allback with suc
0a40: 63 65 73 73 20 66 6f 72 20 6f 6b 20 6f 72 20 72  cess for ok or r
0a50: 65 74 75 72 6e 20 76 61 6c 75 65 20 31 2c 20 66  eturn value 1, f
0a60: 61 69 6c 20 66 6f 72 20 65 72 72 6f 72 20 6f 72  ail for error or
0a70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 30 20   return value 0 
0a80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  */.    Tcl_Reset
0a90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
0aa0: 20 20 20 20 63 6f 64 65 20 3d 20 54 63 6c 5f 45      code = Tcl_E
0ab0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
0ac0: 20 63 6d 64 50 74 72 2c 20 54 43 4c 5f 45 56 41   cmdPtr, TCL_EVA
0ad0: 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 20 20 64  L_GLOBAL);.    d
0ae0: 70 72 69 6e 74 66 28 22 45 76 61 6c 43 61 6c 6c  printf("EvalCall
0af0: 62 61 63 6b 3a 20 25 64 22 2c 20 63 6f 64 65 29  back: %d", code)
0b00: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d  ;.    if (code =
0b10: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a 20  = TCL_OK) {../* 
0b20: 43 68 65 63 6b 20 72 65 73 75 6c 74 20 66 6f 72  Check result for
0b30: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   return value */
0b40: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c  ..Tcl_Obj *resul
0b50: 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  t = Tcl_GetObjRe
0b60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 09 69  sult(interp);..i
0b70: 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 4e 55 4c  f (result == NUL
0b80: 4c 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46  L || Tcl_GetIntF
0b90: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 72  romObj(interp, r
0ba0: 65 73 75 6c 74 2c 20 26 6f 6b 29 20 21 3d 20 54  esult, &ok) != T
0bb0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 6f 6b  CL_OK) {..    ok
0bc0: 20 3d 20 31 3b 0a 09 7d 0a 09 64 70 72 69 6e 74   = 1;..}..dprint
0bd0: 66 28 22 52 65 73 75 6c 74 3a 20 25 64 22 2c 20  f("Result: %d", 
0be0: 6f 6b 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  ok);.    } else 
0bf0: 7b 0a 09 2f 2a 20 45 72 72 6f 72 20 2d 20 72 65  {../* Error - re
0c00: 6a 65 63 74 20 74 68 65 20 63 65 72 74 69 66 69  ject the certifi
0c10: 63 61 74 65 20 2a 2f 0a 09 64 70 72 69 6e 74 66  cate */..dprintf
0c20: 28 22 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ("Tcl_Background
0c30: 45 72 72 6f 72 22 29 3b 0a 23 69 66 20 28 54 43  Error");.#if (TC
0c40: 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20  L_MAJOR_VERSION 
0c50: 3d 3d 20 38 29 20 26 26 20 28 54 43 4c 5f 4d 49  == 8) && (TCL_MI
0c60: 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c 20 36 29  NOR_VERSION < 6)
0c70: 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ..Tcl_Background
0c80: 45 72 72 6f 72 28 69 6e 74 65 72 70 29 3b 0a 23  Error(interp);.#
0c90: 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63 6b 67 72  else..Tcl_Backgr
0ca0: 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e 28 69 6e  oundException(in
0cb0: 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a 23 65 6e  terp, code);.#en
0cc0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  dif.    }..    T
0cd0: 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65  cl_Release((Clie
0ce0: 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72  ntData) statePtr
0cf0: 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 6c 65 61  );.    Tcl_Relea
0d00: 73 65 28 28 43 6c 69 65 6e 74 44 61 74 61 29 20  se((ClientData) 
0d10: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74  interp);.    ret
0d20: 75 72 6e 20 6f 6b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  urn ok;.}.../*. 
0d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 66 6f 43  ----. *. * InfoC
0d80: 61 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a  allback --. *. *
0d90: 09 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 6f  .Monitors SSL co
0da0: 6e 6e 65 63 74 69 6f 6e 20 70 72 6f 63 65 73 73  nnection process
0db0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
0dc0: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69   *.None. *. * Si
0dd0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43  de effects:. *.C
0de0: 61 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69  alls callback (i
0df0: 66 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a  f defined). *. *
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0e40: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76  ---. */.static v
0e50: 6f 69 64 0a 49 6e 66 6f 43 61 6c 6c 62 61 63 6b  oid.InfoCallback
0e60: 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c 2c  (const SSL *ssl,
0e70: 20 69 6e 74 20 77 68 65 72 65 2c 20 69 6e 74 20   int where, int 
0e80: 72 65 74 29 20 7b 0a 20 20 20 20 53 74 61 74 65  ret) {.    State
0e90: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
0ea0: 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61 70 70  ate*)SSL_get_app
0eb0: 5f 64 61 74 61 28 28 53 53 4c 20 2a 29 73 73 6c  _data((SSL *)ssl
0ec0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  );.    Tcl_Inter
0ed0: 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74  p *interp.= stat
0ee0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20  ePtr->interp;.  
0ef0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74    Tcl_Obj *cmdPt
0f00: 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  r;.    const cha
0f10: 72 20 2a 6d 61 6a 6f 72 2c 20 2a 6d 69 6e 6f 72  r *major, *minor
0f20: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
0f30: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
0f40: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c  f (statePtr->cal
0f50: 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62  lback == (Tcl_Ob
0f60: 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  j*)NULL) {..retu
0f70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rn;.    }..    i
0f80: 66 20 28 77 68 65 72 65 20 26 20 53 53 4c 5f 43  f (where & SSL_C
0f90: 42 5f 48 41 4e 44 53 48 41 4b 45 5f 53 54 41 52  B_HANDSHAKE_STAR
0fa0: 54 29 20 7b 0a 09 6d 61 6a 6f 72 20 3d 20 22 68  T) {..major = "h
0fb0: 61 6e 64 73 68 61 6b 65 22 3b 0a 09 6d 69 6e 6f  andshake";..mino
0fc0: 72 20 3d 20 22 73 74 61 72 74 22 3b 0a 20 20 20  r = "start";.   
0fd0: 20 7d 20 65 6c 73 65 20 69 66 20 28 77 68 65 72   } else if (wher
0fe0: 65 20 26 20 53 53 4c 5f 43 42 5f 48 41 4e 44 53  e & SSL_CB_HANDS
0ff0: 48 41 4b 45 5f 44 4f 4e 45 29 20 7b 0a 09 6d 61  HAKE_DONE) {..ma
1000: 6a 6f 72 20 3d 20 22 68 61 6e 64 73 68 61 6b 65  jor = "handshake
1010: 22 3b 0a 09 6d 69 6e 6f 72 20 3d 20 22 64 6f 6e  ";..minor = "don
1020: 65 22 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  e";.    } else {
1030: 0a 09 69 66 20 28 77 68 65 72 65 20 26 20 53 53  ..if (where & SS
1040: 4c 5f 43 42 5f 41 4c 45 52 54 29 09 09 6d 61 6a  L_CB_ALERT)..maj
1050: 6f 72 20 3d 20 22 61 6c 65 72 74 22 3b 0a 09 65  or = "alert";..e
1060: 6c 73 65 20 69 66 20 28 77 68 65 72 65 20 26 20  lse if (where & 
1070: 53 53 4c 5f 53 54 5f 43 4f 4e 4e 45 43 54 29 09  SSL_ST_CONNECT).
1080: 6d 61 6a 6f 72 20 3d 20 22 63 6f 6e 6e 65 63 74  major = "connect
1090: 22 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65  ";..else if (whe
10a0: 72 65 20 26 20 53 53 4c 5f 53 54 5f 41 43 43 45  re & SSL_ST_ACCE
10b0: 50 54 29 09 09 6d 61 6a 6f 72 20 3d 20 22 61 63  PT)..major = "ac
10c0: 63 65 70 74 22 3b 0a 09 65 6c 73 65 09 09 09 09  cept";..else....
10d0: 09 6d 61 6a 6f 72 20 3d 20 22 75 6e 6b 6e 6f 77  .major = "unknow
10e0: 6e 22 3b 0a 0a 09 69 66 20 28 77 68 65 72 65 20  n";...if (where 
10f0: 26 20 53 53 4c 5f 43 42 5f 52 45 41 44 29 09 09  & SSL_CB_READ)..
1100: 6d 69 6e 6f 72 20 3d 20 22 72 65 61 64 22 3b 0a  minor = "read";.
1110: 09 65 6c 73 65 20 69 66 20 28 77 68 65 72 65 20  .else if (where 
1120: 26 20 53 53 4c 5f 43 42 5f 57 52 49 54 45 29 09  & SSL_CB_WRITE).
1130: 09 6d 69 6e 6f 72 20 3d 20 22 77 72 69 74 65 22  .minor = "write"
1140: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1150: 65 20 26 20 53 53 4c 5f 43 42 5f 4c 4f 4f 50 29  e & SSL_CB_LOOP)
1160: 09 09 6d 69 6e 6f 72 20 3d 20 22 6c 6f 6f 70 22  ..minor = "loop"
1170: 3b 0a 09 65 6c 73 65 20 69 66 20 28 77 68 65 72  ;..else if (wher
1180: 65 20 26 20 53 53 4c 5f 43 42 5f 45 58 49 54 29  e & SSL_CB_EXIT)
1190: 09 09 6d 69 6e 6f 72 20 3d 20 22 65 78 69 74 22  ..minor = "exit"
11a0: 3b 0a 09 65 6c 73 65 09 09 09 09 09 6d 69 6e 6f  ;..else.....mino
11b0: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 22 3b 0a 20  r = "unknown";. 
11c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65     }..    /* Cre
11d0: 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65  ate command to e
11e0: 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68 61  val with fn, cha
11f0: 6e 2c 20 6d 61 6a 6f 72 2c 20 6d 69 6e 6f 72 2c  n, major, minor,
1200: 20 6d 65 73 73 61 67 65 2c 20 61 6e 64 20 74 79   message, and ty
1210: 70 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 63  pe args */.    c
1220: 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c  mdPtr = Tcl_Dupl
1230: 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50 74  icateObj(statePt
1240: 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  r->callback);.  
1250: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
1260: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
1270: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
1280: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 69 6e 66  ewStringObj("inf
1290: 6f 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  o", -1));.    Tc
12a0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
12b0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
12c0: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
12d0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
12e0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
12f0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
1300: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
1310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1320: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1330: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1340: 67 4f 62 6a 28 6d 61 6a 6f 72 2c 20 2d 31 29 29  gObj(major, -1))
1350: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
1360: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1370: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
1380: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1390: 6d 69 6e 6f 72 2c 20 2d 31 29 29 3b 0a 0a 20 20  minor, -1));..  
13a0: 20 20 69 66 20 28 77 68 65 72 65 20 26 20 53 53    if (where & SS
13b0: 4c 5f 43 42 5f 41 4c 45 52 54 29 20 7b 0a 09 54  L_CB_ALERT) {..T
13c0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
13d0: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
13e0: 63 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c  cmdPtr,..    Tcl
13f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 53 53  _NewStringObj(SS
1400: 4c 5f 61 6c 65 72 74 5f 64 65 73 63 5f 73 74 72  L_alert_desc_str
1410: 69 6e 67 5f 6c 6f 6e 67 28 72 65 74 29 2c 20 2d  ing_long(ret), -
1420: 31 29 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62  1));..Tcl_ListOb
1430: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
1440: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
1450: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
1460: 67 4f 62 6a 28 53 53 4c 5f 61 6c 65 72 74 5f 74  gObj(SSL_alert_t
1470: 79 70 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28  ype_string_long(
1480: 72 65 74 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ret), -1));.    
1490: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4c 69  } else {..Tcl_Li
14a0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14b0: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
14c0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
14d0: 74 72 69 6e 67 4f 62 6a 28 53 53 4c 5f 73 74 61  tringObj(SSL_sta
14e0: 74 65 5f 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73  te_string_long(s
14f0: 73 6c 29 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f  sl), -1));..Tcl_
1500: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
1510: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
1520: 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ptr, Tcl_NewStri
1530: 6e 67 4f 62 6a 28 22 69 6e 66 6f 22 2c 20 2d 31  ngObj("info", -1
1540: 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ));.    }..    /
1550: 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20  * Eval callback 
1560: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54  command */.    T
1570: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1580: 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 45 76 61  cmdPtr);.    Eva
1590: 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  lCallback(interp
15a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d 64 50  , statePtr, cmdP
15b0: 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63  tr);.    Tcl_Dec
15c0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
15d0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  );.}.../*. *----
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1620: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 43 61 6c   *. * MessageCal
1630: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 4d  lback --. *. *.M
1640: 6f 6e 69 74 6f 72 73 20 53 53 4c 20 70 72 6f 74  onitors SSL prot
1650: 6f 63 6f 6c 20 6d 65 73 73 61 67 65 73 0a 20 2a  ocol messages. *
1660: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
1670: 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20  None. *. * Side 
1680: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c  effects:. *.Call
1690: 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64  s callback (if d
16a0: 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 2d 2d 2d  efined). *. *---
16b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16f0: 0a 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 50 45  . */.#ifndef OPE
1700: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 5f 54 52 41 43  NSSL_NO_SSL_TRAC
1710: 45 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 65  E.static void.Me
1720: 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 28 69 6e  ssageCallback(in
1730: 74 20 77 72 69 74 65 5f 70 2c 20 69 6e 74 20 76  t write_p, int v
1740: 65 72 73 69 6f 6e 2c 20 69 6e 74 20 63 6f 6e 74  ersion, int cont
1750: 65 6e 74 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ent_type, const 
1760: 76 6f 69 64 20 2a 62 75 66 2c 20 73 69 7a 65 5f  void *buf, size_
1770: 74 20 6c 65 6e 2c 20 53 53 4c 20 2a 73 73 6c 2c  t len, SSL *ssl,
1780: 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a 20 20   void *arg) {.  
1790: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
17a0: 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72 67 3b  r = (State*)arg;
17b0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
17c0: 2a 69 6e 74 65 72 70 09 3d 20 73 74 61 74 65 50  *interp.= stateP
17d0: 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20  tr->interp;.    
17e0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
17f0: 0a 20 20 20 20 63 68 61 72 20 2a 76 65 72 2c 20  .    char *ver, 
1800: 2a 74 79 70 65 3b 0a 20 20 20 20 42 49 4f 20 2a  *type;.    BIO *
1810: 62 69 6f 3b 0a 20 20 20 20 63 68 61 72 20 62 75  bio;.    char bu
1820: 66 66 65 72 5b 31 35 30 30 30 5d 3b 0a 20 20 20  ffer[15000];.   
1830: 20 62 75 66 66 65 72 5b 30 5d 20 3d 20 30 3b 0a   buffer[0] = 0;.
1840: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
1850: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
1860: 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62  (statePtr->callb
1870: 61 63 6b 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  ack == (Tcl_Obj*
1880: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
1890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69  ;.    }..    swi
18a0: 74 63 68 28 76 65 72 73 69 6f 6e 29 20 7b 0a 23  tch(version) {.#
18b0: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
18c0: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
18d0: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
18e0: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
18f0: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
1900: 5f 4e 4f 5f 53 53 4c 32 29 0a 20 20 20 20 63 61  _NO_SSL2).    ca
1910: 73 65 20 53 53 4c 32 5f 56 45 52 53 49 4f 4e 3a  se SSL2_VERSION:
1920: 0a 09 76 65 72 20 3d 20 22 53 53 4c 76 32 22 3b  ..ver = "SSLv2";
1930: 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a  ..break;.#endif.
1940: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
1950: 53 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65  SSL3) && !define
1960: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c  d(OPENSSL_NO_SSL
1970: 33 29 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  3).    case SSL3
1980: 5f 56 45 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d  _VERSION:..ver =
1990: 20 22 53 53 4c 76 33 22 3b 0a 09 62 72 65 61 6b   "SSLv3";..break
19a0: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
19b0: 65 20 54 4c 53 31 5f 56 45 52 53 49 4f 4e 3a 0a  e TLS1_VERSION:.
19c0: 09 76 65 72 20 3d 20 22 54 4c 53 76 31 22 3b 0a  .ver = "TLSv1";.
19d0: 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65  .break;.    case
19e0: 20 54 4c 53 31 5f 31 5f 56 45 52 53 49 4f 4e 3a   TLS1_1_VERSION:
19f0: 0a 09 76 65 72 20 3d 20 22 54 4c 53 76 31 2e 31  ..ver = "TLSv1.1
1a00: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";..break;.    c
1a10: 61 73 65 20 54 4c 53 31 5f 32 5f 56 45 52 53 49  ase TLS1_2_VERSI
1a20: 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54 4c 53 76  ON:..ver = "TLSv
1a30: 31 2e 32 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20  1.2";..break;.  
1a40: 20 20 63 61 73 65 20 54 4c 53 31 5f 33 5f 56 45    case TLS1_3_VE
1a50: 52 53 49 4f 4e 3a 0a 09 76 65 72 20 3d 20 22 54  RSION:..ver = "T
1a60: 4c 53 76 31 2e 33 22 3b 0a 09 62 72 65 61 6b 3b  LSv1.3";..break;
1a70: 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 09 76 65  .    case 0:..ve
1a80: 72 20 3d 20 22 6e 6f 6e 65 22 3b 0a 09 62 72 65  r = "none";..bre
1a90: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1aa0: 0a 09 76 65 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  ..ver = "unknown
1ab0: 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d  ";..break;.    }
1ac0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 63 6f  ..    switch (co
1ad0: 6e 74 65 6e 74 5f 74 79 70 65 29 20 7b 0a 20 20  ntent_type) {.  
1ae0: 20 20 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 48    case SSL3_RT_H
1af0: 45 41 44 45 52 3a 0a 09 74 79 70 65 20 3d 20 22  EADER:..type = "
1b00: 48 65 61 64 65 72 22 3b 0a 09 62 72 65 61 6b 3b  Header";..break;
1b10: 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f 52  .    case SSL3_R
1b20: 54 5f 49 4e 4e 45 52 5f 43 4f 4e 54 45 4e 54 5f  T_INNER_CONTENT_
1b30: 54 59 50 45 3a 0a 09 74 79 70 65 20 3d 20 22 49  TYPE:..type = "I
1b40: 6e 6e 65 72 20 43 6f 6e 74 65 6e 74 20 54 79 70  nner Content Typ
1b50: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1b60: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 43 48 41  case SSL3_RT_CHA
1b70: 4e 47 45 5f 43 49 50 48 45 52 5f 53 50 45 43 3a  NGE_CIPHER_SPEC:
1b80: 0a 09 74 79 70 65 20 3d 20 22 43 68 61 6e 67 65  ..type = "Change
1b90: 20 43 69 70 68 65 72 22 3b 0a 09 62 72 65 61 6b   Cipher";..break
1ba0: 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33 5f  ;.    case SSL3_
1bb0: 52 54 5f 41 4c 45 52 54 3a 0a 09 74 79 70 65 20  RT_ALERT:..type 
1bc0: 3d 20 22 41 6c 65 72 74 22 3b 0a 09 62 72 65 61  = "Alert";..brea
1bd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 53 4c 33  k;.    case SSL3
1be0: 5f 52 54 5f 48 41 4e 44 53 48 41 4b 45 3a 0a 09  _RT_HANDSHAKE:..
1bf0: 74 79 70 65 20 3d 20 22 48 61 6e 64 73 68 61 6b  type = "Handshak
1c00: 65 22 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20  e";..break;.    
1c10: 63 61 73 65 20 53 53 4c 33 5f 52 54 5f 41 50 50  case SSL3_RT_APP
1c20: 4c 49 43 41 54 49 4f 4e 5f 44 41 54 41 3a 0a 09  LICATION_DATA:..
1c30: 74 79 70 65 20 3d 20 22 41 70 70 20 44 61 74 61  type = "App Data
1c40: 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 69 66 20 4f  ";..break;.#if O
1c50: 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e  PENSSL_VERSION_N
1c60: 55 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30  UMBER < 0x300000
1c70: 30 30 4c 0a 20 20 20 20 63 61 73 65 20 44 54 4c  00L.    case DTL
1c80: 53 31 5f 52 54 5f 48 45 41 52 54 42 45 41 54 3a  S1_RT_HEARTBEAT:
1c90: 0a 09 74 79 70 65 20 3d 20 22 48 65 61 72 74 62  ..type = "Heartb
1ca0: 65 61 74 22 3b 0a 09 62 72 65 61 6b 3b 0a 23 65  eat";..break;.#e
1cb0: 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1cc0: 3a 0a 09 74 79 70 65 20 3d 20 22 75 6e 6b 6e 6f  :..type = "unkno
1cd0: 77 6e 22 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  wn";.    }..    
1ce0: 2f 2a 20 4e 65 65 64 73 20 63 6f 6d 70 69 6c 65  /* Needs compile
1cf0: 20 74 69 6d 65 20 6f 70 74 69 6f 6e 20 22 65 6e   time option "en
1d00: 61 62 6c 65 2d 73 73 6c 2d 74 72 61 63 65 22 2e  able-ssl-trace".
1d10: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 62 69 6f   */.    if ((bio
1d20: 20 3d 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 73   = BIO_new(BIO_s
1d30: 5f 6d 65 6d 28 29 29 29 20 21 3d 20 4e 55 4c 4c  _mem())) != NULL
1d40: 29 20 7b 0a 09 69 6e 74 20 6e 3b 0a 09 53 53 4c  ) {..int n;..SSL
1d50: 5f 74 72 61 63 65 28 77 72 69 74 65 5f 70 2c 20  _trace(write_p, 
1d60: 76 65 72 73 69 6f 6e 2c 20 63 6f 6e 74 65 6e 74  version, content
1d70: 5f 74 79 70 65 2c 20 62 75 66 2c 20 6c 65 6e 2c  _type, buf, len,
1d80: 20 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 62 69   ssl, (void *)bi
1d90: 6f 29 3b 0a 09 6e 20 3d 20 42 49 4f 5f 72 65 61  o);..n = BIO_rea
1da0: 64 28 62 69 6f 2c 20 62 75 66 66 65 72 2c 20 42  d(bio, buffer, B
1db0: 49 4f 5f 70 65 6e 64 69 6e 67 28 62 69 6f 29 20  IO_pending(bio) 
1dc0: 3c 20 31 35 30 30 30 20 3f 20 42 49 4f 5f 70 65  < 15000 ? BIO_pe
1dd0: 6e 64 69 6e 67 28 62 69 6f 29 20 3a 20 31 34 39  nding(bio) : 149
1de0: 39 39 29 3b 0a 09 6e 20 3d 20 28 6e 3c 30 29 20  99);..n = (n<0) 
1df0: 3f 20 30 20 3a 20 6e 3b 0a 09 62 75 66 66 65 72  ? 0 : n;..buffer
1e00: 5b 6e 5d 20 3d 20 30 3b 0a 09 28 76 6f 69 64 29  [n] = 0;..(void)
1e10: 42 49 4f 5f 66 6c 75 73 68 28 62 69 6f 29 3b 0a  BIO_flush(bio);.
1e20: 09 42 49 4f 5f 66 72 65 65 28 62 69 6f 29 3b 0a  .BIO_free(bio);.
1e30: 20 20 20 7d 0a 0a 20 20 20 20 64 70 72 69 6e 74     }..    dprint
1e40: 66 28 22 4d 65 73 73 61 67 65 20 64 69 72 65 63  f("Message direc
1e50: 74 69 6f 6e 3d 25 64 2c 20 76 65 72 3d 25 73 2c  tion=%d, ver=%s,
1e60: 20 74 79 70 65 3d 25 73 2c 20 6d 65 73 73 61 67   type=%s, messag
1e70: 65 3d 25 73 22 2c 20 77 72 69 74 65 5f 70 2c 20  e=%s", write_p, 
1e80: 76 65 72 2c 20 74 79 70 65 2c 20 26 62 75 66 66  ver, type, &buff
1e90: 65 72 5b 30 5d 29 3b 0a 0a 20 20 20 20 2f 2a 20  er[0]);..    /* 
1ea0: 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74  Create command t
1eb0: 6f 20 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20  o eval with fn, 
1ec0: 63 68 61 6e 2c 20 64 69 72 65 63 74 69 6f 6e 2c  chan, direction,
1ed0: 20 76 65 72 73 69 6f 6e 2c 20 74 79 70 65 2c 20   version, type, 
1ee0: 61 6e 64 20 6d 65 73 73 61 67 65 20 61 72 67 73  and message args
1ef0: 20 2a 2f 0a 20 20 20 20 63 6d 64 50 74 72 20 3d   */.    cmdPtr =
1f00: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
1f10: 6a 28 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c  j(statePtr->call
1f20: 62 61 63 6b 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  back);.    Tcl_L
1f30: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
1f40: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
1f50: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
1f60: 67 4f 62 6a 28 22 6d 65 73 73 61 67 65 22 2c 20  gObj("message", 
1f70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
1f80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
1f90: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
1fa0: 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65 77 53  r,..    Tcl_NewS
1fb0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
1fc0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
1fd0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
1fe0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
1ff0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2000: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2010: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2020: 28 77 72 69 74 65 5f 70 20 3f 20 22 53 65 6e 74  (write_p ? "Sent
2030: 22 20 3a 20 22 52 65 63 65 69 76 65 64 22 2c 20  " : "Received", 
2040: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
2050: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2060: 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74  nt(interp, cmdPt
2070: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
2080: 4f 62 6a 28 76 65 72 2c 20 2d 31 29 29 3b 0a 20  Obj(ver, -1));. 
2090: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
20a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
20b0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
20c0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 74 79 70  NewStringObj(typ
20d0: 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  e, -1));.    Tcl
20e0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
20f0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d  ement(interp, cm
2100: 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  dPtr, Tcl_NewStr
2110: 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
2120: 31 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 45 76 61  1));..    /* Eva
2130: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
2140: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
2150: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
2160: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
2170: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
2180: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
2190: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
21a0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
21b0: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
21c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2200: 2d 0a 20 2a 0a 20 2a 20 56 65 72 69 66 79 43 61  -. *. * VerifyCa
2210: 6c 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09  llback --. *. *.
2220: 4d 6f 6e 69 74 6f 72 73 20 53 53 4c 20 63 65 72  Monitors SSL cer
2230: 74 69 66 69 63 61 74 65 20 76 61 6c 69 64 61 74  tificate validat
2240: 69 6f 6e 20 70 72 6f 63 65 73 73 2e 20 55 73 65  ion process. Use
2250: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  d to control the
2260: 0a 20 2a 09 62 65 68 61 76 69 6f 72 20 77 68 65  . *.behavior whe
2270: 6e 20 74 68 65 20 53 53 4c 5f 56 45 52 49 46 59  n the SSL_VERIFY
2280: 5f 50 45 45 52 20 66 6c 61 67 20 69 73 20 73 65  _PEER flag is se
2290: 74 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c 65  t. This is calle
22a0: 64 0a 20 2a 09 77 68 65 6e 65 76 65 72 20 61 20  d. *.whenever a 
22b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 69  certificate is i
22c0: 6e 73 70 65 63 74 65 64 20 6f 72 20 64 65 63 69  nspected or deci
22d0: 64 65 64 20 69 6e 76 61 6c 69 64 2e 20 43 61 6c  ded invalid. Cal
22e0: 6c 65 64 20 66 6f 72 0a 20 2a 09 65 61 63 68 20  led for. *.each 
22f0: 63 65 72 74 69 66 69 63 61 74 65 20 69 6e 20 74  certificate in t
2300: 68 65 20 63 65 72 74 20 63 68 61 69 6e 2e 0a 20  he cert chain.. 
2310: 2a 0a 20 2a 20 43 68 65 63 6b 73 3a 0a 20 2a 09  *. * Checks:. *.
2320: 54 68 65 20 63 65 72 74 69 66 69 63 61 74 65 20  The certificate 
2330: 63 68 61 69 6e 20 69 73 20 63 68 65 63 6b 65 64  chain is checked
2340: 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20 74   starting with t
2350: 68 65 20 64 65 65 70 65 73 74 20 6e 65 73 74 69  he deepest nesti
2360: 6e 67 20 6c 65 76 65 6c 0a 20 2a 09 20 20 28 74  ng level. *.  (t
2370: 68 65 20 72 6f 6f 74 20 43 41 20 63 65 72 74 69  he root CA certi
2380: 66 69 63 61 74 65 29 20 61 6e 64 20 77 6f 72 6b  ficate) and work
2390: 65 64 20 75 70 77 61 72 64 20 74 6f 20 74 68 65  ed upward to the
23a0: 20 70 65 65 72 27 73 20 63 65 72 74 69 66 69 63   peer's certific
23b0: 61 74 65 2e 0a 20 2a 09 41 6c 6c 20 73 69 67 6e  ate.. *.All sign
23c0: 61 74 75 72 65 73 20 61 72 65 20 76 61 6c 69 64  atures are valid
23d0: 2c 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 69  , current time i
23e0: 73 20 77 69 74 68 69 6e 20 66 69 72 73 74 20 61  s within first a
23f0: 6e 64 20 6c 61 73 74 20 76 61 6c 69 64 69 74 79  nd last validity
2400: 20 74 69 6d 65 2e 0a 20 2a 09 43 68 65 63 6b 20   time.. *.Check 
2410: 74 68 61 74 20 74 68 65 20 63 65 72 74 69 66 69  that the certifi
2420: 63 61 74 65 20 69 73 20 69 73 73 75 65 64 20 62  cate is issued b
2430: 79 20 74 68 65 20 69 73 73 75 65 72 20 63 65 72  y the issuer cer
2440: 74 69 66 69 63 61 74 65 20 69 73 73 75 65 72 2e  tificate issuer.
2450: 0a 20 2a 09 43 68 65 63 6b 20 74 68 65 20 72 65  . *.Check the re
2460: 76 6f 63 61 74 69 6f 6e 20 73 74 61 74 75 73 20  vocation status 
2470: 66 6f 72 20 65 61 63 68 20 63 65 72 74 69 66 69  for each certifi
2480: 63 61 74 65 2e 0a 20 2a 09 43 68 65 63 6b 20 74  cate.. *.Check t
2490: 68 65 20 76 61 6c 69 64 69 74 79 20 6f 66 20 74  he validity of t
24a0: 68 65 20 67 69 76 65 6e 20 43 52 4c 20 61 6e 64  he given CRL and
24b0: 20 74 68 65 20 63 65 72 74 20 72 65 76 6f 63 61   the cert revoca
24c0: 74 69 6f 6e 20 73 74 61 74 75 73 2e 0a 20 2a 09  tion status.. *.
24d0: 43 68 65 63 6b 20 74 68 65 20 70 6f 6c 69 63 69  Check the polici
24e0: 65 73 20 6f 66 20 61 6c 6c 20 74 68 65 20 63 65  es of all the ce
24f0: 72 74 69 66 69 63 61 74 65 73 0a 20 2a 0a 20 2a  rtificates. *. *
2500: 20 41 72 67 73 0a 20 2a 09 70 72 65 76 65 72 69   Args. *.preveri
2510: 66 79 5f 6f 6b 20 69 6e 64 69 63 61 74 65 73 20  fy_ok indicates 
2520: 77 68 65 74 68 65 72 20 74 68 65 20 63 65 72 74  whether the cert
2530: 69 66 69 63 61 74 65 20 76 65 72 69 66 69 63 61  ificate verifica
2540: 74 69 6f 6e 20 70 61 73 73 65 64 20 28 31 29 20  tion passed (1) 
2550: 6f 72 20 6e 6f 74 20 28 30 29 0a 20 2a 0a 20 2a  or not (0). *. *
2560: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 63   Results:. *.A c
2570: 61 6c 6c 62 61 63 6b 20 62 6f 75 6e 64 20 74 6f  allback bound to
2580: 20 74 68 65 20 73 6f 63 6b 65 74 20 6d 61 79 20   the socket may 
2590: 72 65 74 75 72 6e 20 6f 6e 65 20 6f 66 3a 0a 20  return one of:. 
25a0: 2a 09 20 20 20 20 30 09 09 09 2d 20 74 68 65 20  *.    0...- the 
25b0: 63 65 72 74 69 66 69 63 61 74 65 20 69 73 20 64  certificate is d
25c0: 65 65 6d 65 64 20 69 6e 76 61 6c 69 64 2c 20 73  eemed invalid, s
25d0: 65 6e 64 20 76 65 72 69 66 69 63 61 74 69 6f 6e  end verification
25e0: 0a 20 2a 09 09 09 09 20 20 66 61 69 6c 75 72 65  . *....  failure
25f0: 20 61 6c 65 72 74 20 74 6f 20 70 65 65 72 2c 20   alert to peer, 
2600: 61 6e 64 20 74 65 72 6d 69 6e 61 74 65 20 68 61  and terminate ha
2610: 6e 64 73 68 61 6b 65 2e 0a 20 2a 09 20 20 20 20  ndshake.. *.    
2620: 31 09 09 09 2d 20 74 68 65 20 63 65 72 74 69 66  1...- the certif
2630: 69 63 61 74 65 20 69 73 20 64 65 65 6d 65 64 20  icate is deemed 
2640: 76 61 6c 69 64 2c 20 63 6f 6e 74 69 6e 75 65 20  valid, continue 
2650: 77 69 74 68 20 68 61 6e 64 73 68 61 6b 65 2e 0a  with handshake..
2660: 20 2a 09 20 20 20 20 65 6d 70 74 79 20 73 74 72   *.    empty str
2670: 69 6e 67 09 2d 20 6e 6f 20 63 68 61 6e 67 65 20  ing.- no change 
2680: 74 6f 20 63 65 72 74 69 66 69 63 61 74 65 20 76  to certificate v
2690: 61 6c 69 64 61 74 69 6f 6e 0a 20 2a 0a 20 2a 20  alidation. *. * 
26a0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
26b0: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
26c0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
26d0: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
26e0: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
26f0: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2700: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2710: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
2720: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2770: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 56 65  */.static int.Ve
2780: 72 69 66 79 43 61 6c 6c 62 61 63 6b 28 69 6e 74  rifyCallback(int
2790: 20 6f 6b 2c 20 58 35 30 39 5f 53 54 4f 52 45 5f   ok, X509_STORE_
27a0: 43 54 58 20 2a 63 74 78 29 20 7b 0a 20 20 20 20  CTX *ctx) {.    
27b0: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b  Tcl_Obj *cmdPtr;
27c0: 0a 20 20 20 20 53 53 4c 20 20 20 2a 73 73 6c 09  .    SSL   *ssl.
27d0: 09 3d 20 28 53 53 4c 2a 29 58 35 30 39 5f 53 54  .= (SSL*)X509_ST
27e0: 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 78 5f 64  ORE_CTX_get_ex_d
27f0: 61 74 61 28 63 74 78 2c 20 53 53 4c 5f 67 65 74  ata(ctx, SSL_get
2800: 5f 65 78 5f 64 61 74 61 5f 58 35 30 39 5f 53 54  _ex_data_X509_ST
2810: 4f 52 45 5f 43 54 58 5f 69 64 78 28 29 29 3b 0a  ORE_CTX_idx());.
2820: 20 20 20 20 58 35 30 39 20 20 2a 63 65 72 74 09      X509  *cert.
2830: 09 3d 20 58 35 30 39 5f 53 54 4f 52 45 5f 43 54  .= X509_STORE_CT
2840: 58 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 65  X_get_current_ce
2850: 72 74 28 63 74 78 29 3b 0a 20 20 20 20 53 74 61  rt(ctx);.    Sta
2860: 74 65 20 2a 73 74 61 74 65 50 74 72 09 3d 20 28  te *statePtr.= (
2870: 53 74 61 74 65 2a 29 53 53 4c 5f 67 65 74 5f 61  State*)SSL_get_a
2880: 70 70 5f 64 61 74 61 28 73 73 6c 29 3b 0a 20 20  pp_data(ssl);.  
2890: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28a0: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
28b0: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 6e 74  >interp;.    int
28c0: 20 64 65 70 74 68 09 09 3d 20 58 35 30 39 5f 53   depth..= X509_S
28d0: 54 4f 52 45 5f 43 54 58 5f 67 65 74 5f 65 72 72  TORE_CTX_get_err
28e0: 6f 72 5f 64 65 70 74 68 28 63 74 78 29 3b 0a 20  or_depth(ctx);. 
28f0: 20 20 20 69 6e 74 20 65 72 72 09 09 3d 20 58 35     int err..= X5
2900: 30 39 5f 53 54 4f 52 45 5f 43 54 58 5f 67 65 74  09_STORE_CTX_get
2910: 5f 65 72 72 6f 72 28 63 74 78 29 3b 0a 0a 20 20  _error(ctx);..  
2920: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
2930: 64 22 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66  d");.    dprintf
2940: 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61 63 6b  ("VerifyCallback
2950: 3a 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a 20 20 20  : %d", ok);..   
2960: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
2970: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
2980: 29 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 55 73 65  )NULL) {../* Use
2990: 20 6f 6b 20 76 61 6c 75 65 20 69 66 20 76 65 72   ok value if ver
29a0: 69 66 69 63 61 74 69 6f 6e 20 69 73 20 72 65 71  ification is req
29b0: 75 69 72 65 64 20 2a 2f 0a 09 69 66 20 28 73 74  uired */..if (st
29c0: 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73 20 26  atePtr->vflags &
29d0: 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c   SSL_VERIFY_FAIL
29e0: 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54  _IF_NO_PEER_CERT
29f0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  ) {..    return 
2a00: 6f 6b 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ok;..} else {.. 
2a10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 09 7d 0a     return 1;..}.
2a20: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63      } else if (c
2a30: 65 72 74 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 73  ert == NULL || s
2a40: 73 6c 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  sl == NULL) {..r
2a50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
2a60: 20 20 20 20 64 70 72 69 6e 74 66 28 22 56 65 72      dprintf("Ver
2a70: 69 66 79 43 61 6c 6c 62 61 63 6b 3a 20 65 76 61  ifyCallback: eva
2a80: 6c 20 63 61 6c 6c 62 61 63 6b 22 29 3b 0a 0a 20  l callback");.. 
2a90: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
2aa0: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
2ab0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65 70 74  h fn, chan, dept
2ac0: 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c 69 73  h, cert info lis
2ad0: 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64 20 65  t, status, and e
2ae0: 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20 20 20  rror args */.   
2af0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
2b00: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
2b10: 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20  Ptr->vcmd);.    
2b20: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2b30: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2b40: 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77   cmdPtr, Tcl_New
2b50: 53 74 72 69 6e 67 4f 62 6a 28 22 76 65 72 69 66  StringObj("verif
2b60: 79 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  y", -1));.    Tc
2b70: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b80: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
2b90: 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77 53  mdPtr,..Tcl_NewS
2ba0: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47 65 74  tringObj(Tcl_Get
2bb0: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74 61 74  ChannelName(stat
2bc0: 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d 31 29  ePtr->self), -1)
2bd0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2be0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2bf0: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c00: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 64 65  Tcl_NewIntObj(de
2c10: 70 74 68 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  pth));.    Tcl_L
2c20: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c30: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
2c40: 74 72 2c 20 54 6c 73 5f 4e 65 77 58 35 30 39 4f  tr, Tls_NewX509O
2c50: 62 6a 28 69 6e 74 65 72 70 2c 20 63 65 72 74 29  bj(interp, cert)
2c60: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
2c70: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c80: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
2c90: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6f 6b  Tcl_NewIntObj(ok
2ca0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2cb0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2cc0: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
2cd0: 0a 09 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  ..Tcl_NewStringO
2ce0: 62 6a 28 28 63 68 61 72 2a 29 58 35 30 39 5f 76  bj((char*)X509_v
2cf0: 65 72 69 66 79 5f 63 65 72 74 5f 65 72 72 6f 72  erify_cert_error
2d00: 5f 73 74 72 69 6e 67 28 65 72 72 29 2c 20 2d 31  _string(err), -1
2d10: 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 65 76  ));..    /* Prev
2d20: 65 6e 74 20 49 2f 4f 20 77 68 69 6c 65 20 63 61  ent I/O while ca
2d30: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 20 70 72 6f  llback is in pro
2d40: 67 72 65 73 73 20 2a 2f 0a 20 20 20 20 2f 2a 20  gress */.    /* 
2d50: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20  statePtr->flags 
2d60: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 43 41 4c 4c 42  |= TLS_TCL_CALLB
2d70: 41 43 4b 3b 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ACK; */..    /* 
2d80: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
2d90: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
2da0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
2db0: 64 50 74 72 29 3b 0a 20 20 20 20 6f 6b 20 3d 20  dPtr);.    ok = 
2dc0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
2dd0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
2de0: 6d 64 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f  mdPtr);.    Tcl_
2df0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64  DecrRefCount(cmd
2e00: 50 74 72 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e  Ptr);..    dprin
2e10: 74 66 28 22 56 65 72 69 66 79 43 61 6c 6c 62 61  tf("VerifyCallba
2e20: 63 6b 3a 20 63 6f 6d 6d 61 6e 64 20 72 65 73 75  ck: command resu
2e30: 6c 74 20 3d 20 25 64 22 2c 20 6f 6b 29 3b 0a 0a  lt = %d", ok);..
2e40: 20 20 20 20 2f 2a 20 73 74 61 74 65 50 74 72 2d      /* statePtr-
2e50: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f  >flags &= ~(TLS_
2e60: 54 43 4c 5f 43 41 4c 4c 42 41 43 4b 29 3b 20 2a  TCL_CALLBACK); *
2e70: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 6f 6b 3b  /.    return ok;
2e80: 09 2f 2a 20 42 79 20 64 65 66 61 75 6c 74 2c 20  ./* By default, 
2e90: 6c 65 61 76 65 20 76 65 72 69 66 69 63 61 74 69  leave verificati
2ea0: 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 20 2a 2f  on unchanged. */
2eb0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2f00: 0a 20 2a 20 54 6c 73 5f 45 72 72 6f 72 20 2d 2d  . * Tls_Error --
2f10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c  . *. *.Calls cal
2f20: 6c 62 61 63 6b 20 77 69 74 68 20 65 72 72 6f 72  lback with error
2f30: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20   message.. *. * 
2f40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
2f50: 09 54 68 65 20 65 72 72 20 66 69 65 6c 64 20 6f  .The err field o
2f60: 66 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20  f the currently 
2f70: 6f 70 65 72 61 74 69 76 65 20 53 74 61 74 65 20  operative State 
2f80: 69 73 20 73 65 74 0a 20 2a 09 20 20 74 6f 20 61  is set. *.  to a
2f90: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
2fa0: 6e 67 20 74 68 65 20 53 53 4c 20 6e 65 67 6f 74  ng the SSL negot
2fb0: 69 61 74 69 6f 6e 20 66 61 69 6c 75 72 65 20 72  iation failure r
2fc0: 65 61 73 6f 6e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  eason. *. *-----
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
3010: 2a 2f 0a 76 6f 69 64 0a 54 6c 73 5f 45 72 72 6f  */.void.Tls_Erro
3020: 72 28 53 74 61 74 65 20 2a 73 74 61 74 65 50 74  r(State *statePt
3030: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d  r, const char *m
3040: 73 67 29 20 7b 0a 20 20 20 20 54 63 6c 5f 49 6e  sg) {.    Tcl_In
3050: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3060: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3080: 64 50 74 72 2c 20 2a 6c 69 73 74 50 74 72 3b 0a  dPtr, *listPtr;.
3090: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e      unsigned lon
30a0: 67 20 65 72 72 3b 0a 20 20 20 20 73 74 61 74 65  g err;.    state
30b0: 50 74 72 2d 3e 65 72 72 20 3d 20 6d 73 67 3b 0a  Ptr->err = msg;.
30c0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
30d0: 6c 6c 65 64 20 77 69 74 68 20 6d 65 73 73 61 67  lled with messag
30e0: 65 20 25 73 22 2c 20 6d 73 67 29 3b 0a 0a 20 20  e %s", msg);..  
30f0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
3100: 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28 54 63 6c  callback == (Tcl
3110: 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72  _Obj*)NULL) {..r
3120: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20  eturn;.    }..  
3130: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d    /* Create comm
3140: 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68  and to eval with
3150: 20 66 6e 2c 20 63 68 61 6e 2c 20 61 6e 64 20 6d   fn, chan, and m
3160: 65 73 73 61 67 65 20 61 72 67 73 20 2a 2f 0a 20  essage args */. 
3170: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
3180: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
3190: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29  tePtr->callback)
31a0: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
31b0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
31c0: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54  nterp, cmdPtr, T
31d0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
31e0: 22 65 72 72 6f 72 22 2c 20 2d 31 29 29 3b 0a 20  "error", -1));. 
31f0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3200: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3210: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
3220: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
3230: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
3240: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
3250: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  elf), -1));.    
3260: 69 66 20 28 6d 73 67 20 21 3d 20 4e 55 4c 4c 29  if (msg != NULL)
3270: 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41   {..Tcl_ListObjA
3280: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
3290: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
32a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d 73  _NewStringObj(ms
32b0: 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d 20  g, -1));..    } 
32c0: 65 6c 73 65 20 69 66 20 28 28 6d 73 67 20 3d 20  else if ((msg = 
32d0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 54 63  Tcl_GetString(Tc
32e0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
32f0: 6e 74 65 72 70 29 29 29 20 21 3d 20 4e 55 4c 4c  nterp))) != NULL
3300: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a  ) {..Tcl_ListObj
3310: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3320: 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63  terp, cmdPtr, Tc
3330: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 6d  l_NewStringObj(m
3340: 73 67 2c 20 2d 31 29 29 3b 0a 0a 20 20 20 20 7d  sg, -1));..    }
3350: 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74 50 74 72   else {..listPtr
3360: 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62   = Tcl_NewListOb
3370: 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 77 68 69  j(0, NULL);..whi
3380: 6c 65 20 28 28 65 72 72 20 3d 20 45 52 52 5f 67  le ((err = ERR_g
3390: 65 74 5f 65 72 72 6f 72 28 29 29 20 21 3d 20 30  et_error()) != 0
33a0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73  ) {..    Tcl_Lis
33b0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
33c0: 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  t(interp, listPt
33d0: 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
33e0: 4f 62 6a 28 45 52 52 5f 72 65 61 73 6f 6e 5f 65  Obj(ERR_reason_e
33f0: 72 72 6f 72 5f 73 74 72 69 6e 67 28 65 72 72 29  rror_string(err)
3400: 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f  , -1));..}..Tcl_
3410: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3420: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
3430: 50 74 72 2c 20 6c 69 73 74 50 74 72 29 3b 0a 20  Ptr, listPtr);. 
3440: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 76 61     }..    /* Eva
3450: 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61  l callback comma
3460: 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e  nd */.    Tcl_In
3470: 63 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74  crRefCount(cmdPt
3480: 72 29 3b 0a 20 20 20 20 45 76 61 6c 43 61 6c 6c  r);.    EvalCall
3490: 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73 74 61  back(interp, sta
34a0: 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29 3b 0a  tePtr, cmdPtr);.
34b0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
34c0: 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 7d 0a  ount(cmdPtr);.}.
34d0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
34e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
34f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
3520: 20 4b 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 20   KeyLogCallback 
3530: 2d 2d 0a 20 2a 0a 20 2a 09 57 72 69 74 65 20 72  --. *. *.Write r
3540: 65 63 65 69 76 65 64 20 6b 65 79 20 64 61 74 61  eceived key data
3550: 20 74 6f 20 6c 6f 67 20 66 69 6c 65 2e 0a 20 2a   to log file.. *
3560: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
3570: 3a 0a 20 2a 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d  :. *.none. *. *-
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
35c0: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 4b 65 79 4c  --. */.void KeyL
35d0: 6f 67 43 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  ogCallback(const
35e0: 20 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74   SSL *ssl, const
35f0: 20 63 68 61 72 20 2a 6c 69 6e 65 29 20 7b 0a 20   char *line) {. 
3600: 20 20 20 63 68 61 72 20 2a 73 74 72 20 3d 20 67     char *str = g
3610: 65 74 65 6e 76 28 53 53 4c 4b 45 59 4c 4f 47 46  etenv(SSLKEYLOGF
3620: 49 4c 45 29 3b 0a 20 20 20 20 46 49 4c 45 20 2a  ILE);.    FILE *
3630: 66 64 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  fd;..    dprintf
3640: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
3650: 20 69 66 20 28 73 74 72 29 20 7b 0a 09 66 64 20   if (str) {..fd 
3660: 3d 20 66 6f 70 65 6e 28 73 74 72 2c 20 22 61 22  = fopen(str, "a"
3670: 29 3b 0a 09 66 70 72 69 6e 74 66 28 66 64 2c 20  );..fprintf(fd, 
3680: 22 25 73 5c 6e 22 2c 6c 69 6e 65 29 3b 0a 09 66  "%s\n",line);..f
3690: 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d  close(fd);.    }
36a0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
36f0: 0a 20 2a 20 50 61 73 73 77 6f 72 64 20 43 61 6c  . * Password Cal
3700: 6c 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 43  lback --. *. *.C
3710: 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 70 61 73  alled when a pas
3720: 73 77 6f 72 64 20 69 73 20 6e 65 65 64 65 64 20  sword is needed 
3730: 66 6f 72 20 61 20 70 72 69 76 61 74 65 20 6b 65  for a private ke
3740: 79 20 77 68 65 6e 20 6c 6f 61 64 69 6e 67 0a 20  y when loading. 
3750: 2a 09 6f 72 20 73 74 6f 72 69 6e 67 20 61 20 50  *.or storing a P
3760: 45 4d 20 63 65 72 74 69 66 69 63 61 74 65 20 77  EM certificate w
3770: 69 74 68 20 65 6e 63 72 79 70 74 69 6f 6e 2e 20  ith encryption. 
3780: 45 76 61 6c 73 20 63 61 6c 6c 62 61 63 6b 0a 20  Evals callback. 
3790: 2a 09 73 63 72 69 70 74 20 61 6e 64 20 72 65 74  *.script and ret
37a0: 75 72 6e 73 20 74 68 65 20 72 65 73 75 6c 74 20  urns the result 
37b0: 61 73 20 74 68 65 20 70 61 73 73 77 6f 72 64 20  as the password 
37c0: 73 74 72 69 6e 67 20 69 6e 20 62 75 66 2e 0a 20  string in buf.. 
37d0: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
37e0: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
37f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
3800: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
3810: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
3820: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 61 73 73 77  eturns:. *.Passw
3830: 6f 72 64 20 73 69 7a 65 20 69 6e 20 62 79 74 65  ord size in byte
3840: 73 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 65  s or -1 for an e
3850: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
3860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
38a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 61  */.static int.Pa
38b0: 73 73 77 6f 72 64 43 61 6c 6c 62 61 63 6b 28 63  sswordCallback(c
38c0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 73 69  har *buf, int si
38d0: 7a 65 2c 20 69 6e 74 20 72 77 66 6c 61 67 2c 20  ze, int rwflag, 
38e0: 76 6f 69 64 20 2a 75 64 61 74 61 29 20 7b 0a 20  void *udata) {. 
38f0: 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50     State *stateP
3900: 74 72 09 3d 20 28 53 74 61 74 65 20 2a 29 20 75  tr.= (State *) u
3910: 64 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 49 6e  data;.    Tcl_In
3920: 74 65 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73  terp *interp.= s
3930: 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b  tatePtr->interp;
3940: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d  .    Tcl_Obj *cm
3950: 64 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f  dPtr;.    int co
3960: 64 65 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65  de;.    Tcl_Size
3970: 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 69 6e   len;..    dprin
3980: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20  tf("Called");.. 
3990: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 61 6c 6c     /* If no call
39a0: 62 61 63 6b 2c 20 75 73 65 20 64 65 66 61 75 6c  back, use defaul
39b0: 74 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  t callback */.  
39c0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e    if (statePtr->
39d0: 70 61 73 73 77 6f 72 64 20 3d 3d 20 4e 55 4c 4c  password == NULL
39e0: 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f 45 76 61  ) {..if (Tcl_Eva
39f0: 6c 45 78 28 69 6e 74 65 72 70 2c 20 22 74 6c 73  lEx(interp, "tls
3a00: 3a 3a 70 61 73 73 77 6f 72 64 22 2c 20 2d 31 2c  ::password", -1,
3a10: 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
3a20: 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) == TCL_OK) {..
3a30: 20 20 20 20 63 68 61 72 20 2a 72 65 74 20 3d 20      char *ret = 
3a40: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74  (char *) Tcl_Get
3a50: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63  StringFromObj(Tc
3a60: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
3a70: 6e 74 65 72 70 29 2c 20 26 6c 65 6e 29 3b 0a 09  nterp), &len);..
3a80: 20 20 20 20 69 66 20 28 6c 65 6e 20 3e 20 28 54      if (len > (T
3a90: 63 6c 5f 53 69 7a 65 29 20 73 69 7a 65 2d 31 29  cl_Size) size-1)
3aa0: 20 7b 0a 09 09 6c 65 6e 20 3d 20 28 54 63 6c 5f   {...len = (Tcl_
3ab0: 53 69 7a 65 29 20 73 69 7a 65 2d 31 3b 0a 09 20  Size) size-1;.. 
3ac0: 20 20 20 7d 0a 09 20 20 20 20 73 74 72 6e 63 70     }..    strncp
3ad0: 79 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a  y(buf, ret, (siz
3ae0: 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20 20  e_t) len);..    
3af0: 62 75 66 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b  buf[len] = '\0';
3b00: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 28 69 6e  ..    return (in
3b10: 74 29 20 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20  t) len;..} else 
3b20: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d 31  {..    return -1
3b30: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ;..}.    }..    
3b40: 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e  /* Create comman
3b50: 64 20 74 6f 20 65 76 61 6c 20 77 69 74 68 20 66  d to eval with f
3b60: 6e 2c 20 72 77 66 6c 61 67 2c 20 61 6e 64 20 73  n, rwflag, and s
3b70: 69 7a 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ize args */.    
3b80: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
3b90: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
3ba0: 74 72 2d 3e 70 61 73 73 77 6f 72 64 29 3b 0a 20  tr->password);. 
3bb0: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3bc0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3bd0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3be0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 70 61  NewStringObj("pa
3bf0: 73 73 77 6f 72 64 22 2c 20 2d 31 29 29 3b 0a 20  ssword", -1));. 
3c00: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
3c10: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
3c20: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
3c30: 4e 65 77 49 6e 74 4f 62 6a 28 72 77 66 6c 61 67  NewIntObj(rwflag
3c40: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
3c50: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
3c60: 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c  (interp, cmdPtr,
3c70: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
3c80: 69 7a 65 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f  ize));..    Tcl_
3c90: 50 72 65 73 65 72 76 65 28 28 43 6c 69 65 6e 74  Preserve((Client
3ca0: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20  Data) interp);. 
3cb0: 20 20 20 54 63 6c 5f 50 72 65 73 65 72 76 65 28     Tcl_Preserve(
3cc0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61  (ClientData) sta
3cd0: 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 20  tePtr);..    /* 
3ce0: 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b 20 63 6f  Eval callback co
3cf0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 54 63 6c  mmand */.    Tcl
3d00: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6d  _IncrRefCount(cm
3d10: 64 50 74 72 29 3b 0a 20 20 20 20 63 6f 64 65 20  dPtr);.    code 
3d20: 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28  = Tcl_EvalObjEx(
3d30: 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 20  interp, cmdPtr, 
3d40: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
3d50: 3b 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 21  ;.    if (code !
3d60: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 23 69 66 20  = TCL_OK) {.#if 
3d70: 28 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53 49  (TCL_MAJOR_VERSI
3d80: 4f 4e 20 3d 3d 20 38 29 20 26 26 20 28 54 43 4c  ON == 8) && (TCL
3d90: 5f 4d 49 4e 4f 52 5f 56 45 52 53 49 4f 4e 20 3c  _MINOR_VERSION <
3da0: 20 36 29 0a 09 54 63 6c 5f 42 61 63 6b 67 72 6f   6)..Tcl_Backgro
3db0: 75 6e 64 45 72 72 6f 72 28 69 6e 74 65 72 70 29  undError(interp)
3dc0: 3b 0a 23 65 6c 73 65 0a 09 54 63 6c 5f 42 61 63  ;.#else..Tcl_Bac
3dd0: 6b 67 72 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  kgroundException
3de0: 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 29 3b 0a  (interp, code);.
3df0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
3e00: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
3e10: 74 28 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20  t(cmdPtr);..    
3e20: 54 63 6c 5f 52 65 6c 65 61 73 65 28 28 43 6c 69  Tcl_Release((Cli
3e30: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74  entData) statePt
3e40: 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 73  r);..    /* If s
3e50: 75 63 63 65 73 73 66 75 6c 2c 20 70 61 73 73 20  uccessful, pass 
3e60: 62 61 63 6b 20 70 61 73 73 77 6f 72 64 20 73 74  back password st
3e70: 72 69 6e 67 20 61 6e 64 20 74 72 75 6e 63 61 74  ring and truncat
3e80: 65 20 69 66 20 74 6f 6f 20 6c 6f 6e 67 20 2a 2f  e if too long */
3e90: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 20 3d 3d  .    if (code ==
3ea0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 63 68 61 72   TCL_OK) {..char
3eb0: 20 2a 72 65 74 20 3d 20 28 63 68 61 72 20 2a 29   *ret = (char *)
3ec0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
3ed0: 6f 6d 4f 62 6a 28 54 63 6c 5f 47 65 74 4f 62 6a  omObj(Tcl_GetObj
3ee0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
3ef0: 26 6c 65 6e 29 3b 0a 09 69 66 20 28 6c 65 6e 20  &len);..if (len 
3f00: 3e 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  > (Tcl_Size) siz
3f10: 65 2d 31 29 20 7b 0a 09 20 20 20 20 6c 65 6e 20  e-1) {..    len 
3f20: 3d 20 28 54 63 6c 5f 53 69 7a 65 29 20 73 69 7a  = (Tcl_Size) siz
3f30: 65 2d 31 3b 0a 09 7d 0a 09 73 74 72 6e 63 70 79  e-1;..}..strncpy
3f40: 28 62 75 66 2c 20 72 65 74 2c 20 28 73 69 7a 65  (buf, ret, (size
3f50: 5f 74 29 20 6c 65 6e 29 3b 0a 09 62 75 66 5b 6c  _t) len);..buf[l
3f60: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 09 54 63 6c  en] = '\0';..Tcl
3f70: 5f 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74  _Release((Client
3f80: 44 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 09  Data) interp);..
3f90: 72 65 74 75 72 6e 20 28 69 6e 74 29 20 6c 65 6e  return (int) len
3fa0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
3fb0: 52 65 6c 65 61 73 65 28 28 43 6c 69 65 6e 74 44  Release((ClientD
3fc0: 61 74 61 29 20 69 6e 74 65 72 70 29 3b 0a 20 20  ata) interp);.  
3fd0: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c    return -1;.}..
3fe0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
4030: 53 65 73 73 69 6f 6e 20 43 61 6c 6c 62 61 63 6b  Session Callback
4040: 20 66 6f 72 20 43 6c 69 65 6e 74 73 20 2d 2d 0a   for Clients --.
4050: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 77 68 65   *. *.Called whe
4060: 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
4070: 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  is added to the 
4080: 63 61 63 68 65 2e 20 49 6e 20 54 4c 53 20 31 2e  cache. In TLS 1.
4090: 33 0a 20 2a 09 74 68 69 73 20 6d 61 79 20 62 65  3. *.this may be
40a0: 20 72 65 63 65 69 76 65 64 20 6d 75 6c 74 69 70   received multip
40b0: 6c 65 20 74 69 6d 65 73 20 61 66 74 65 72 20 74  le times after t
40c0: 68 65 20 68 61 6e 64 73 68 61 6b 65 2e 20 46 6f  he handshake. Fo
40d0: 72 0a 20 2a 09 65 61 72 6c 69 65 72 20 76 65 72  r. *.earlier ver
40e0: 73 69 6f 6e 73 2c 20 74 68 69 73 20 77 69 6c 6c  sions, this will
40f0: 20 62 65 20 72 65 63 65 69 76 65 64 20 64 75 72   be received dur
4100: 69 6e 67 20 74 68 65 20 68 61 6e 64 73 68 61 6b  ing the handshak
4110: 65 2e 0a 20 2a 09 54 68 69 73 20 69 73 20 74 68  e.. *.This is th
4120: 65 20 70 72 65 66 65 72 72 65 64 20 77 61 79 20  e preferred way 
4130: 74 6f 20 6f 62 74 61 69 6e 20 61 20 72 65 73 75  to obtain a resu
4140: 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 2e 0a 20  mable session.. 
4150: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
4160: 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .None. *. * Side
4170: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c   effects:. *.Cal
4180: 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20  ls callback (if 
4190: 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52  defined). *. * R
41a0: 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09  eturn codes:. *.
41b0: 30 20 3d 20 65 72 72 6f 72 20 77 68 65 72 65 20  0 = error where 
41c0: 73 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 20  session will be 
41d0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 6d 6f  immediately remo
41e0: 76 65 64 20 66 72 6f 6d 20 74 68 65 20 69 6e 74  ved from the int
41f0: 65 72 6e 61 6c 20 63 61 63 68 65 2e 0a 20 2a 09  ernal cache.. *.
4200: 31 20 3d 20 73 75 63 63 65 73 73 20 77 68 65 72  1 = success wher
4210: 65 20 61 70 70 20 72 65 74 61 69 6e 73 20 73 65  e app retains se
4220: 73 73 69 6f 6e 20 69 6e 20 73 65 73 73 69 6f 6e  ssion in session
4230: 20 63 61 63 68 65 2c 20 61 6e 64 20 6d 75 73 74   cache, and must
4240: 20 63 61 6c 6c 20 53 53 4c 5f 53 45 53 53 49 4f   call SSL_SESSIO
4250: 4e 5f 66 72 65 65 28 29 20 77 68 65 6e 20 64 6f  N_free() when do
4260: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  ne.. *. *-------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
42b0: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 65 73 73  .static int.Sess
42c0: 69 6f 6e 43 61 6c 6c 62 61 63 6b 28 53 53 4c 20  ionCallback(SSL 
42d0: 2a 73 73 6c 2c 20 53 53 4c 5f 53 45 53 53 49 4f  *ssl, SSL_SESSIO
42e0: 4e 20 2a 73 65 73 73 69 6f 6e 29 20 7b 0a 20 20  N *session) {.  
42f0: 20 20 53 74 61 74 65 20 2a 73 74 61 74 65 50 74    State *statePt
4300: 72 20 3d 20 28 53 74 61 74 65 2a 29 53 53 4c 5f  r = (State*)SSL_
4310: 67 65 74 5f 61 70 70 5f 64 61 74 61 28 28 53 53  get_app_data((SS
4320: 4c 20 2a 29 73 73 6c 29 3b 0a 20 20 20 20 54 63  L *)ssl);.    Tc
4330: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4340: 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74  .= statePtr->int
4350: 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  erp;.    Tcl_Obj
4360: 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 63 6f   *cmdPtr;.    co
4370: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4380: 72 20 2a 74 69 63 6b 65 74 3b 0a 20 20 20 20 63  r *ticket;.    c
4390: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
43a0: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 3b 0a  ar *session_id;.
43b0: 20 20 20 20 73 69 7a 65 5f 74 20 6c 65 6e 32 3b      size_t len2;
43c0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  .    unsigned in
43d0: 74 20 75 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72  t ulen;..    dpr
43e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
43f0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4400: 72 2d 3e 63 61 6c 6c 62 61 63 6b 20 3d 3d 20 28  r->callback == (
4410: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
4420: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
4430: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
4440: 7d 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d  } else if (ssl =
4450: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
4460: 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52  n SSL_TLSEXT_ERR
4470: 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20  _NOACK;.    }.. 
4480: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6d     /* Create com
4490: 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77 69 74  mand to eval wit
44a0: 68 20 66 6e 2c 20 63 68 61 6e 2c 20 73 65 73 73  h fn, chan, sess
44b0: 69 6f 6e 20 69 64 2c 20 73 65 73 73 69 6f 6e 20  ion id, session 
44c0: 74 69 63 6b 65 74 2c 20 61 6e 64 20 6c 69 66 65  ticket, and life
44d0: 74 69 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20  time args */.   
44e0: 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75   cmdPtr = Tcl_Du
44f0: 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65  plicateObj(state
4500: 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a  Ptr->callback);.
4510: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
4520: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
4530: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
4540: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 73  _NewStringObj("s
4550: 65 73 73 69 6f 6e 22 2c 20 2d 31 29 29 3b 0a 20  ession", -1));. 
4560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
4570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4580: 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09 20 20 20  rp, cmdPtr,..   
4590: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
45a0: 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c  j(Tcl_GetChannel
45b0: 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73  Name(statePtr->s
45c0: 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 0a 20 20 20  elf), -1));..   
45d0: 20 2f 2a 20 53 65 73 73 69 6f 6e 20 69 64 20 2a   /* Session id *
45e0: 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 69 64  /.    session_id
45f0: 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
4600: 65 74 5f 69 64 28 73 65 73 73 69 6f 6e 2c 20 26  et_id(session, &
4610: 75 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  ulen);.    Tcl_L
4620: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
4630: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
4640: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4650: 72 72 61 79 4f 62 6a 28 73 65 73 73 69 6f 6e 5f  rrayObj(session_
4660: 69 64 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 75  id, (Tcl_Size) u
4670: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  len));..    /* S
4680: 65 73 73 69 6f 6e 20 74 69 63 6b 65 74 20 2a 2f  ession ticket */
4690: 0a 20 20 20 20 53 53 4c 5f 53 45 53 53 49 4f 4e  .    SSL_SESSION
46a0: 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73 65 73  _get0_ticket(ses
46b0: 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c 20 26  sion, &ticket, &
46c0: 6c 65 6e 32 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  len2);.    Tcl_L
46d0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
46e0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
46f0: 74 72 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  tr, Tcl_NewByteA
4700: 72 72 61 79 4f 62 6a 28 74 69 63 6b 65 74 2c 20  rrayObj(ticket, 
4710: 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29  (Tcl_Size) len2)
4720: 29 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 66 65 74  );..    /* Lifet
4730: 69 6d 65 20 2d 20 6e 75 6d 62 65 72 20 6f 66 20  ime - number of 
4740: 73 65 63 6f 6e 64 73 20 2a 2f 0a 20 20 20 20 54  seconds */.    T
4750: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
4760: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4770: 63 6d 64 50 74 72 2c 0a 09 54 63 6c 5f 4e 65 77  cmdPtr,..Tcl_New
4780: 4c 6f 6e 67 4f 62 6a 28 28 6c 6f 6e 67 29 20 53  LongObj((long) S
4790: 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74  SL_SESSION_get_t
47a0: 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65 5f 68  icket_lifetime_h
47b0: 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 29 3b 0a  int(session)));.
47c0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
47d0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
47e0: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
47f0: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
4800: 20 20 20 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28     EvalCallback(
4810: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72  interp, statePtr
4820: 2c 20 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 54  , cmdPtr);.    T
4830: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
4840: 63 6d 64 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  cmdPtr);..    /*
4850: 20 52 65 74 75 72 6e 20 30 20 66 6f 72 20 6e 6f   Return 0 for no
4860: 77 20 75 6e 74 69 6c 20 73 65 73 73 69 6f 6e 20  w until session 
4870: 68 61 6e 64 6c 69 6e 67 20 69 73 20 63 6f 6d 70  handling is comp
4880: 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 65 74 75  lete */.    retu
4890: 72 6e 20 30 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  rn 0;.}.../*. *-
48a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
48e0: 2d 2d 0a 20 2a 0a 20 2a 20 41 4c 50 4e 20 43 61  --. *. * ALPN Ca
48f0: 6c 6c 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65  llback for Serve
4900: 72 73 20 61 6e 64 20 4e 50 4e 20 43 61 6c 6c 62  rs and NPN Callb
4910: 61 63 6b 20 66 6f 72 20 43 6c 69 65 6e 74 73 20  ack for Clients 
4920: 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72 6d  --. *. *.Perform
4930: 20 70 72 6f 74 6f 63 6f 6c 20 28 68 74 74 70 2f   protocol (http/
4940: 31 2e 31 2c 20 68 32 2c 20 68 33 2c 20 65 74 63  1.1, h2, h3, etc
4950: 2e 29 20 73 65 6c 65 63 74 69 6f 6e 20 66 6f 72  .) selection for
4960: 20 74 68 65 0a 20 2a 09 69 6e 63 6f 6d 69 6e 67   the. *.incoming
4970: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 43 61 6c   connection. Cal
4980: 6c 65 64 20 61 66 74 65 72 20 48 65 6c 6c 6f 20  led after Hello 
4990: 61 6e 64 20 73 65 72 76 65 72 20 63 61 6c 6c 62  and server callb
49a0: 61 63 6b 73 2e 0a 20 2a 09 57 68 65 72 65 20 27  acks.. *.Where '
49b0: 6f 75 74 27 20 69 73 20 73 65 6c 65 63 74 65 64  out' is selected
49c0: 20 70 72 6f 74 6f 63 6f 6c 20 61 6e 64 20 27 69   protocol and 'i
49d0: 6e 27 20 69 73 20 74 68 65 20 70 65 65 72 20 61  n' is the peer a
49e0: 64 76 65 72 74 69 73 65 64 20 6c 69 73 74 2e 0a  dvertised list..
49f0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
4a00: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64  *.None. *. * Sid
4a10: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61  e effects:. *.Ca
4a20: 6c 6c 73 20 63 61 6c 6c 62 61 63 6b 20 28 69 66  lls callback (if
4a30: 20 64 65 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20   defined). *. * 
4a40: 52 65 74 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a  Return codes:. *
4a50: 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f  .SSL_TLSEXT_ERR_
4a60: 4f 4b 3a 20 41 4c 50 4e 20 70 72 6f 74 6f 63 6f  OK: ALPN protoco
4a70: 6c 20 73 65 6c 65 63 74 65 64 2e 20 54 68 65 20  l selected. The 
4a80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69  connection conti
4a90: 6e 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53  nues.. *.SSL_TLS
4aa0: 45 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41  EXT_ERR_ALERT_FA
4ab0: 54 41 4c 3a 20 54 68 65 72 65 20 77 61 73 20 6e  TAL: There was n
4ac0: 6f 20 6f 76 65 72 6c 61 70 20 62 65 74 77 65 65  o overlap betwee
4ad0: 6e 20 74 68 65 20 63 6c 69 65 6e 74 27 73 0a 20  n the client's. 
4ae0: 2a 09 20 20 20 20 73 75 70 70 6c 69 65 64 20 6c  *.    supplied l
4af0: 69 73 74 20 61 6e 64 20 74 68 65 20 73 65 72 76  ist and the serv
4b00: 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  er configuration
4b10: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4b20: 20 77 69 6c 6c 20 62 65 20 61 62 6f 72 74 65 64   will be aborted
4b30: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
4b40: 45 52 52 5f 4e 4f 41 43 4b 3a 20 41 4c 50 4e 20  ERR_NOACK: ALPN 
4b50: 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c  protocol not sel
4b60: 65 63 74 65 64 2c 20 65 2e 67 2e 2c 20 62 65 63  ected, e.g., bec
4b70: 61 75 73 65 20 6e 6f 20 41 4c 50 4e 0a 20 2a 09  ause no ALPN. *.
4b80: 20 20 20 20 70 72 6f 74 6f 63 6f 6c 73 20 61 72      protocols ar
4b90: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72  e configured for
4ba0: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
4bb0: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
4bc0: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20 2a 0a 20   continues.. *. 
4bd0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
4be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4c10: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
4c20: 69 6e 74 0a 41 4c 50 4e 43 61 6c 6c 62 61 63 6b  int.ALPNCallback
4c30: 28 53 53 4c 20 2a 73 73 6c 2c 20 63 6f 6e 73 74  (SSL *ssl, const
4c40: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4c50: 2a 6f 75 74 2c 20 75 6e 73 69 67 6e 65 64 20 63  *out, unsigned c
4c60: 68 61 72 20 2a 6f 75 74 6c 65 6e 2c 0a 09 63 6f  har *outlen,..co
4c70: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
4c80: 72 20 2a 69 6e 2c 20 75 6e 73 69 67 6e 65 64 20  r *in, unsigned 
4c90: 69 6e 74 20 69 6e 6c 65 6e 2c 20 76 6f 69 64 20  int inlen, void 
4ca0: 2a 61 72 67 29 20 7b 0a 20 20 20 20 53 74 61 74  *arg) {.    Stat
4cb0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53  e *statePtr = (S
4cc0: 74 61 74 65 2a 29 61 72 67 3b 0a 20 20 20 20 54  tate*)arg;.    T
4cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
4ce0: 70 09 3d 20 73 74 61 74 65 50 74 72 2d 3e 69 6e  p.= statePtr->in
4cf0: 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  terp;.    Tcl_Ob
4d00: 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20 20 20 69  j *cmdPtr;.    i
4d10: 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b 0a 0a 20  nt code, res;.. 
4d20: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
4d30: 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73  ed");..    if (s
4d40: 73 6c 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72  sl == NULL || ar
4d50: 67 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65  g == NULL) {..re
4d60: 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f  turn SSL_TLSEXT_
4d70: 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d  ERR_NOACK;.    }
4d80: 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
4d90: 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 20 20 20 20  protocol */.    
4da0: 69 66 20 28 53 53 4c 5f 73 65 6c 65 63 74 5f 6e  if (SSL_select_n
4db0: 65 78 74 5f 70 72 6f 74 6f 28 28 75 6e 73 69 67  ext_proto((unsig
4dc0: 6e 65 64 20 63 68 61 72 20 2a 2a 29 20 6f 75 74  ned char **) out
4dd0: 2c 20 6f 75 74 6c 65 6e 2c 20 73 74 61 74 65 50  , outlen, stateP
4de0: 74 72 2d 3e 70 72 6f 74 6f 73 2c 20 73 74 61 74  tr->protos, stat
4df0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e  ePtr->protos_len
4e00: 2c 0a 09 69 6e 2c 20 69 6e 6c 65 6e 29 20 3d 3d  ,..in, inlen) ==
4e10: 20 4f 50 45 4e 53 53 4c 5f 4e 50 4e 5f 4e 45 47   OPENSSL_NPN_NEG
4e20: 4f 54 49 41 54 45 44 29 20 7b 0a 09 2f 2a 20 4d  OTIATED) {../* M
4e30: 61 74 63 68 20 66 6f 75 6e 64 20 2a 2f 0a 09 72  atch found */..r
4e40: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
4e50: 45 52 52 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c  ERR_OK;.    } el
4e60: 73 65 20 7b 0a 09 2f 2a 20 4f 50 45 4e 53 53 4c  se {../* OPENSSL
4e70: 5f 4e 50 4e 5f 4e 4f 5f 4f 56 45 52 4c 41 50 20  _NPN_NO_OVERLAP 
4e80: 3d 20 4e 6f 20 6f 76 65 72 6c 61 70 2c 20 73 6f  = No overlap, so
4e90: 20 75 73 65 20 66 69 72 73 74 20 69 74 65 6d 20   use first item 
4ea0: 66 72 6f 6d 20 63 6c 69 65 6e 74 20 70 72 6f 74  from client prot
4eb0: 6f 63 6f 6c 20 6c 69 73 74 20 2a 2f 0a 09 72 65  ocol list */..re
4ec0: 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  s = SSL_TLSEXT_E
4ed0: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
4ee0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
4ef0: 72 2d 3e 76 63 6d 64 20 3d 3d 20 28 54 63 6c 5f  r->vcmd == (Tcl_
4f00: 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  Obj*)NULL) {..re
4f10: 74 75 72 6e 20 72 65 73 3b 0a 20 20 20 20 7d 0a  turn res;.    }.
4f20: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 63  .    /* Create c
4f30: 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c 20 77  ommand to eval w
4f40: 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20 64 65  ith fn, chan, de
4f50: 70 74 68 2c 20 63 65 72 74 20 69 6e 66 6f 20 6c  pth, cert info l
4f60: 69 73 74 2c 20 73 74 61 74 75 73 2c 20 61 6e 64  ist, status, and
4f70: 20 65 72 72 6f 72 20 61 72 67 73 20 2a 2f 0a 20   error args */. 
4f80: 20 20 20 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f     cmdPtr = Tcl_
4f90: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 74 61  DuplicateObj(sta
4fa0: 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20  tePtr->vcmd);.  
4fb0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
4fc0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4fd0: 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e  p, cmdPtr, Tcl_N
4fe0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 61 6c 70  ewStringObj("alp
4ff0: 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
5000: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
5010: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63  lement(interp, c
5020: 6d 64 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f  mdPtr,..    Tcl_
5030: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c  NewStringObj(Tcl
5040: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28  _GetChannelName(
5050: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c  statePtr->self),
5060: 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
5070: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5080: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5090: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
50a0: 67 4f 62 6a 28 28 63 6f 6e 73 74 20 63 68 61 72  gObj((const char
50b0: 20 2a 29 20 2a 6f 75 74 2c 20 2d 31 29 29 3b 0a   *) *out, -1));.
50c0: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
50d0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
50e0: 65 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c  erp, cmdPtr, Tcl
50f0: 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
5100: 65 73 20 3d 3d 20 53 53 4c 5f 54 4c 53 45 58 54  es == SSL_TLSEXT
5110: 5f 45 52 52 5f 4f 4b 29 29 3b 0a 0a 20 20 20 20  _ERR_OK));..    
5120: 2f 2a 20 45 76 61 6c 20 63 61 6c 6c 62 61 63 6b  /* Eval callback
5130: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20   command */.    
5140: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
5150: 28 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 69 66  (cmdPtr);.    if
5160: 20 28 28 63 6f 64 65 20 3d 20 45 76 61 6c 43 61   ((code = EvalCa
5170: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 73  llback(interp, s
5180: 74 61 74 65 50 74 72 2c 20 63 6d 64 50 74 72 29  tatePtr, cmdPtr)
5190: 29 20 3e 20 31 29 20 7b 0a 09 72 65 73 20 3d 20  ) > 1) {..res = 
51a0: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4e  SSL_TLSEXT_ERR_N
51b0: 4f 41 43 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65  OACK;.    } else
51c0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
51d0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
51e0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
51f0: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5200: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5210: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 20 20 20 20  LERT_FATAL;.    
5220: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
5230: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
5240: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a      return res;.
5250: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
5260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
52a0: 20 2a 20 41 64 76 65 72 74 69 73 65 20 50 72 6f   * Advertise Pro
52b0: 74 6f 63 6f 6c 73 20 43 61 6c 6c 62 61 63 6b 20  tocols Callback 
52c0: 66 6f 72 20 4e 65 78 74 20 50 72 6f 74 6f 63 6f  for Next Protoco
52d0: 6c 20 4e 65 67 6f 74 69 61 74 69 6f 6e 20 28 4e  l Negotiation (N
52e0: 50 4e 29 20 69 6e 20 53 65 72 76 65 72 48 65 6c  PN) in ServerHel
52f0: 6c 6f 20 2d 2d 0a 20 2a 0a 20 2a 09 63 61 6c 6c  lo --. *. *.call
5300: 65 64 20 77 68 65 6e 20 61 20 54 4c 53 20 73 65  ed when a TLS se
5310: 72 76 65 72 20 6e 65 65 64 73 20 61 20 6c 69 73  rver needs a lis
5320: 74 20 6f 66 20 73 75 70 70 6f 72 74 65 64 20 70  t of supported p
5330: 72 6f 74 6f 63 6f 6c 73 20 66 6f 72 20 4e 65 78  rotocols for Nex
5340: 74 0a 20 2a 09 50 72 6f 74 6f 63 6f 6c 20 4e 65  t. *.Protocol Ne
5350: 67 6f 74 69 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a  gotiation.. *. *
5360: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e   Results:. *.Non
5370: 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  e. *. * Side eff
5380: 65 63 74 73 3a 0a 20 2a 0a 20 2a 20 52 65 74 75  ects:. *. * Retu
5390: 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53 4c  rn codes:. *.SSL
53a0: 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a 20  _TLSEXT_ERR_OK: 
53b0: 4e 50 4e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c  NPN protocol sel
53c0: 65 63 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65  ected. The conne
53d0: 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e  ction continues.
53e0: 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f 45  . *.SSL_TLSEXT_E
53f0: 52 52 5f 4e 4f 41 43 4b 3a 20 4e 50 4e 20 70 72  RR_NOACK: NPN pr
5400: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 65 6c 65 63  otocol not selec
5410: 74 65 64 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74  ted. The connect
5420: 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 20  ion continues.. 
5430: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 23 69 66 64  -------. */.#ifd
5480: 65 66 20 55 53 45 5f 4e 50 4e 0a 73 74 61 74 69  ef USE_NPN.stati
5490: 63 20 69 6e 74 0a 4e 50 4e 43 61 6c 6c 62 61 63  c int.NPNCallbac
54a0: 6b 28 63 6f 6e 73 74 20 53 53 4c 20 2a 73 73 6c  k(const SSL *ssl
54b0: 2c 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  , const unsigned
54c0: 20 63 68 61 72 20 2a 2a 6f 75 74 2c 20 75 6e 73   char **out, uns
54d0: 69 67 6e 65 64 20 69 6e 74 20 2a 6f 75 74 6c 65  igned int *outle
54e0: 6e 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b 0a  n, void *arg) {.
54f0: 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74 65      State *state
5500: 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61 72  Ptr = (State*)ar
5510: 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28  g;..    dprintf(
5520: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20  "Called");..    
5530: 69 66 20 28 73 73 6c 20 3d 3d 20 4e 55 4c 4c 20  if (ssl == NULL 
5540: 7c 7c 20 61 72 67 20 3d 3d 20 4e 55 4c 4c 29 20  || arg == NULL) 
5550: 7b 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c  {..return SSL_TL
5560: 53 45 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a  SEXT_ERR_NOACK;.
5570: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
5580: 74 20 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74  t protocols list
5590: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74   */.    if (stat
55a0: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
55b0: 4e 55 4c 4c 29 20 7b 0a 09 2a 6f 75 74 20 3d 20  NULL) {..*out = 
55c0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
55d0: 3b 0a 09 2a 6f 75 74 6c 65 6e 20 3d 20 73 74 61  ;..*outlen = sta
55e0: 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65  tePtr->protos_le
55f0: 6e 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  n;.    } else {.
5600: 09 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a 09 2a  .*out = NULL;..*
5610: 6f 75 74 6c 65 6e 20 3d 20 30 3b 0a 09 72 65 74  outlen = 0;..ret
5620: 75 72 6e 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45  urn SSL_TLSEXT_E
5630: 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a  RR_NOACK;.    }.
5640: 20 20 20 20 72 65 74 75 72 6e 20 53 53 4c 5f 54      return SSL_T
5650: 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 7d 0a  LSEXT_ERR_OK;.}.
5660: 23 65 6e 64 69 66 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  #endif.../*. *--
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56b0: 2d 0a 20 2a 0a 20 2a 20 53 4e 49 20 43 61 6c 6c  -. *. * SNI Call
56c0: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
56d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 50 65 72 66 6f 72   --. *. *.Perfor
56e0: 6d 20 73 65 72 76 65 72 2d 73 69 64 65 20 53 4e  m server-side SN
56f0: 49 20 68 6f 73 74 6e 61 6d 65 20 73 65 6c 65 63  I hostname selec
5700: 74 69 6f 6e 20 61 66 74 65 72 20 72 65 63 65 69  tion after recei
5710: 76 69 6e 67 20 53 4e 49 20 65 78 74 65 6e 73 69  ving SNI extensi
5720: 6f 6e 0a 20 2a 09 69 6e 20 43 6c 69 65 6e 74 20  on. *.in Client 
5730: 48 65 6c 6c 6f 2e 20 43 61 6c 6c 65 64 20 61 66  Hello. Called af
5740: 74 65 72 20 68 65 6c 6c 6f 20 63 61 6c 6c 62 61  ter hello callba
5750: 63 6b 20 62 75 74 20 62 65 66 6f 72 65 20 41 4c  ck but before AL
5760: 50 4e 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a  PN callback.. *.
5770: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e   * Results:. *.N
5780: 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  one. *. * Side e
5790: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6c 6c 73  ffects:. *.Calls
57a0: 20 63 61 6c 6c 62 61 63 6b 20 28 69 66 20 64 65   callback (if de
57b0: 66 69 6e 65 64 29 0a 20 2a 0a 20 2a 20 52 65 74  fined). *. * Ret
57c0: 75 72 6e 20 63 6f 64 65 73 3a 0a 20 2a 09 53 53  urn codes:. *.SS
57d0: 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 4f 4b 3a  L_TLSEXT_ERR_OK:
57e0: 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65 20 69 73   SNI hostname is
57f0: 20 61 63 63 65 70 74 65 64 2e 20 54 68 65 20 63   accepted. The c
5800: 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e  onnection contin
5810: 75 65 73 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45  ues.. *.SSL_TLSE
5820: 58 54 5f 45 52 52 5f 41 4c 45 52 54 5f 46 41 54  XT_ERR_ALERT_FAT
5830: 41 4c 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  AL: SNI hostname
5840: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
5850: 2e 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  . The connection
5860: 0a 20 2a 09 20 20 20 20 69 73 20 61 62 6f 72 74  . *.    is abort
5870: 65 64 2e 20 44 65 66 61 75 6c 74 20 66 6f 72 20  ed. Default for 
5880: 61 6c 65 72 74 20 69 73 20 53 53 4c 5f 41 44 5f  alert is SSL_AD_
5890: 55 4e 52 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d  UNRECOGNIZED_NAM
58a0: 45 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54  E.. *.SSL_TLSEXT
58b0: 5f 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49  _ERR_ALERT_WARNI
58c0: 4e 47 3a 20 53 4e 49 20 68 6f 73 74 6e 61 6d 65  NG: SNI hostname
58d0: 20 69 73 20 6e 6f 74 20 61 63 63 65 70 74 65 64   is not accepted
58e0: 2c 20 77 61 72 6e 69 6e 67 20 61 6c 65 72 74 0a  , warning alert.
58f0: 20 2a 09 20 20 20 20 73 65 6e 74 20 28 6e 6f 74   *.    sent (not
5900: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 54 4c   supported in TL
5910: 53 76 31 2e 33 29 2e 20 54 68 65 20 63 6f 6e 6e  Sv1.3). The conn
5920: 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75 65 73  ection continues
5930: 2e 0a 20 2a 09 53 53 4c 5f 54 4c 53 45 58 54 5f  .. *.SSL_TLSEXT_
5940: 45 52 52 5f 4e 4f 41 43 4b 3a 20 53 4e 49 20 68  ERR_NOACK: SNI h
5950: 6f 73 74 6e 61 6d 65 20 69 73 20 6e 6f 74 20 61  ostname is not a
5960: 63 63 65 70 74 65 64 20 61 6e 64 20 6e 6f 74 20  ccepted and not 
5970: 61 63 6b 6e 6f 77 6c 65 64 67 65 64 2c 0a 20 2a  acknowledged,. *
5980: 09 20 20 20 20 65 2e 67 2e 20 69 66 20 53 4e 49  .    e.g. if SNI
5990: 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6f   has not been co
59a0: 6e 66 69 67 75 72 65 64 2e 20 54 68 65 20 63 6f  nfigured. The co
59b0: 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 69 6e 75  nnection continu
59c0: 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  es.. *. *-------
59d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
5a10: 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 4e 49 43  .static int.SNIC
5a20: 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74 20 53 53  allback(const SS
5a30: 4c 20 2a 73 73 6c 2c 20 69 6e 74 20 2a 61 6c 65  L *ssl, int *ale
5a40: 72 74 2c 20 76 6f 69 64 20 2a 61 72 67 29 20 7b  rt, void *arg) {
5a50: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
5a60: 65 50 74 72 20 3d 20 28 53 74 61 74 65 2a 29 61  ePtr = (State*)a
5a70: 72 67 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  rg;.    Tcl_Inte
5a80: 72 70 20 2a 69 6e 74 65 72 70 09 3d 20 73 74 61  rp *interp.= sta
5a90: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 3b 0a 20  tePtr->interp;. 
5aa0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 50     Tcl_Obj *cmdP
5ab0: 74 72 3b 0a 20 20 20 20 69 6e 74 20 63 6f 64 65  tr;.    int code
5ac0: 2c 20 72 65 73 3b 0a 20 20 20 20 63 6f 6e 73 74  , res;.    const
5ad0: 20 63 68 61 72 20 2a 73 65 72 76 65 72 6e 61 6d   char *servernam
5ae0: 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64  e = NULL;..    d
5af0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
5b00: 3b 0a 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  ;..    if (ssl =
5b10: 3d 20 4e 55 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d  = NULL || arg ==
5b20: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
5b30: 20 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f   SSL_TLSEXT_ERR_
5b40: 4e 4f 41 43 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20  NOACK;.    }..  
5b50: 20 20 2f 2a 20 4f 6e 6c 79 20 77 6f 72 6b 73 20    /* Only works 
5b60: 66 6f 72 20 54 4c 53 20 31 2e 32 20 61 6e 64 20  for TLS 1.2 and 
5b70: 65 61 72 6c 69 65 72 20 2a 2f 0a 20 20 20 20 73  earlier */.    s
5b80: 65 72 76 65 72 6e 61 6d 65 20 3d 20 53 53 4c 5f  ervername = SSL_
5b90: 67 65 74 5f 73 65 72 76 65 72 6e 61 6d 65 28 73  get_servername(s
5ba0: 73 6c 2c 20 54 4c 53 45 58 54 5f 4e 41 4d 45 54  sl, TLSEXT_NAMET
5bb0: 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29 3b 0a  YPE_host_name);.
5bc0: 20 20 20 20 69 66 20 28 21 73 65 72 76 65 72 6e      if (!servern
5bd0: 61 6d 65 20 7c 7c 20 73 65 72 76 65 72 6e 61 6d  ame || servernam
5be0: 65 5b 30 5d 20 3d 3d 20 27 5c 30 27 29 20 7b 0a  e[0] == '\0') {.
5bf0: 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53 45  .return SSL_TLSE
5c00: 58 54 5f 45 52 52 5f 4e 4f 41 43 4b 3b 0a 20 20  XT_ERR_NOACK;.  
5c10: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74 61    }..    if (sta
5c20: 74 65 50 74 72 2d 3e 76 63 6d 64 20 3d 3d 20 28  tePtr->vcmd == (
5c30: 54 63 6c 5f 4f 62 6a 2a 29 4e 55 4c 4c 29 20 7b  Tcl_Obj*)NULL) {
5c40: 0a 09 72 65 74 75 72 6e 20 53 53 4c 5f 54 4c 53  ..return SSL_TLS
5c50: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5c60: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65  }..    /* Create
5c70: 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 65 76 61 6c   command to eval
5c80: 20 77 69 74 68 20 66 6e 2c 20 63 68 61 6e 2c 20   with fn, chan, 
5c90: 61 6e 64 20 73 65 72 76 65 72 20 6e 61 6d 65 20  and server name 
5ca0: 61 72 67 73 20 2a 2f 0a 20 20 20 20 63 6d 64 50  args */.    cmdP
5cb0: 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  tr = Tcl_Duplica
5cc0: 74 65 4f 62 6a 28 73 74 61 74 65 50 74 72 2d 3e  teObj(statePtr->
5cd0: 76 63 6d 64 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  vcmd);.    Tcl_L
5ce0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
5cf0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50  ent(interp, cmdP
5d00: 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  tr, Tcl_NewStrin
5d10: 67 4f 62 6a 28 22 73 6e 69 22 2c 20 2d 31 29 29  gObj("sni", -1))
5d20: 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
5d30: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
5d40: 6e 74 65 72 70 2c 20 63 6d 64 50 74 72 2c 0a 09  nterp, cmdPtr,..
5d50: 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
5d60: 67 4f 62 6a 28 54 63 6c 5f 47 65 74 43 68 61 6e  gObj(Tcl_GetChan
5d70: 6e 65 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72  nelName(statePtr
5d80: 2d 3e 73 65 6c 66 29 2c 20 2d 31 29 29 3b 0a 20  ->self), -1));. 
5d90: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
5da0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
5db0: 72 70 2c 20 63 6d 64 50 74 72 2c 20 54 63 6c 5f  rp, cmdPtr, Tcl_
5dc0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 65 72  NewStringObj(ser
5dd0: 76 65 72 6e 61 6d 65 20 2c 20 2d 31 29 29 3b 0a  vername , -1));.
5de0: 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61 6c  .    /* Eval cal
5df0: 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a 2f  lback command */
5e00: 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
5e10: 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a 20  Count(cmdPtr);. 
5e20: 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20 45     if ((code = E
5e30: 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65  valCallback(inte
5e40: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63 6d  rp, statePtr, cm
5e50: 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09 72  dPtr)) > 1) {..r
5e60: 65 73 20 3d 20 53 53 4c 5f 54 4c 53 45 58 54 5f  es = SSL_TLSEXT_
5e70: 45 52 52 5f 41 4c 45 52 54 5f 57 41 52 4e 49 4e  ERR_ALERT_WARNIN
5e80: 47 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  G;..*alert = SSL
5e90: 5f 41 44 5f 55 4e 52 45 43 4f 47 4e 49 5a 45 44  _AD_UNRECOGNIZED
5ea0: 5f 4e 41 4d 45 3b 20 2f 2a 20 4e 6f 74 20 73 75  _NAME; /* Not su
5eb0: 70 70 6f 72 74 65 64 20 62 79 20 54 4c 53 20 31  pported by TLS 1
5ec0: 2e 33 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  .3 */.    } else
5ed0: 20 69 66 20 28 63 6f 64 65 20 3d 3d 20 31 29 20   if (code == 1) 
5ee0: 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 54 4c 53  {..res = SSL_TLS
5ef0: 45 58 54 5f 45 52 52 5f 4f 4b 3b 0a 20 20 20 20  EXT_ERR_OK;.    
5f00: 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20  } else {..res = 
5f10: 53 53 4c 5f 54 4c 53 45 58 54 5f 45 52 52 5f 41  SSL_TLSEXT_ERR_A
5f20: 4c 45 52 54 5f 46 41 54 41 4c 3b 0a 09 2a 61 6c  LERT_FATAL;..*al
5f30: 65 72 74 20 3d 20 53 53 4c 5f 41 44 5f 55 4e 52  ert = SSL_AD_UNR
5f40: 45 43 4f 47 4e 49 5a 45 44 5f 4e 41 4d 45 3b 20  ECOGNIZED_NAME; 
5f50: 2f 2a 20 4e 6f 74 20 73 75 70 70 6f 72 74 65 64  /* Not supported
5f60: 20 62 79 20 54 4c 53 20 31 2e 33 20 2a 2f 0a 20   by TLS 1.3 */. 
5f70: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
5f80: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
5f90: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
5fa0: 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  s;.}.../*. *----
5fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5ff0: 20 2a 0a 20 2a 20 43 6c 69 65 6e 74 48 65 6c 6c   *. * ClientHell
6000: 6f 20 48 61 6e 64 73 68 61 6b 65 20 43 61 6c 6c  o Handshake Call
6010: 62 61 63 6b 20 66 6f 72 20 53 65 72 76 65 72 73  back for Servers
6020: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 73 65 64 20 62   --. *. *.Used b
6030: 79 20 73 65 72 76 65 72 20 74 6f 20 65 78 61 6d  y server to exam
6040: 69 6e 65 20 74 68 65 20 73 65 72 76 65 72 20 6e  ine the server n
6050: 61 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28  ame indication (
6060: 53 4e 49 29 20 65 78 74 65 6e 73 69 6f 6e 0a 20  SNI) extension. 
6070: 2a 09 70 72 6f 76 69 64 65 64 20 62 79 20 74 68  *.provided by th
6080: 65 20 63 6c 69 65 6e 74 20 69 6e 20 6f 72 64 65  e client in orde
6090: 72 20 74 6f 20 73 65 6c 65 63 74 20 61 6e 20 61  r to select an a
60a0: 70 70 72 6f 70 72 69 61 74 65 20 63 65 72 74 69  ppropriate certi
60b0: 66 69 63 61 74 65 20 74 6f 0a 20 2a 09 70 72 65  ficate to. *.pre
60c0: 73 65 6e 74 2c 20 61 6e 64 20 6d 61 6b 65 20 6f  sent, and make o
60d0: 74 68 65 72 20 63 6f 6e 66 69 67 75 72 61 74 69  ther configurati
60e0: 6f 6e 20 61 64 6a 75 73 74 6d 65 6e 74 73 20 72  on adjustments r
60f0: 65 6c 65 76 61 6e 74 20 74 6f 20 74 68 61 74 20  elevant to that 
6100: 73 65 72 76 65 72 0a 20 2a 09 6e 61 6d 65 20 61  server. *.name a
6110: 6e 64 20 69 74 73 20 63 6f 6e 66 69 67 75 72 61  nd its configura
6120: 74 69 6f 6e 2e 20 54 68 69 73 20 69 6e 63 6c 75  tion. This inclu
6130: 64 65 73 20 73 77 61 70 70 69 6e 67 20 6f 75 74  des swapping out
6140: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 0a   the associated.
6150: 20 2a 09 53 53 4c 5f 43 54 58 20 70 6f 69 6e 74   *.SSL_CTX point
6160: 65 72 2c 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  er, modifying th
6170: 65 20 73 65 72 76 65 72 27 73 20 6c 69 73 74 20  e server's list 
6180: 6f 66 20 70 65 72 6d 69 74 74 65 64 20 54 4c 53  of permitted TLS
6190: 20 76 65 72 73 69 6f 6e 73 2c 0a 20 2a 09 63 68   versions,. *.ch
61a0: 61 6e 67 69 6e 67 20 74 68 65 20 73 65 72 76 65  anging the serve
61b0: 72 27 73 20 63 69 70 68 65 72 20 6c 69 73 74 20  r's cipher list 
61c0: 69 6e 20 72 65 73 70 6f 6e 73 65 20 74 6f 20 74  in response to t
61d0: 68 65 20 63 6c 69 65 6e 74 27 73 20 63 69 70 68  he client's ciph
61e0: 65 72 20 6c 69 73 74 2c 20 65 74 63 2e 0a 20 2a  er list, etc.. *
61f0: 09 43 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 53  .Called before S
6200: 4e 49 20 61 6e 64 20 41 4c 50 4e 20 63 61 6c 6c  NI and ALPN call
6210: 62 61 63 6b 73 2e 0a 20 2a 0a 20 2a 20 52 65 73  backs.. *. * Res
6220: 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a  ults:. *.None. *
6230: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
6240: 3a 0a 20 2a 09 43 61 6c 6c 73 20 63 61 6c 6c 62  :. *.Calls callb
6250: 61 63 6b 20 28 69 66 20 64 65 66 69 6e 65 64 29  ack (if defined)
6260: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 20 63 6f  . *. * Return co
6270: 64 65 73 3a 0a 20 2a 09 53 53 4c 5f 43 4c 49 45  des:. *.SSL_CLIE
6280: 4e 54 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3a 20  NT_HELLO_RETRY: 
6290: 73 75 73 70 65 6e 64 20 74 68 65 20 68 61 6e 64  suspend the hand
62a0: 73 68 61 6b 65 2c 20 61 6e 64 20 74 68 65 20 68  shake, and the h
62b0: 61 6e 64 73 68 61 6b 65 20 66 75 6e 63 74 69 6f  andshake functio
62c0: 6e 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 69 6d  n will return im
62d0: 6d 65 64 69 61 74 65 6c 79 0a 20 2a 09 53 53 4c  mediately. *.SSL
62e0: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52  _CLIENT_HELLO_ER
62f0: 52 4f 52 3a 20 66 61 69 6c 75 72 65 2c 20 74 65  ROR: failure, te
6300: 72 6d 69 6e 61 74 65 20 63 6f 6e 6e 65 63 74 69  rminate connecti
6310: 6f 6e 2e 20 53 65 74 20 61 6c 65 72 74 20 74 6f  on. Set alert to
6320: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 2a 09   error code.. *.
6330: 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f  SSL_CLIENT_HELLO
6340: 5f 53 55 43 43 45 53 53 3a 20 73 75 63 63 65 73  _SUCCESS: succes
6350: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73  ----------. */.s
63a0: 74 61 74 69 63 20 69 6e 74 0a 48 65 6c 6c 6f 43  tatic int.HelloC
63b0: 61 6c 6c 62 61 63 6b 28 53 53 4c 20 2a 73 73 6c  allback(SSL *ssl
63c0: 2c 20 69 6e 74 20 2a 61 6c 65 72 74 2c 20 76 6f  , int *alert, vo
63d0: 69 64 20 2a 61 72 67 29 20 7b 0a 20 20 20 20 53  id *arg) {.    S
63e0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d  tate *statePtr =
63f0: 20 28 53 74 61 74 65 2a 29 61 72 67 3b 0a 20 20   (State*)arg;.  
6400: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
6410: 74 65 72 70 09 3d 20 73 74 61 74 65 50 74 72 2d  terp.= statePtr-
6420: 3e 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c  >interp;.    Tcl
6430: 5f 4f 62 6a 20 2a 63 6d 64 50 74 72 3b 0a 20 20  _Obj *cmdPtr;.  
6440: 20 20 69 6e 74 20 63 6f 64 65 2c 20 72 65 73 3b    int code, res;
6450: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6460: 2a 73 65 72 76 65 72 6e 61 6d 65 3b 0a 20 20 20  *servername;.   
6470: 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
6480: 63 68 61 72 20 2a 70 3b 0a 20 20 20 20 73 69 7a  char *p;.    siz
6490: 65 5f 74 20 6c 65 6e 2c 20 72 65 6d 61 69 6e 69  e_t len, remaini
64a0: 6e 67 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66  ng;..    dprintf
64b0: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20  ("Called");..   
64c0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 76   if (statePtr->v
64d0: 63 6d 64 20 3d 3d 20 28 54 63 6c 5f 4f 62 6a 2a  cmd == (Tcl_Obj*
64e0: 29 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e  )NULL) {..return
64f0: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6500: 4f 5f 53 55 43 43 45 53 53 3b 0a 20 20 20 20 7d  O_SUCCESS;.    }
6510: 20 65 6c 73 65 20 69 66 20 28 73 73 6c 20 3d 3d   else if (ssl ==
6520: 20 28 63 6f 6e 73 74 20 53 53 4c 20 2a 29 4e 55   (const SSL *)NU
6530: 4c 4c 20 7c 7c 20 61 72 67 20 3d 3d 20 28 76 6f  LL || arg == (vo
6540: 69 64 20 2a 29 4e 55 4c 4c 29 20 7b 0a 09 72 65  id *)NULL) {..re
6550: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6560: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6570: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6e   }..    /* Get n
6580: 61 6d 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  ames */.    if (
6590: 21 53 53 4c 5f 63 6c 69 65 6e 74 5f 68 65 6c 6c  !SSL_client_hell
65a0: 6f 5f 67 65 74 30 5f 65 78 74 28 73 73 6c 2c 20  o_get0_ext(ssl, 
65b0: 54 4c 53 45 58 54 5f 54 59 50 45 5f 73 65 72 76  TLSEXT_TYPE_serv
65c0: 65 72 5f 6e 61 6d 65 2c 20 26 70 2c 20 26 72 65  er_name, &p, &re
65d0: 6d 61 69 6e 69 6e 67 29 20 7c 7c 20 72 65 6d 61  maining) || rema
65e0: 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a 09 2a  ining <= 2) {..*
65f0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53  alert = SSL_R_SS
6600: 4c 56 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41  LV3_ALERT_ILLEGA
6610: 4c 5f 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65  L_PARAMETER;..re
6620: 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f  turn SSL_CLIENT_
6630: 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20  HELLO_ERROR;.   
6640: 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
6650: 63 74 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ct the length of
6660: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6c 69   the supplied li
6670: 73 74 20 6f 66 20 6e 61 6d 65 73 2e 20 2a 2f 0a  st of names. */.
6680: 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70 2b 2b      len = (*(p++
6690: 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c 65 6e  ) << 8);.    len
66a0: 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20 20 20   += *(p++);.    
66b0: 69 66 20 28 6c 65 6e 20 2b 20 32 20 21 3d 20 72  if (len + 2 != r
66c0: 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61 6c  emaining) {..*al
66d0: 65 72 74 20 3d 20 53 53 4c 5f 52 5f 53 53 4c 56  ert = SSL_R_SSLV
66e0: 33 5f 41 4c 45 52 54 5f 49 4c 4c 45 47 41 4c 5f  3_ALERT_ILLEGAL_
66f0: 50 41 52 41 4d 45 54 45 52 3b 0a 09 72 65 74 75  PARAMETER;..retu
6700: 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45  rn SSL_CLIENT_HE
6710: 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  LLO_ERROR;.    }
6720: 0a 20 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d  .    remaining =
6730: 20 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 54 68   len;..    /* Th
6740: 65 20 6c 69 73 74 20 69 6e 20 70 72 61 63 74 69  e list in practi
6750: 63 65 20 6f 6e 6c 79 20 68 61 73 20 61 20 73 69  ce only has a si
6760: 6e 67 6c 65 20 65 6c 65 6d 65 6e 74 2c 20 73 6f  ngle element, so
6770: 20 77 65 20 6f 6e 6c 79 20 63 6f 6e 73 69 64 65   we only conside
6780: 72 20 74 68 65 20 66 69 72 73 74 20 6f 6e 65 2e  r the first one.
6790: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 6d 61   */.    if (rema
67a0: 69 6e 69 6e 67 20 3d 3d 20 30 20 7c 7c 20 2a 70  ining == 0 || *p
67b0: 2b 2b 20 21 3d 20 54 4c 53 45 58 54 5f 4e 41 4d  ++ != TLSEXT_NAM
67c0: 45 54 59 50 45 5f 68 6f 73 74 5f 6e 61 6d 65 29  ETYPE_host_name)
67d0: 20 7b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c   {..*alert = SSL
67e0: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
67f0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09  NTERNAL_ERROR;..
6800: 72 65 74 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e  return SSL_CLIEN
6810: 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20  T_HELLO_ERROR;. 
6820: 20 20 20 7d 0a 20 20 20 20 72 65 6d 61 69 6e 69     }.    remaini
6830: 6e 67 2d 2d 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f  ng--;..    /* No
6840: 77 20 77 65 20 63 61 6e 20 66 69 6e 61 6c 6c 79  w we can finally
6850: 20 70 75 6c 6c 20 6f 75 74 20 74 68 65 20 62 79   pull out the by
6860: 74 65 20 61 72 72 61 79 20 77 69 74 68 20 74 68  te array with th
6870: 65 20 61 63 74 75 61 6c 20 68 6f 73 74 6e 61 6d  e actual hostnam
6880: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65  e. */.    if (re
6890: 6d 61 69 6e 69 6e 67 20 3c 3d 20 32 29 20 7b 0a  maining <= 2) {.
68a0: 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f  .*alert = SSL_R_
68b0: 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45  TLSV1_ALERT_INTE
68c0: 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74  RNAL_ERROR;..ret
68d0: 75 72 6e 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48  urn SSL_CLIENT_H
68e0: 45 4c 4c 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20  ELLO_ERROR;.    
68f0: 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 28 2a 28 70  }.    len = (*(p
6900: 2b 2b 29 20 3c 3c 20 38 29 3b 0a 20 20 20 20 6c  ++) << 8);.    l
6910: 65 6e 20 2b 3d 20 2a 28 70 2b 2b 29 3b 0a 20 20  en += *(p++);.  
6920: 20 20 69 66 20 28 6c 65 6e 20 2b 20 32 20 3e 20    if (len + 2 > 
6930: 72 65 6d 61 69 6e 69 6e 67 29 20 7b 0a 09 2a 61  remaining) {..*a
6940: 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c 53  lert = SSL_R_TLS
6950: 56 31 5f 41 4c 45 52 54 5f 49 4e 54 45 52 4e 41  V1_ALERT_INTERNA
6960: 4c 5f 45 52 52 4f 52 3b 0a 09 72 65 74 75 72 6e  L_ERROR;..return
6970: 20 53 53 4c 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c   SSL_CLIENT_HELL
6980: 4f 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  O_ERROR;.    }. 
6990: 20 20 20 72 65 6d 61 69 6e 69 6e 67 20 3d 20 6c     remaining = l
69a0: 65 6e 3b 0a 20 20 20 20 73 65 72 76 65 72 6e 61  en;.    serverna
69b0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
69c0: 20 2a 29 70 3b 0a 0a 20 20 20 20 2f 2a 20 43 72   *)p;..    /* Cr
69d0: 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20  eate command to 
69e0: 65 76 61 6c 20 77 69 74 68 20 66 6e 2c 20 63 68  eval with fn, ch
69f0: 61 6e 2c 20 61 6e 64 20 73 65 72 76 65 72 20 6e  an, and server n
6a00: 61 6d 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 20  ame args */.    
6a10: 63 6d 64 50 74 72 20 3d 20 54 63 6c 5f 44 75 70  cmdPtr = Tcl_Dup
6a20: 6c 69 63 61 74 65 4f 62 6a 28 73 74 61 74 65 50  licateObj(stateP
6a30: 74 72 2d 3e 76 63 6d 64 29 3b 0a 20 20 20 20 54  tr->vcmd);.    T
6a40: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
6a50: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
6a60: 63 6d 64 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53  cmdPtr, Tcl_NewS
6a70: 74 72 69 6e 67 4f 62 6a 28 22 68 65 6c 6c 6f 22  tringObj("hello"
6a80: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
6a90: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
6aa0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 63 6d 64  ment(interp, cmd
6ab0: 50 74 72 2c 0a 09 20 20 20 20 54 63 6c 5f 4e 65  Ptr,..    Tcl_Ne
6ac0: 77 53 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 47  wStringObj(Tcl_G
6ad0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
6ae0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 2d  atePtr->self), -
6af0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
6b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
6b10: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 50 74 72  t(interp, cmdPtr
6b20: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
6b30: 62 6a 28 73 65 72 76 65 72 6e 61 6d 65 2c 20 28  bj(servername, (
6b40: 54 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 29 29 3b  Tcl_Size) len));
6b50: 0a 0a 20 20 20 20 2f 2a 20 45 76 61 6c 20 63 61  ..    /* Eval ca
6b60: 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e 64 20 2a  llback command *
6b70: 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  /.    Tcl_IncrRe
6b80: 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 29 3b 0a  fCount(cmdPtr);.
6b90: 20 20 20 20 69 66 20 28 28 63 6f 64 65 20 3d 20      if ((code = 
6ba0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 69 6e 74  EvalCallback(int
6bb0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 63  erp, statePtr, c
6bc0: 6d 64 50 74 72 29 29 20 3e 20 31 29 20 7b 0a 09  mdPtr)) > 1) {..
6bd0: 72 65 73 20 3d 20 53 53 4c 5f 43 4c 49 45 4e 54  res = SSL_CLIENT
6be0: 5f 48 45 4c 4c 4f 5f 52 45 54 52 59 3b 0a 09 2a  _HELLO_RETRY;..*
6bf0: 61 6c 65 72 74 20 3d 20 53 53 4c 5f 52 5f 54 4c  alert = SSL_R_TL
6c00: 53 56 31 5f 41 4c 45 52 54 5f 55 53 45 52 5f 43  SV1_ALERT_USER_C
6c10: 41 4e 43 45 4c 4c 45 44 3b 0a 20 20 20 20 7d 20  ANCELLED;.    } 
6c20: 65 6c 73 65 20 69 66 20 28 63 6f 64 65 20 3d 3d  else if (code ==
6c30: 20 31 29 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c   1) {..res = SSL
6c40: 5f 43 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 53 55  _CLIENT_HELLO_SU
6c50: 43 43 45 53 53 3b 0a 20 20 20 20 7d 20 65 6c 73  CCESS;.    } els
6c60: 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 43  e {..res = SSL_C
6c70: 4c 49 45 4e 54 5f 48 45 4c 4c 4f 5f 45 52 52 4f  LIENT_HELLO_ERRO
6c80: 52 3b 0a 09 2a 61 6c 65 72 74 20 3d 20 53 53 4c  R;..*alert = SSL
6c90: 5f 52 5f 54 4c 53 56 31 5f 41 4c 45 52 54 5f 49  _R_TLSV1_ALERT_I
6ca0: 4e 54 45 52 4e 41 4c 5f 45 52 52 4f 52 3b 0a 20  NTERNAL_ERROR;. 
6cb0: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63     }.    Tcl_Dec
6cc0: 72 52 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72  rRefCount(cmdPtr
6cd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65  );.    return re
6ce0: 73 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  s;.}.../********
6cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 2f 2a  ************/./*
6d00: 20 43 6f 6d 6d 61 6e 64 73 20 20 20 20 20 20 20   Commands       
6d10: 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a    */./**********
6d20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
6d30: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
6d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6d70: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 69 70 68  -----. *. * Ciph
6d80: 65 72 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73  ersObjCmd -- lis
6d90: 74 20 61 76 61 69 6c 61 62 6c 65 20 63 69 70 68  t available ciph
6da0: 65 72 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ers. *. *.This p
6db0: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
6dc0: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
6dd0: 68 65 20 22 74 6c 73 3a 3a 63 69 70 68 65 72 73  he "tls::ciphers
6de0: 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74 6f 20  " command. *.to 
6df0: 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65 20 63  list available c
6e00: 69 70 68 65 72 73 2c 20 62 61 73 65 64 20 75 70  iphers, based up
6e10: 6f 6e 20 70 72 6f 74 6f 63 6f 6c 20 73 65 6c 65  on protocol sele
6e20: 63 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  cted.. *. * Resu
6e30: 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
6e40: 72 64 20 54 63 6c 20 72 65 73 75 6c 74 20 6c 69  rd Tcl result li
6e50: 73 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  st.. *. * Side e
6e60: 66 66 65 63 74 73 3a 0a 20 2a 09 63 6f 6e 73 74  ffects:. *.const
6e70: 72 75 63 74 73 20 61 6e 64 20 64 65 73 74 72 6f  ructs and destro
6e80: 79 73 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 28  ys SSL context (
6e90: 43 54 58 29 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  CTX). *. *------
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
6ee0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  /.static const c
6ef0: 68 61 72 20 2a 70 72 6f 74 6f 63 6f 6c 73 5b 5d  har *protocols[]
6f00: 20 3d 20 7b 0a 09 22 73 73 6c 32 22 2c 20 22 73   = {.."ssl2", "s
6f10: 73 6c 33 22 2c 20 22 74 6c 73 31 22 2c 20 22 74  sl3", "tls1", "t
6f20: 6c 73 31 2e 31 22 2c 20 22 74 6c 73 31 2e 32 22  ls1.1", "tls1.2"
6f30: 2c 20 22 74 6c 73 31 2e 33 22 2c 20 4e 55 4c 4c  , "tls1.3", NULL
6f40: 0a 7d 3b 0a 65 6e 75 6d 20 70 72 6f 74 6f 63 6f  .};.enum protoco
6f50: 6c 20 7b 0a 20 20 20 20 54 4c 53 5f 53 53 4c 32  l {.    TLS_SSL2
6f60: 2c 20 54 4c 53 5f 53 53 4c 33 2c 20 54 4c 53 5f  , TLS_SSL3, TLS_
6f70: 54 4c 53 31 2c 20 54 4c 53 5f 54 4c 53 31 5f 31  TLS1, TLS_TLS1_1
6f80: 2c 20 54 4c 53 5f 54 4c 53 31 5f 32 2c 20 54 4c  , TLS_TLS1_2, TL
6f90: 53 5f 54 4c 53 31 5f 33 2c 20 54 4c 53 5f 4e 4f  S_TLS1_3, TLS_NO
6fa0: 4e 45 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 69 6e  NE.};..static in
6fb0: 74 0a 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 28  t.CiphersObjCmd(
6fc0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6fd0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72  tData, Tcl_Inter
6fe0: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
6ff0: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  bjc, Tcl_Obj *co
7000: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20  nst objv[]) {.  
7010: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
7020: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 53  r = NULL;.    SS
7030: 4c 5f 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c  L_CTX *ctx = NUL
7040: 4c 3b 0a 20 20 20 20 53 53 4c 20 2a 73 73 6c 20  L;.    SSL *ssl 
7050: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 53 54 41 43  = NULL;.    STAC
7060: 4b 5f 4f 46 28 53 53 4c 5f 43 49 50 48 45 52 29  K_OF(SSL_CIPHER)
7070: 20 2a 73 6b 3b 0a 20 20 20 20 63 68 61 72 20 62   *sk;.    char b
7080: 75 66 5b 42 55 46 53 49 5a 5d 3b 0a 20 20 20 20  uf[BUFSIZ];.    
7090: 69 6e 74 20 69 6e 64 65 78 2c 20 76 65 72 62 6f  int index, verbo
70a0: 73 65 20 3d 20 30 2c 20 75 73 65 5f 73 75 70 70  se = 0, use_supp
70b0: 6f 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 63  orted = 0;.    c
70c0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
70d0: 2a 6d 65 74 68 6f 64 3b 0a 20 20 20 20 28 76 6f  *method;.    (vo
70e0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a  id) clientData;.
70f0: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
7100: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20  lled");..    if 
7110: 28 28 6f 62 6a 63 20 3c 20 32 29 20 7c 7c 20 28  ((objc < 2) || (
7120: 6f 62 6a 63 20 3e 20 34 29 29 20 7b 0a 09 54 63  objc > 4)) {..Tc
7130: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
7140: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
7150: 22 70 72 6f 74 6f 63 6f 6c 20 3f 76 65 72 62 6f  "protocol ?verbo
7160: 73 65 3f 20 3f 73 75 70 70 6f 72 74 65 64 3f 22  se? ?supported?"
7170: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
7180: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
7190: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78  if (Tcl_GetIndex
71a0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
71b0: 6f 62 6a 76 5b 31 5d 2c 20 70 72 6f 74 6f 63 6f  objv[1], protoco
71c0: 6c 73 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  ls, "protocol", 
71d0: 30 2c 20 26 69 6e 64 65 78 29 20 21 3d 20 54 43  0, &index) != TC
71e0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
71f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
7200: 0a 20 20 20 20 69 66 20 28 28 6f 62 6a 63 20 3e  .    if ((objc >
7210: 20 32 29 20 26 26 20 54 63 6c 5f 47 65 74 42 6f   2) && Tcl_GetBo
7220: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
7230: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
7240: 65 72 62 6f 73 65 29 20 21 3d 20 54 43 4c 5f 4f  erbose) != TCL_O
7250: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  K) {..return TCL
7260: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
7270: 20 20 69 66 20 28 28 6f 62 6a 63 20 3e 20 33 29    if ((objc > 3)
7280: 20 26 26 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65   && Tcl_GetBoole
7290: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
72a0: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 75 73 65 5f  , objv[3], &use_
72b0: 73 75 70 70 6f 72 74 65 64 29 20 21 3d 20 54 43  supported) != TC
72c0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
72d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
72e0: 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f  ..    ERR_clear_
72f0: 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 73 77  error();..    sw
7300: 69 74 63 68 20 28 28 65 6e 75 6d 20 70 72 6f 74  itch ((enum prot
7310: 6f 63 6f 6c 29 69 6e 64 65 78 29 20 7b 0a 09 63  ocol)index) {..c
7320: 61 73 65 20 54 4c 53 5f 53 53 4c 32 3a 0a 23 69  ase TLS_SSL2:.#i
7330: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
7340: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
7350: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
7360: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
7370: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
7380: 4f 5f 53 53 4c 32 29 0a 09 20 20 20 20 54 63 6c  O_SSL2)..    Tcl
7390: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
73a0: 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c 73 5b  terp, protocols[
73b0: 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f 74 6f  index], ": proto
73c0: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
73d0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
73e0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  L);..    return 
73f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65  TCL_ERROR;.#else
7400: 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 53  ..    method = S
7410: 53 4c 76 32 5f 6d 65 74 68 6f 64 28 29 3b 20 62  SLv2_method(); b
7420: 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09 63 61  reak;.#endif..ca
7430: 73 65 20 54 4c 53 5f 53 53 4c 33 3a 0a 23 69 66  se TLS_SSL3:.#if
7440: 20 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53 4c 33   defined(NO_SSL3
7450: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50 45  ) || defined(OPE
7460: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29 20 7c 7c  NSSL_NO_SSL3) ||
7470: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
7480: 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54 48 4f 44 29  _NO_SSL3_METHOD)
7490: 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ..    Tcl_Append
74a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
74b0: 72 6f 74 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c  rotocols[index],
74c0: 20 22 3a 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74   ": protocol not
74d0: 20 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68   supported", (ch
74e0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
74f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7500: 4f 52 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d  OR;.#else..    m
7510: 65 74 68 6f 64 20 3d 20 53 53 4c 76 33 5f 6d 65  ethod = SSLv3_me
7520: 74 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23  thod(); break;.#
7530: 65 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f  endif..case TLS_
7540: 54 4c 53 31 3a 0a 23 69 66 20 64 65 66 69 6e 65  TLS1:.#if define
7550: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
7560: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7570: 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66 69 6e 65  _TLS1) || define
7580: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
7590: 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20 54  1_METHOD)..    T
75a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
75b0: 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f 6c  interp, protocol
75c0: 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72 6f  s[index], ": pro
75d0: 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72  tocol not suppor
75e0: 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ted", (char *) N
75f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
7600: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c  n TCL_ERROR;.#el
7610: 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20 3d  se..    method =
7620: 20 54 4c 53 76 31 5f 6d 65 74 68 6f 64 28 29 3b   TLSv1_method();
7630: 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 09   break;.#endif..
7640: 63 61 73 65 20 54 4c 53 5f 54 4c 53 31 5f 31 3a  case TLS_TLS1_1:
7650: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f  .#if defined(NO_
7660: 54 4c 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e  TLS1_1) || defin
7670: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
7680: 53 31 5f 31 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_1) || defined
7690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
76a0: 5f 31 5f 4d 45 54 48 4f 44 29 0a 09 20 20 20 20  _1_METHOD)..    
76b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
76c0: 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63 6f  (interp, protoco
76d0: 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70 72  ls[index], ": pr
76e0: 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f  otocol not suppo
76f0: 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29 20  rted", (char *) 
7700: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75  NULL);..    retu
7710: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
7720: 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64 20  lse..    method 
7730: 3d 20 54 4c 53 76 31 5f 31 5f 6d 65 74 68 6f 64  = TLSv1_1_method
7740: 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69  (); break;.#endi
7750: 66 0a 09 63 61 73 65 20 54 4c 53 5f 54 4c 53 31  f..case TLS_TLS1
7760: 5f 32 3a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  _2:.#if defined(
7770: 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65  NO_TLS1_2) || de
7780: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
7790: 5f 54 4c 53 31 5f 32 29 20 7c 7c 20 64 65 66 69  _TLS1_2) || defi
77a0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
77b0: 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 09 20  LS1_2_METHOD).. 
77c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
77d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74  ult(interp, prot
77e0: 6f 63 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a  ocols[index], ":
77f0: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
7800: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
7810: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
7820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7830: 0a 23 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68  .#else..    meth
7840: 6f 64 20 3d 20 54 4c 53 76 31 5f 32 5f 6d 65 74  od = TLSv1_2_met
7850: 68 6f 64 28 29 3b 20 62 72 65 61 6b 3b 0a 23 65  hod(); break;.#e
7860: 6e 64 69 66 0a 09 63 61 73 65 20 54 4c 53 5f 54  ndif..case TLS_T
7870: 4c 53 31 5f 33 3a 0a 23 69 66 20 64 65 66 69 6e  LS1_3:.#if defin
7880: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
7890: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
78a0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 09 20 20 20  _NO_TLS1_3)..   
78b0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
78c0: 74 28 69 6e 74 65 72 70 2c 20 70 72 6f 74 6f 63  t(interp, protoc
78d0: 6f 6c 73 5b 69 6e 64 65 78 5d 2c 20 22 3a 20 70  ols[index], ": p
78e0: 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75 70 70  rotocol not supp
78f0: 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20 2a 29  orted", (char *)
7900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74   NULL);..    ret
7910: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
7920: 65 6c 73 65 0a 09 20 20 20 20 6d 65 74 68 6f 64  else..    method
7930: 20 3d 20 54 4c 53 5f 6d 65 74 68 6f 64 28 29 3b   = TLS_method();
7940: 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  ..    SSL_CTX_se
7950: 74 5f 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73  t_min_proto_vers
7960: 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f  ion(ctx, TLS1_3_
7970: 56 45 52 53 49 4f 4e 29 3b 0a 09 20 20 20 20 53  VERSION);..    S
7980: 53 4c 5f 43 54 58 5f 73 65 74 5f 6d 61 78 5f 70  SL_CTX_set_max_p
7990: 72 6f 74 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78  roto_version(ctx
79a0: 2c 20 54 4c 53 31 5f 33 5f 56 45 52 53 49 4f 4e  , TLS1_3_VERSION
79b0: 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 23  );..    break;.#
79c0: 65 6e 64 69 66 0a 09 64 65 66 61 75 6c 74 3a 0a  endif..default:.
79d0: 09 20 20 20 20 6d 65 74 68 6f 64 20 3d 20 54 4c  .    method = TL
79e0: 53 5f 6d 65 74 68 6f 64 28 29 3b 0a 09 20 20 20  S_method();..   
79f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
7a00: 20 20 20 63 74 78 20 3d 20 53 53 4c 5f 43 54 58     ctx = SSL_CTX
7a10: 5f 6e 65 77 28 6d 65 74 68 6f 64 29 3b 0a 20 20  _new(method);.  
7a20: 20 20 69 66 20 28 63 74 78 20 3d 3d 20 4e 55 4c    if (ctx == NUL
7a30: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
7a40: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 47  Result(interp, G
7a50: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
7a60: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
7a70: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
7a80: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
7a90: 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28 63 74 78  sl = SSL_new(ctx
7aa0: 29 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 3d  );.    if (ssl =
7ab0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
7ac0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
7ad0: 72 70 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53  rp, GET_ERR_REAS
7ae0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
7af0: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
7b00: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
7b10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
7b20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 73 65 20 6c   }..    /* Use l
7b30: 69 73 74 20 61 6e 64 20 6f 72 64 65 72 20 61 73  ist and order as
7b40: 20 77 6f 75 6c 64 20 62 65 20 73 65 6e 74 20 69   would be sent i
7b50: 6e 20 61 20 43 6c 69 65 6e 74 48 65 6c 6c 6f 20  n a ClientHello 
7b60: 6f 72 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65  or all available
7b70: 20 63 69 70 68 65 72 73 20 2a 2f 0a 20 20 20 20   ciphers */.    
7b80: 69 66 20 28 75 73 65 5f 73 75 70 70 6f 72 74 65  if (use_supporte
7b90: 64 29 20 7b 0a 09 73 6b 20 3d 20 53 53 4c 5f 67  d) {..sk = SSL_g
7ba0: 65 74 31 5f 73 75 70 70 6f 72 74 65 64 5f 63 69  et1_supported_ci
7bb0: 70 68 65 72 73 28 73 73 6c 29 3b 0a 20 20 20 20  phers(ssl);.    
7bc0: 7d 20 65 6c 73 65 20 7b 0a 09 73 6b 20 3d 20 53  } else {..sk = S
7bd0: 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 73 28 73  SL_get_ciphers(s
7be0: 73 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  sl);.    }..    
7bf0: 69 66 20 28 73 6b 20 21 3d 20 4e 55 4c 4c 29 20  if (sk != NULL) 
7c00: 7b 0a 09 69 66 20 28 21 76 65 72 62 6f 73 65 29  {..if (!verbose)
7c10: 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20 63 68   {..    const ch
7c20: 61 72 20 2a 63 70 3b 0a 09 20 20 20 20 6f 62 6a  ar *cp;..    obj
7c30: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73  Ptr = Tcl_NewLis
7c40: 74 4f 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09  tObj(0, NULL);..
7c50: 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d      for (int i =
7c60: 20 30 3b 20 69 20 3c 20 73 6b 5f 53 53 4c 5f 43   0; i < sk_SSL_C
7c70: 49 50 48 45 52 5f 6e 75 6d 28 73 6b 29 3b 20 69  IPHER_num(sk); i
7c80: 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73 74 20 53 53  ++) {...const SS
7c90: 4c 5f 43 49 50 48 45 52 20 2a 63 20 3d 20 73 6b  L_CIPHER *c = sk
7ca0: 5f 53 53 4c 5f 43 49 50 48 45 52 5f 76 61 6c 75  _SSL_CIPHER_valu
7cb0: 65 28 73 6b 2c 20 69 29 3b 0a 09 09 69 66 20 28  e(sk, i);...if (
7cc0: 63 20 3d 3d 20 4e 55 4c 4c 29 20 63 6f 6e 74 69  c == NULL) conti
7cd0: 6e 75 65 3b 0a 0a 09 09 2f 2a 20 63 69 70 68 65  nue;..../* ciphe
7ce0: 72 20 6e 61 6d 65 20 6f 72 20 28 4e 4f 4e 45 29  r name or (NONE)
7cf0: 20 2a 2f 0a 09 09 63 70 20 3d 20 53 53 4c 5f 43   */...cp = SSL_C
7d00: 49 50 48 45 52 5f 67 65 74 5f 6e 61 6d 65 28 63  IPHER_get_name(c
7d10: 29 3b 0a 09 09 69 66 20 28 63 70 20 3d 3d 20 4e  );...if (cp == N
7d20: 55 4c 4c 29 20 62 72 65 61 6b 3b 0a 09 09 54 63  ULL) break;...Tc
7d30: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
7d40: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f  lement(interp, o
7d50: 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74  bjPtr, Tcl_NewSt
7d60: 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a 29  ringObj((char *)
7d70: 20 63 70 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20   cp, -1));..    
7d80: 7d 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  }...} else {..  
7d90: 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f 4e    objPtr = Tcl_N
7da0: 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 22 2c 30  ewStringObj("",0
7db0: 29 3b 0a 09 20 20 20 20 66 6f 72 20 28 69 6e 74  );..    for (int
7dc0: 20 69 20 3d 20 30 3b 20 69 20 3c 20 73 6b 5f 53   i = 0; i < sk_S
7dd0: 53 4c 5f 43 49 50 48 45 52 5f 6e 75 6d 28 73 6b  SL_CIPHER_num(sk
7de0: 29 3b 20 69 2b 2b 29 20 7b 0a 09 09 63 6f 6e 73  ); i++) {...cons
7df0: 74 20 53 53 4c 5f 43 49 50 48 45 52 20 2a 63 20  t SSL_CIPHER *c 
7e00: 3d 20 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f  = sk_SSL_CIPHER_
7e10: 76 61 6c 75 65 28 73 6b 2c 20 69 29 3b 0a 09 09  value(sk, i);...
7e20: 69 66 20 28 63 20 3d 3d 20 4e 55 4c 4c 29 20 63  if (c == NULL) c
7e30: 6f 6e 74 69 6e 75 65 3b 0a 0a 09 09 2f 2a 20 74  ontinue;..../* t
7e40: 65 78 74 75 61 6c 20 64 65 73 63 72 69 70 74 69  extual descripti
7e50: 6f 6e 20 6f 66 20 74 68 65 20 63 69 70 68 65 72  on of the cipher
7e60: 20 2a 2f 0a 09 09 69 66 20 28 53 53 4c 5f 43 49   */...if (SSL_CI
7e70: 50 48 45 52 5f 64 65 73 63 72 69 70 74 69 6f 6e  PHER_description
7e80: 28 63 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28  (c, buf, sizeof(
7e90: 62 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b  buf)) != NULL) {
7ea0: 0a 09 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ...    Tcl_Appen
7eb0: 64 54 6f 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 62  dToObj(objPtr, b
7ec0: 75 66 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 73  uf, (Tcl_Size) s
7ed0: 74 72 6c 65 6e 28 62 75 66 29 29 3b 0a 09 09 7d  trlen(buf));...}
7ee0: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 54 63   else {...    Tc
7ef0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 6f 62  l_AppendToObj(ob
7f00: 6a 50 74 72 2c 20 22 55 4e 4b 4e 4f 57 4e 5c 6e  jPtr, "UNKNOWN\n
7f10: 22 2c 20 38 29 3b 0a 09 09 7d 0a 09 20 20 20 20  ", 8);...}..    
7f20: 7d 0a 09 7d 0a 09 69 66 20 28 75 73 65 5f 73 75  }..}..if (use_su
7f30: 70 70 6f 72 74 65 64 29 20 7b 0a 09 20 20 20 20  pported) {..    
7f40: 73 6b 5f 53 53 4c 5f 43 49 50 48 45 52 5f 66 72  sk_SSL_CIPHER_fr
7f50: 65 65 28 73 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d  ee(sk);..}.    }
7f60: 0a 20 20 20 20 53 53 4c 5f 66 72 65 65 28 73 73  .    SSL_free(ss
7f70: 6c 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f  l);.    SSL_CTX_
7f80: 66 72 65 65 28 63 74 78 29 3b 0a 0a 20 20 20 20  free(ctx);..    
7f90: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
7fa0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
7fb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
7fc0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
7fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 0a 20 2a 0a 20 2a 20 50 72 6f 74 6f 63 6f 6c  -. *. * Protocol
8020: 73 4f 62 6a 43 6d 64 20 2d 2d 20 6c 69 73 74 20  sObjCmd -- list 
8030: 61 76 61 69 6c 61 62 6c 65 20 70 72 6f 74 6f 63  available protoc
8040: 6f 6c 73 0a 20 2a 0a 20 2a 09 54 68 69 73 20 70  ols. *. *.This p
8050: 72 6f 63 65 64 75 72 65 20 69 73 20 69 6e 76 6f  rocedure is invo
8060: 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74  ked to process t
8070: 68 65 20 22 74 6c 73 3a 3a 70 72 6f 74 6f 63 6f  he "tls::protoco
8080: 6c 73 22 20 63 6f 6d 6d 61 6e 64 0a 20 2a 09 74  ls" command. *.t
8090: 6f 20 6c 69 73 74 20 61 76 61 69 6c 61 62 6c 65  o list available
80a0: 20 70 72 6f 74 6f 63 6f 6c 73 2e 0a 20 2a 0a 20   protocols.. *. 
80b0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
80c0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73  standard Tcl res
80d0: 75 6c 74 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 20  ult list.. *. * 
80e0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
80f0: 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  .none. *. *-----
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
8140: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 50 72  */.static int.Pr
8150: 6f 74 6f 63 6f 6c 73 4f 62 6a 43 6d 64 28 43 6c  otocolsObjCmd(Cl
8160: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
8170: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
8180: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
8190: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
81a0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
81b0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b  Tcl_Obj *objPtr;
81c0: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65  .    (void) clie
81d0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64 70 72  ntData;..    dpr
81e0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a  intf("Called");.
81f0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d  .    if (objc !=
8200: 20 31 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67   1) {..Tcl_Wrong
8210: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
8220: 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 09 72  1, objv, "");..r
8230: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8240: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
8250: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
8260: 20 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c      objPtr = Tcl
8270: 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e  _NewListObj(0, N
8280: 55 4c 4c 29 3b 0a 0a 23 69 66 20 4f 50 45 4e 53  ULL);..#if OPENS
8290: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
82a0: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
82b0: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
82c0: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
82d0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
82e0: 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ).    Tcl_ListOb
82f0: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
8300: 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54  nterp, objPtr, T
8310: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
8320: 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 53 53  protocols[TLS_SS
8330: 4c 32 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69  L2], -1));.#endi
8340: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
8350: 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66 69  O_SSL3) && !defi
8360: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53  ned(OPENSSL_NO_S
8370: 53 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL3) && !defined
8380: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33  (OPENSSL_NO_SSL3
8390: 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20 54 63 6c  _METHOD).    Tcl
83a0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
83b0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  ement(interp, ob
83c0: 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  jPtr, Tcl_NewStr
83d0: 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63 6f 6c 73  ingObj(protocols
83e0: 5b 54 4c 53 5f 53 53 4c 33 5d 2c 20 2d 31 29 29  [TLS_SSL3], -1))
83f0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21 64 65  ;.#endif.#if !de
8400: 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 29 20 26  fined(NO_TLS1) &
8410: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
8420: 53 4c 5f 4e 4f 5f 54 4c 53 31 29 20 26 26 20 21  SL_NO_TLS1) && !
8430: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
8440: 4e 4f 5f 54 4c 53 31 5f 4d 45 54 48 4f 44 29 0a  NO_TLS1_METHOD).
8450: 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
8460: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
8470: 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c  erp, objPtr, Tcl
8480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 72  _NewStringObj(pr
8490: 6f 74 6f 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31  otocols[TLS_TLS1
84a0: 5d 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a  ], -1));.#endif.
84b0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f  #if !defined(NO_
84c0: 54 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69  TLS1_1) && !defi
84d0: 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54  ned(OPENSSL_NO_T
84e0: 4c 53 31 5f 31 29 20 26 26 20 21 64 65 66 69 6e  LS1_1) && !defin
84f0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
8500: 53 31 5f 31 5f 4d 45 54 48 4f 44 29 0a 20 20 20  S1_1_METHOD).   
8510: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
8520: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
8530: 2c 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65  , objPtr, Tcl_Ne
8540: 77 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f  wStringObj(proto
8550: 63 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 31 5d  cols[TLS_TLS1_1]
8560: 2c 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23  , -1));.#endif.#
8570: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
8580: 4c 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e  LS1_2) && !defin
8590: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
85a0: 53 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65  S1_2) && !define
85b0: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
85c0: 31 5f 32 5f 4d 45 54 48 4f 44 29 0a 20 20 20 20  1_2_METHOD).    
85d0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
85e0: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
85f0: 20 6f 62 6a 50 74 72 2c 20 54 63 6c 5f 4e 65 77   objPtr, Tcl_New
8600: 53 74 72 69 6e 67 4f 62 6a 28 70 72 6f 74 6f 63  StringObj(protoc
8610: 6f 6c 73 5b 54 4c 53 5f 54 4c 53 31 5f 32 5d 2c  ols[TLS_TLS1_2],
8620: 20 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69   -1));.#endif.#i
8630: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  f !defined(NO_TL
8640: 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e 65  S1_3) && !define
8650: 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53  d(OPENSSL_NO_TLS
8660: 31 5f 33 29 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1_3).    Tcl_Lis
8670: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
8680: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  t(interp, objPtr
8690: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
86a0: 62 6a 28 70 72 6f 74 6f 63 6f 6c 73 5b 54 4c 53  bj(protocols[TLS
86b0: 5f 54 4c 53 31 5f 33 5d 2c 20 2d 31 29 29 3b 0a  _TLS1_3], -1));.
86c0: 23 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f  #endif..    Tcl_
86d0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
86e0: 65 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20  erp, objPtr);.  
86f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8700: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
8750: 0a 20 2a 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a  . * HandshakeObj
8760: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
8770: 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
8780: 64 20 74 6f 20 76 65 72 69 66 79 20 77 68 65 74  d to verify whet
8790: 68 65 72 20 74 68 65 20 68 61 6e 64 73 68 61 6b  her the handshak
87a0: 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 0a 20 2a  e is complete. *
87b0: 09 6f 72 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52  .or not.. *. * R
87c0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
87d0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
87e0: 2e 20 31 20 6d 65 61 6e 73 20 68 61 6e 64 73 68  . 1 means handsh
87f0: 61 6b 65 20 63 6f 6d 70 6c 65 74 65 2c 20 30 20  ake complete, 0 
8800: 6d 65 61 6e 73 20 70 65 6e 64 69 6e 67 2e 0a 20  means pending.. 
8810: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
8820: 73 3a 0a 20 2a 09 4d 61 79 20 66 6f 72 63 65 20  s:. *.May force 
8830: 53 53 4c 20 6e 65 67 6f 74 69 61 74 69 6f 6e 20  SSL negotiation 
8840: 74 6f 20 74 61 6b 65 20 70 6c 61 63 65 2e 0a 20  to take place.. 
8850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8890: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
88a0: 69 63 20 69 6e 74 20 48 61 6e 64 73 68 61 6b 65  ic int Handshake
88b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74  ObjCmd(ClientDat
88c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
88d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
88e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
88f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
8900: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61  ]) {.    Tcl_Cha
8910: 6e 6e 65 6c 20 63 68 61 6e 3b 20 20 20 20 20 20  nnel chan;      
8920: 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c    /* The channel
8930: 20 74 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f   to set a mode o
8940: 6e 2e 20 2a 2f 0a 20 20 20 20 53 74 61 74 65 20  n. */.    State 
8950: 2a 73 74 61 74 65 50 74 72 3b 20 20 20 20 20 20  *statePtr;      
8960: 20 20 2f 2a 20 63 6c 69 65 6e 74 20 73 74 61 74    /* client stat
8970: 65 20 66 6f 72 20 73 73 6c 20 73 6f 63 6b 65 74  e for ssl socket
8980: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
8990: 61 72 20 2a 65 72 72 53 74 72 20 3d 20 4e 55 4c  ar *errStr = NUL
89a0: 4c 3b 0a 20 20 20 20 69 6e 74 20 72 65 74 20 3d  L;.    int ret =
89b0: 20 31 3b 0a 20 20 20 20 69 6e 74 20 65 72 72 20   1;.    int err 
89c0: 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  = 0;.    (void) 
89d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20  clientData;..   
89e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
89f0: 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a  ");..    if (obj
8a00: 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57  c != 2) {..Tcl_W
8a10: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
8a20: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68  rp, 1, objv, "ch
8a30: 61 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e  annel");..return
8a40: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
8a50: 7d 0a 0a 20 20 20 20 45 52 52 5f 63 6c 65 61 72  }..    ERR_clear
8a60: 5f 65 72 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63  _error();..    c
8a70: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  han = Tcl_GetCha
8a80: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c  nnel(interp, Tcl
8a90: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
8aa0: 31 5d 29 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  1]), NULL);.    
8ab0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c  if (chan == (Tcl
8ac0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20  _Channel) NULL) 
8ad0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
8ae0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
8af0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20  /* Make sure to 
8b00: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74  operate on the t
8b10: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a  opmost channel *
8b20: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c  /.    chan = Tcl
8b30: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63  _GetTopChannel(c
8b40: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 54 63  han);.    if (Tc
8b50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65  l_GetChannelType
8b60: 28 63 68 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68  (chan) != Tls_Ch
8b70: 61 6e 6e 65 6c 54 79 70 65 28 29 29 20 7b 0a 09  annelType()) {..
8b80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8b90: 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68  (interp, "bad ch
8ba0: 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47  annel \"", Tcl_G
8bb0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68  etChannelName(ch
8bc0: 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e  an),..    "\": n
8bd0: 6f 74 20 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c  ot a TLS channel
8be0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
8bf0: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72  );..Tcl_SetError
8c00: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c  Code(interp, "TL
8c10: 53 22 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c  S", "HANDSHAKE",
8c20: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56   "CHANNEL", "INV
8c30: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20  ALID", (char *) 
8c40: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54  NULL);..return T
8c50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
8c60: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
8c70: 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
8c80: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
8c90: 74 61 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 64  ta(chan);..    d
8ca0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 69 6e 67 20  printf("Calling 
8cb0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8cc0: 63 74 22 29 3b 0a 20 20 20 20 72 65 74 20 3d 20  ct");.    ret = 
8cd0: 54 6c 73 5f 57 61 69 74 46 6f 72 43 6f 6e 6e 65  Tls_WaitForConne
8ce0: 63 74 28 73 74 61 74 65 50 74 72 2c 20 26 65 72  ct(statePtr, &er
8cf0: 72 2c 20 31 29 3b 0a 20 20 20 20 64 70 72 69 6e  r, 1);.    dprin
8d00: 74 66 28 22 54 6c 73 5f 57 61 69 74 46 6f 72 43  tf("Tls_WaitForC
8d10: 6f 6e 6e 65 63 74 20 72 65 74 75 72 6e 65 64 3a  onnect returned:
8d20: 20 25 69 22 2c 20 72 65 74 29 3b 0a 0a 20 20 20   %i", ret);..   
8d30: 20 69 66 20 28 72 65 74 20 3c 20 30 20 26 26 20   if (ret < 0 && 
8d40: 28 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67  ((statePtr->flag
8d50: 73 20 26 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e  s & TLS_TCL_ASYN
8d60: 43 29 20 26 26 20 28 65 72 72 20 3d 3d 20 45 41  C) && (err == EA
8d70: 47 41 49 4e 29 29 29 20 7b 0a 09 64 70 72 69 6e  GAIN))) {..dprin
8d80: 74 66 28 22 41 73 79 6e 63 20 73 65 74 20 61 6e  tf("Async set an
8d90: 64 20 65 72 72 20 3d 20 45 41 47 41 49 4e 22 29  d err = EAGAIN")
8da0: 3b 0a 09 72 65 74 20 3d 20 30 3b 0a 20 20 20 20  ;..ret = 0;.    
8db0: 7d 20 65 6c 73 65 20 69 66 20 28 72 65 74 20 3c  } else if (ret <
8dc0: 20 30 29 20 7b 0a 09 6c 6f 6e 67 20 72 65 73 75   0) {..long resu
8dd0: 6c 74 3b 0a 09 65 72 72 53 74 72 20 3d 20 73 74  lt;..errStr = st
8de0: 61 74 65 50 74 72 2d 3e 65 72 72 3b 0a 09 54 63  atePtr->err;..Tc
8df0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
8e00: 74 65 72 70 29 3b 0a 09 54 63 6c 5f 53 65 74 45  terp);..Tcl_SetE
8e10: 72 72 6e 6f 28 65 72 72 29 3b 0a 0a 09 69 66 20  rrno(err);...if 
8e20: 28 21 65 72 72 53 74 72 20 7c 7c 20 28 2a 65 72  (!errStr || (*er
8e30: 72 53 74 72 20 3d 3d 20 30 29 29 20 7b 0a 09 20  rStr == 0)) {.. 
8e40: 20 20 20 65 72 72 53 74 72 20 3d 20 54 63 6c 5f     errStr = Tcl_
8e50: 50 6f 73 69 78 45 72 72 6f 72 28 69 6e 74 65 72  PosixError(inter
8e60: 70 29 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 41 70 70  p);..}...Tcl_App
8e70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8e80: 2c 20 22 68 61 6e 64 73 68 61 6b 65 20 66 61 69  , "handshake fai
8e90: 6c 65 64 3a 20 22 2c 20 65 72 72 53 74 72 2c 20  led: ", errStr, 
8ea0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
8eb0: 09 69 66 20 28 28 72 65 73 75 6c 74 20 3d 20 53  .if ((result = S
8ec0: 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f 72 65  SL_get_verify_re
8ed0: 73 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 73  sult(statePtr->s
8ee0: 73 6c 29 29 20 21 3d 20 58 35 30 39 5f 56 5f 4f  sl)) != X509_V_O
8ef0: 4b 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70  K) {..    Tcl_Ap
8f00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
8f10: 70 2c 20 22 20 64 75 65 20 74 6f 20 5c 22 22 2c  p, " due to \"",
8f20: 20 58 35 30 39 5f 76 65 72 69 66 79 5f 63 65 72   X509_verify_cer
8f30: 74 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67 28 72  t_error_string(r
8f40: 65 73 75 6c 74 29 2c 20 22 5c 22 22 2c 20 28 63  esult), "\"", (c
8f50: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d  har *) NULL);..}
8f60: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f  ..Tcl_SetErrorCo
8f70: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22  de(interp, "TLS"
8f80: 2c 20 22 48 41 4e 44 53 48 41 4b 45 22 2c 20 22  , "HANDSHAKE", "
8f90: 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20 2a  FAILED", (char *
8fa0: 29 20 4e 55 4c 4c 29 3b 0a 09 64 70 72 69 6e 74  ) NULL);..dprint
8fb0: 66 28 22 52 65 74 75 72 6e 69 6e 67 20 54 43 4c  f("Returning TCL
8fc0: 5f 45 52 52 4f 52 20 77 69 74 68 20 68 61 6e 64  _ERROR with hand
8fd0: 73 68 61 6b 65 20 66 61 69 6c 65 64 3a 20 25 73  shake failed: %s
8fe0: 22 2c 20 65 72 72 53 74 72 29 3b 0a 09 72 65 74  ", errStr);..ret
8ff0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9000: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20     } else {..if 
9010: 28 65 72 72 20 21 3d 20 30 29 20 7b 0a 09 20 20  (err != 0) {..  
9020: 20 20 64 70 72 69 6e 74 66 28 22 47 6f 74 20 61    dprintf("Got a
9030: 6e 20 65 72 72 6f 72 20 77 69 74 68 20 61 20 63  n error with a c
9040: 6f 6d 70 6c 65 74 65 64 20 68 61 6e 64 73 68 61  ompleted handsha
9050: 6b 65 3a 20 65 72 72 20 3d 20 25 69 22 2c 20 65  ke: err = %i", e
9060: 72 72 29 3b 0a 09 7d 0a 09 72 65 74 20 3d 20 31  rr);..}..ret = 1
9070: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 70 72  ;.    }..    dpr
9080: 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20  intf("Returning 
9090: 54 43 4c 5f 4f 4b 20 77 69 74 68 20 64 61 74 61  TCL_OK with data
90a0: 20 5c 22 25 69 5c 22 22 2c 20 72 65 74 29 3b 0a   \"%i\"", ret);.
90b0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
90c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
90d0: 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 74 29 29  _NewIntObj(ret))
90e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
90f0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d  _OK;.}../*. *---
9100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 0a 20 2a 0a 20 2a 20 49 6d 70 6f 72 74 4f 62 6a  . *. * ImportObj
9150: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
9160: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
9170: 6e 76 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73  nvoked to proces
9180: 73 20 74 68 65 20 22 73 73 6c 22 20 63 6f 6d 6d  s the "ssl" comm
9190: 61 6e 64 0a 20 2a 0a 20 2a 09 54 68 65 20 73 73  and. *. *.The ss
91a0: 6c 20 63 6f 6d 6d 61 6e 64 20 70 75 73 68 65 73  l command pushes
91b0: 20 53 53 4c 20 6f 76 65 72 20 61 20 28 6e 65 77   SSL over a (new
91c0: 6c 79 20 63 6f 6e 6e 65 63 74 65 64 29 20 74 63  ly connected) tc
91d0: 70 20 73 6f 63 6b 65 74 0a 20 2a 0a 20 2a 20 52  p socket. *. * R
91e0: 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
91f0: 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
9200: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
9210: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 6d 6f 64  ects:. *.May mod
9220: 69 66 79 20 74 68 65 20 62 65 68 61 76 69 6f 72  ify the behavior
9230: 20 6f 66 20 61 6e 20 49 4f 20 63 68 61 6e 6e 65   of an IO channe
9240: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  l.. *. *--------
9250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
9290: 73 74 61 74 69 63 20 69 6e 74 0a 49 6d 70 6f 72  static int.Impor
92a0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61  tObjCmd(ClientDa
92b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
92c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
92d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
92e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
92f0: 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68  []) {.    Tcl_Ch
9300: 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09 2f 2a 20  annel chan;../* 
9310: 54 68 65 20 63 68 61 6e 6e 65 6c 20 74 6f 20 73  The channel to s
9320: 65 74 20 61 20 6d 6f 64 65 20 6f 6e 2e 20 2a 2f  et a mode on. */
9330: 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74 61 74  .    State *stat
9340: 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65 6e 74  ePtr;../* client
9350: 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c 20 73   state for ssl s
9360: 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 53 53 4c  ocket */.    SSL
9370: 5f 43 54 58 20 2a 63 74 78 09 09 3d 20 4e 55 4c  _CTX *ctx..= NUL
9380: 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
9390: 73 63 72 69 70 74 09 09 3d 20 4e 55 4c 4c 3b 0a  script..= NULL;.
93a0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 61 73      Tcl_Obj *pas
93b0: 73 77 6f 72 64 09 09 3d 20 4e 55 4c 4c 3b 0a 20  sword..= NULL;. 
93c0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76 63 6d 64     Tcl_Obj *vcmd
93d0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
93e0: 6c 5f 44 53 74 72 69 6e 67 20 75 70 70 65 72 43  l_DString upperC
93f0: 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f  hannelTranslatio
9400: 6e 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  n, upperChannelB
9410: 6c 6f 63 6b 69 6e 67 2c 20 75 70 70 65 72 43 68  locking, upperCh
9420: 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 2c 20 75  annelEncoding, u
9430: 70 70 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68  pperChannelEOFCh
9440: 61 72 3b 0a 20 20 20 20 69 6e 74 20 69 64 78 3b  ar;.    int idx;
9450: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65  .    Tcl_Size le
9460: 6e 3b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73  n;.    int flags
9470: 09 09 09 3d 20 54 4c 53 5f 54 43 4c 5f 49 4e 49  ...= TLS_TCL_INI
9480: 54 3b 0a 20 20 20 20 69 6e 74 20 73 65 72 76 65  T;.    int serve
9490: 72 09 09 09 3d 20 30 3b 09 2f 2a 20 69 73 20 63  r...= 0;./* is c
94a0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 63 6f 6d 69  onnection incomi
94b0: 6e 67 20 6f 72 20 6f 75 74 67 6f 69 6e 67 3f 20  ng or outgoing? 
94c0: 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 6b 65 79  */.    char *key
94d0: 66 69 6c 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20  file..= NULL;.  
94e0: 20 20 63 68 61 72 20 2a 63 65 72 74 66 69 6c 65    char *certfile
94f0: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e  ..= NULL;.    un
9500: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79  signed char *key
9510: 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63  ..= NULL;.    Tc
9520: 6c 5f 53 69 7a 65 20 6b 65 79 5f 6c 65 6e 09 09  l_Size key_len..
9530: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  = 0;.    unsigne
9540: 64 20 63 68 61 72 20 2a 63 65 72 74 09 09 3d 20  d char *cert..= 
9550: 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69  NULL;.    Tcl_Si
9560: 7a 65 20 63 65 72 74 5f 6c 65 6e 09 09 3d 20 30  ze cert_len..= 0
9570: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 69 70 68  ;.    char *ciph
9580: 65 72 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  ers..= NULL;.   
9590: 20 63 68 61 72 20 2a 63 69 70 68 65 72 73 75 69   char *ciphersui
95a0: 74 65 73 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20  tes..= NULL;.   
95b0: 20 63 68 61 72 20 2a 43 41 66 69 6c 65 09 09 3d   char *CAfile..=
95c0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20   NULL;.    char 
95d0: 2a 43 41 70 61 74 68 09 09 3d 20 4e 55 4c 4c 3b  *CApath..= NULL;
95e0: 0a 20 20 20 20 63 68 61 72 20 2a 43 41 73 74 6f  .    char *CAsto
95f0: 72 65 09 09 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  re..= NULL;.    
9600: 63 68 61 72 20 2a 44 48 70 61 72 61 6d 73 09 09  char *DHparams..
9610: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72  = NULL;.    char
9620: 20 2a 6d 6f 64 65 6c 09 09 09 3d 20 4e 55 4c 4c   *model...= NULL
9630: 3b 0a 20 20 20 20 63 68 61 72 20 2a 73 65 72 76  ;.    char *serv
9640: 65 72 6e 61 6d 65 09 09 3d 20 4e 55 4c 4c 3b 09  ername..= NULL;.
9650: 2f 2a 20 68 6f 73 74 6e 61 6d 65 20 66 6f 72 20  /* hostname for 
9660: 53 65 72 76 65 72 20 4e 61 6d 65 20 49 6e 64 69  Server Name Indi
9670: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 63 68  cation */.    ch
9680: 61 72 20 2a 73 65 73 73 69 6f 6e 5f 69 64 09 09  ar *session_id..
9690: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f  = NULL;.    Tcl_
96a0: 4f 62 6a 20 2a 61 6c 70 6e 09 09 3d 20 4e 55 4c  Obj *alpn..= NUL
96b0: 4c 3b 0a 20 20 20 20 69 6e 74 20 73 73 6c 32 20  L;.    int ssl2 
96c0: 3d 20 30 2c 20 73 73 6c 33 20 3d 20 30 3b 0a 20  = 0, ssl3 = 0;. 
96d0: 20 20 20 69 6e 74 20 74 6c 73 31 20 3d 20 31 2c     int tls1 = 1,
96e0: 20 74 6c 73 31 5f 31 20 3d 20 31 2c 20 74 6c 73   tls1_1 = 1, tls
96f0: 31 5f 32 20 3d 20 31 2c 20 74 6c 73 31 5f 33 20  1_2 = 1, tls1_3 
9700: 3d 20 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f  = 1;.    int pro
9710: 74 6f 20 3d 20 30 2c 20 6c 65 76 65 6c 20 3d 20  to = 0, level = 
9720: 2d 31 3b 0a 20 20 20 20 69 6e 74 20 76 65 72 69  -1;.    int veri
9730: 66 79 20 3d 20 30 2c 20 72 65 71 75 69 72 65 20  fy = 0, require 
9740: 3d 20 30 2c 20 72 65 71 75 65 73 74 20 3d 20 31  = 0, request = 1
9750: 2c 20 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65  , post_handshake
9760: 20 3d 20 30 3b 0a 20 20 20 20 28 76 6f 69 64 29   = 0;.    (void)
9770: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20   clientData;..  
9780: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
9790: 64 22 29 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  d");..#if define
97a0: 64 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65  d(NO_TLS1) || de
97b0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
97c0: 5f 54 4c 53 31 29 0a 20 20 20 20 74 6c 73 31 20  _TLS1).    tls1 
97d0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
97e0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
97f0: 31 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 50  1) || defined(OP
9800: 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31 29  ENSSL_NO_TLS1_1)
9810: 0a 20 20 20 20 74 6c 73 31 5f 31 20 3d 20 30 3b  .    tls1_1 = 0;
9820: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
9830: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 32 29 20 7c  ned(NO_TLS1_2) |
9840: 7c 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53  | defined(OPENSS
9850: 4c 5f 4e 4f 5f 54 4c 53 31 5f 32 29 0a 20 20 20  L_NO_TLS1_2).   
9860: 20 74 6c 73 31 5f 32 20 3d 20 30 3b 0a 23 65 6e   tls1_2 = 0;.#en
9870: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
9880: 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c 20 64 65  NO_TLS1_3) || de
9890: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
98a0: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 74 6c 73  _TLS1_3).    tls
98b0: 31 5f 33 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  1_3 = 0;.#endif.
98c0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
98d0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  2) {..Tcl_WrongN
98e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
98f0: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c  , objv, "channel
9900: 20 3f 6f 70 74 69 6f 6e 73 3f 22 29 3b 0a 09 72   ?options?");..r
9910: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 45 52 52 5f  .    }..    ERR_
9930: 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b 0a 0a  clear_error();..
9940: 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47      chan = Tcl_G
9950: 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70  etChannel(interp
9960: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
9970: 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 3b  objv[1]), NULL);
9980: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d  .    if (chan ==
9990: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e   (Tcl_Channel) N
99a0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54  ULL) {..return T
99b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
99c0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
99d0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20  e to operate on 
99e0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e  the topmost chan
99f0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20  nel */.    chan 
9a00: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e  = Tcl_GetTopChan
9a10: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20  nel(chan);..    
9a20: 66 6f 72 20 28 69 64 78 20 3d 20 32 3b 20 69 64  for (idx = 2; id
9a30: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29  x < objc; idx++)
9a40: 20 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20   {..char *opt = 
9a50: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
9a60: 6a 76 5b 69 64 78 5d 29 3b 0a 0a 09 69 66 20 28  jv[idx]);...if (
9a70: 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 0a 09  opt[0] != '-')..
9a80: 20 20 20 20 62 72 65 61 6b 3b 0a 0a 09 4f 50 54      break;...OPT
9a90: 4f 42 4a 28 22 2d 61 6c 70 6e 22 2c 20 61 6c 70  OBJ("-alpn", alp
9aa0: 6e 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 61  n);..OPTSTR("-ca
9ab0: 64 69 72 22 2c 20 43 41 70 61 74 68 29 3b 0a 09  dir", CApath);..
9ac0: 4f 50 54 53 54 52 28 22 2d 63 61 66 69 6c 65 22  OPTSTR("-cafile"
9ad0: 2c 20 43 41 66 69 6c 65 29 3b 0a 09 4f 50 54 53  , CAfile);..OPTS
9ae0: 54 52 28 22 2d 63 61 73 74 6f 72 65 22 2c 20 43  TR("-castore", C
9af0: 41 73 74 6f 72 65 29 3b 0a 09 4f 50 54 42 59 54  Astore);..OPTBYT
9b00: 45 28 22 2d 63 65 72 74 22 2c 20 63 65 72 74 2c  E("-cert", cert,
9b10: 20 63 65 72 74 5f 6c 65 6e 29 3b 0a 09 4f 50 54   cert_len);..OPT
9b20: 53 54 52 28 22 2d 63 65 72 74 66 69 6c 65 22 2c  STR("-certfile",
9b30: 20 63 65 72 74 66 69 6c 65 29 3b 0a 09 4f 50 54   certfile);..OPT
9b40: 53 54 52 28 22 2d 63 69 70 68 65 72 22 2c 20 63  STR("-cipher", c
9b50: 69 70 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52  iphers);..OPTSTR
9b60: 28 22 2d 63 69 70 68 65 72 73 22 2c 20 63 69 70  ("-ciphers", cip
9b70: 68 65 72 73 29 3b 0a 09 4f 50 54 53 54 52 28 22  hers);..OPTSTR("
9b80: 2d 63 69 70 68 65 72 73 75 69 74 65 73 22 2c 20  -ciphersuites", 
9b90: 63 69 70 68 65 72 73 75 69 74 65 73 29 3b 0a 09  ciphersuites);..
9ba0: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64  OPTOBJ("-command
9bb0: 22 2c 20 73 63 72 69 70 74 29 3b 0a 09 4f 50 54  ", script);..OPT
9bc0: 53 54 52 28 22 2d 64 68 70 61 72 61 6d 73 22 2c  STR("-dhparams",
9bd0: 20 44 48 70 61 72 61 6d 73 29 3b 0a 09 4f 50 54   DHparams);..OPT
9be0: 42 59 54 45 28 22 2d 6b 65 79 22 2c 20 6b 65 79  BYTE("-key", key
9bf0: 2c 20 6b 65 79 5f 6c 65 6e 29 3b 0a 09 4f 50 54  , key_len);..OPT
9c00: 53 54 52 28 22 2d 6b 65 79 66 69 6c 65 22 2c 20  STR("-keyfile", 
9c10: 6b 65 79 66 69 6c 65 29 3b 0a 09 4f 50 54 53 54  keyfile);..OPTST
9c20: 52 28 22 2d 6d 6f 64 65 6c 22 2c 20 6d 6f 64 65  R("-model", mode
9c30: 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 70 61  l);..OPTOBJ("-pa
9c40: 73 73 77 6f 72 64 22 2c 20 70 61 73 73 77 6f 72  ssword", passwor
9c50: 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 70  d);..OPTBOOL("-p
9c60: 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 22 2c 20  ost_handshake", 
9c70: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 29 3b  post_handshake);
9c80: 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75  ..OPTBOOL("-requ
9c90: 65 73 74 22 2c 20 72 65 71 75 65 73 74 29 3b 0a  est", request);.
9ca0: 09 4f 50 54 42 4f 4f 4c 28 22 2d 72 65 71 75 69  .OPTBOOL("-requi
9cb0: 72 65 22 2c 20 72 65 71 75 69 72 65 29 3b 0a 09  re", require);..
9cc0: 4f 50 54 49 4e 54 28 22 2d 73 65 63 75 72 69 74  OPTINT("-securit
9cd0: 79 5f 6c 65 76 65 6c 22 2c 20 6c 65 76 65 6c 29  y_level", level)
9ce0: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 65 72  ;..OPTBOOL("-ser
9cf0: 76 65 72 22 2c 20 73 65 72 76 65 72 29 3b 0a 09  ver", server);..
9d00: 4f 50 54 53 54 52 28 22 2d 73 65 72 76 65 72 6e  OPTSTR("-servern
9d10: 61 6d 65 22 2c 20 73 65 72 76 65 72 6e 61 6d 65  ame", servername
9d20: 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 73 65 73  );..OPTSTR("-ses
9d30: 73 69 6f 6e 5f 69 64 22 2c 20 73 65 73 73 69 6f  sion_id", sessio
9d40: 6e 5f 69 64 29 3b 0a 09 4f 50 54 42 4f 4f 4c 28  n_id);..OPTBOOL(
9d50: 22 2d 73 73 6c 32 22 2c 20 73 73 6c 32 29 3b 0a  "-ssl2", ssl2);.
9d60: 09 4f 50 54 42 4f 4f 4c 28 22 2d 73 73 6c 33 22  .OPTBOOL("-ssl3"
9d70: 2c 20 73 73 6c 33 29 3b 0a 09 4f 50 54 42 4f 4f  , ssl3);..OPTBOO
9d80: 4c 28 22 2d 74 6c 73 31 22 2c 20 74 6c 73 31 29  L("-tls1", tls1)
9d90: 3b 0a 09 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73  ;..OPTBOOL("-tls
9da0: 31 2e 31 22 2c 20 74 6c 73 31 5f 31 29 3b 0a 09  1.1", tls1_1);..
9db0: 4f 50 54 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 32  OPTBOOL("-tls1.2
9dc0: 22 2c 20 74 6c 73 31 5f 32 29 3b 0a 09 4f 50 54  ", tls1_2);..OPT
9dd0: 42 4f 4f 4c 28 22 2d 74 6c 73 31 2e 33 22 2c 20  BOOL("-tls1.3", 
9de0: 74 6c 73 31 5f 33 29 3b 0a 09 4f 50 54 4f 42 4a  tls1_3);..OPTOBJ
9df0: 28 22 2d 76 61 6c 69 64 61 74 65 63 6f 6d 6d 61  ("-validatecomma
9e00: 6e 64 22 2c 20 76 63 6d 64 29 3b 0a 09 4f 50 54  nd", vcmd);..OPT
9e10: 4f 42 4a 28 22 2d 76 63 6d 64 22 2c 20 76 63 6d  OBJ("-vcmd", vcm
9e20: 64 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70  d);...OPTBAD("op
9e30: 74 69 6f 6e 22 2c 20 22 2d 61 6c 70 6e 2c 20 2d  tion", "-alpn, -
9e40: 63 61 64 69 72 2c 20 2d 63 61 66 69 6c 65 2c 20  cadir, -cafile, 
9e50: 2d 63 61 73 74 6f 72 65 2c 20 2d 63 65 72 74 2c  -castore, -cert,
9e60: 20 2d 63 65 72 74 66 69 6c 65 2c 20 2d 63 69 70   -certfile, -cip
9e70: 68 65 72 2c 20 2d 63 69 70 68 65 72 73 75 69 74  her, -ciphersuit
9e80: 65 73 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64  es, -command, -d
9e90: 68 70 61 72 61 6d 73 2c 20 2d 6b 65 79 2c 20 2d  hparams, -key, -
9ea0: 6b 65 79 66 69 6c 65 2c 20 2d 6d 6f 64 65 6c 2c  keyfile, -model,
9eb0: 20 2d 70 61 73 73 77 6f 72 64 2c 20 2d 70 6f 73   -password, -pos
9ec0: 74 5f 68 61 6e 64 73 68 61 6b 65 2c 20 2d 72 65  t_handshake, -re
9ed0: 71 75 65 73 74 2c 20 2d 72 65 71 75 69 72 65 2c  quest, -require,
9ee0: 20 2d 73 65 63 75 72 69 74 79 5f 6c 65 76 65 6c   -security_level
9ef0: 2c 20 2d 73 65 72 76 65 72 2c 20 2d 73 65 72 76  , -server, -serv
9f00: 65 72 6e 61 6d 65 2c 20 2d 73 65 73 73 69 6f 6e  ername, -session
9f10: 5f 69 64 2c 20 2d 73 73 6c 32 2c 20 2d 73 73 6c  _id, -ssl2, -ssl
9f20: 33 2c 20 2d 74 6c 73 31 2c 20 2d 74 6c 73 31 2e  3, -tls1, -tls1.
9f30: 31 2c 20 2d 74 6c 73 31 2e 32 2c 20 2d 74 6c 73  1, -tls1.2, -tls
9f40: 31 2e 33 2c 20 6f 72 20 2d 76 61 6c 69 64 61 74  1.3, or -validat
9f50: 65 63 6f 6d 6d 61 6e 64 22 29 3b 0a 0a 09 72 65  ecommand");...re
9f60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9f70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 72 65      }.    if (re
9f80: 71 75 65 73 74 29 09 09 76 65 72 69 66 79 20 7c  quest)..verify |
9f90: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  = SSL_VERIFY_CLI
9fa0: 45 4e 54 5f 4f 4e 43 45 20 7c 20 53 53 4c 5f 56  ENT_ONCE | SSL_V
9fb0: 45 52 49 46 59 5f 50 45 45 52 3b 0a 20 20 20 20  ERIFY_PEER;.    
9fc0: 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20 72  if (request && r
9fd0: 65 71 75 69 72 65 29 09 76 65 72 69 66 79 20 7c  equire).verify |
9fe0: 3d 20 53 53 4c 5f 56 45 52 49 46 59 5f 46 41 49  = SSL_VERIFY_FAI
9ff0: 4c 5f 49 46 5f 4e 4f 5f 50 45 45 52 5f 43 45 52  L_IF_NO_PEER_CER
a000: 54 3b 0a 20 20 20 20 69 66 20 28 72 65 71 75 65  T;.    if (reque
a010: 73 74 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73  st && post_hands
a020: 68 61 6b 65 29 09 76 65 72 69 66 79 20 7c 3d 20  hake).verify |= 
a030: 53 53 4c 5f 56 45 52 49 46 59 5f 50 4f 53 54 5f  SSL_VERIFY_POST_
a040: 48 41 4e 44 53 48 41 4b 45 3b 0a 20 20 20 20 69  HANDSHAKE;.    i
a050: 66 20 28 76 65 72 69 66 79 20 3d 3d 20 30 29 09  f (verify == 0).
a060: 09 76 65 72 69 66 79 20 3d 20 53 53 4c 5f 56 45  .verify = SSL_VE
a070: 52 49 46 59 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20  RIFY_NONE;..    
a080: 70 72 6f 74 6f 20 7c 3d 20 28 73 73 6c 32 20 3f  proto |= (ssl2 ?
a090: 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 20   TLS_PROTO_SSL2 
a0a0: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a0b0: 7c 3d 20 28 73 73 6c 33 20 3f 20 54 4c 53 5f 50  |= (ssl3 ? TLS_P
a0c0: 52 4f 54 4f 5f 53 53 4c 33 20 3a 20 30 29 3b 0a  ROTO_SSL3 : 0);.
a0d0: 20 20 20 20 70 72 6f 74 6f 20 7c 3d 20 28 74 6c      proto |= (tl
a0e0: 73 31 20 3f 20 54 4c 53 5f 50 52 4f 54 4f 5f 54  s1 ? TLS_PROTO_T
a0f0: 4c 53 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72  LS1 : 0);.    pr
a100: 6f 74 6f 20 7c 3d 20 28 74 6c 73 31 5f 31 20 3f  oto |= (tls1_1 ?
a110: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f   TLS_PROTO_TLS1_
a120: 31 20 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74  1 : 0);.    prot
a130: 6f 20 7c 3d 20 28 74 6c 73 31 5f 32 20 3f 20 54  o |= (tls1_2 ? T
a140: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 20  LS_PROTO_TLS1_2 
a150: 3a 20 30 29 3b 0a 20 20 20 20 70 72 6f 74 6f 20  : 0);.    proto 
a160: 7c 3d 20 28 74 6c 73 31 5f 33 20 3f 20 54 4c 53  |= (tls1_3 ? TLS
a170: 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 20 3a 20  _PROTO_TLS1_3 : 
a180: 30 29 3b 0a 0a 20 20 20 20 2f 2a 20 72 65 73 65  0);..    /* rese
a190: 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 62 6c 61  t to NULL if bla
a1a0: 6e 6b 20 73 74 72 69 6e 67 20 70 72 6f 76 69 64  nk string provid
a1b0: 65 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 65  ed */.    if (ce
a1c0: 72 74 20 26 26 20 21 2a 63 65 72 74 29 09 09 20  rt && !*cert).. 
a1d0: 20 20 20 20 20 20 20 63 65 72 74 09 20 20 20 20         cert.    
a1e0: 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20      = NULL;.    
a1f0: 69 66 20 28 6b 65 79 20 26 26 20 21 2a 6b 65 79  if (key && !*key
a200: 29 09 09 20 20 20 20 20 20 20 20 6b 65 79 09 20  )..        key. 
a210: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a220: 20 20 20 69 66 20 28 63 65 72 74 66 69 6c 65 20     if (certfile 
a230: 26 26 20 21 2a 63 65 72 74 66 69 6c 65 29 20 20  && !*certfile)  
a240: 20 20 20 20 20 20 20 63 65 72 74 66 69 6c 65 09         certfile.
a250: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a260: 6b 65 79 66 69 6c 65 20 26 26 20 21 2a 6b 65 79  keyfile && !*key
a270: 66 69 6c 65 29 09 09 6b 65 79 66 69 6c 65 09 20  file)..keyfile. 
a280: 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20         = NULL;. 
a290: 20 20 20 69 66 20 28 63 69 70 68 65 72 73 20 26     if (ciphers &
a2a0: 26 20 21 2a 63 69 70 68 65 72 73 29 09 20 20 20  & !*ciphers).   
a2b0: 20 20 20 20 20 63 69 70 68 65 72 73 09 20 20 20       ciphers.   
a2c0: 20 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20       = NULL;.   
a2d0: 20 69 66 20 28 63 69 70 68 65 72 73 75 69 74 65   if (ciphersuite
a2e0: 73 20 26 26 20 21 2a 63 69 70 68 65 72 73 75 69  s && !*ciphersui
a2f0: 74 65 73 29 20 63 69 70 68 65 72 73 75 69 74 65  tes) ciphersuite
a300: 73 20 20 20 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  s    = NULL;.   
a310: 20 69 66 20 28 43 41 66 69 6c 65 20 26 26 20 21   if (CAfile && !
a320: 2a 43 41 66 69 6c 65 29 09 20 20 20 20 20 20 20  *CAfile).       
a330: 20 43 41 66 69 6c 65 09 20 20 20 20 20 20 20 20   CAfile.        
a340: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 66 20 28  = NULL;.    if (
a350: 43 41 70 61 74 68 20 26 26 20 21 2a 43 41 70 61  CApath && !*CApa
a360: 74 68 29 09 20 20 20 20 20 20 20 20 43 41 70 61  th).        CApa
a370: 74 68 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c  th.        = NUL
a380: 4c 3b 0a 20 20 20 20 69 66 20 28 43 41 73 74 6f  L;.    if (CAsto
a390: 72 65 20 26 26 20 21 2a 43 41 73 74 6f 72 65 29  re && !*CAstore)
a3a0: 09 20 20 20 20 20 20 20 20 43 41 73 74 6f 72 65  .        CAstore
a3b0: 09 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  .        = NULL;
a3c0: 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61 6d  .    if (DHparam
a3d0: 73 20 26 26 20 21 2a 44 48 70 61 72 61 6d 73 29  s && !*DHparams)
a3e0: 09 20 20 20 20 20 20 20 20 44 48 70 61 72 61 6d  .        DHparam
a3f0: 73 20 20 20 20 20 20 20 20 3d 20 4e 55 4c 4c 3b  s        = NULL;
a400: 0a 0a 20 20 20 20 2f 2a 20 6e 65 77 20 53 53 4c  ..    /* new SSL
a410: 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 73 74   state */.    st
a420: 61 74 65 50 74 72 09 09 3d 20 28 53 74 61 74 65  atePtr..= (State
a430: 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73   *) ckalloc((uns
a440: 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 53 74  igned) sizeof(St
a450: 61 74 65 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  ate));.    memse
a460: 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 73  t(statePtr, 0, s
a470: 69 7a 65 6f 66 28 53 74 61 74 65 29 29 3b 0a 0a  izeof(State));..
a480: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 66 6c      statePtr->fl
a490: 61 67 73 09 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags.= flags;.   
a4a0: 20 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72   statePtr->inter
a4b0: 70 09 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20  p.= interp;.    
a4c0: 73 74 61 74 65 50 74 72 2d 3e 76 66 6c 61 67 73  statePtr->vflags
a4d0: 09 3d 20 76 65 72 69 66 79 3b 0a 20 20 20 20 73  .= verify;.    s
a4e0: 74 61 74 65 50 74 72 2d 3e 65 72 72 09 3d 20 22  tatePtr->err.= "
a4f0: 22 3b 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63  ";..    /* alloc
a500: 61 74 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20  ate script */.  
a510: 20 20 69 66 20 28 73 63 72 69 70 74 29 20 7b 0a    if (script) {.
a520: 09 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53  .(void) Tcl_GetS
a530: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 63 72  tringFromObj(scr
a540: 69 70 74 2c 20 26 6c 65 6e 29 3b 0a 09 69 66 20  ipt, &len);..if 
a550: 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74 61  (len) {..    sta
a560: 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b 20  tePtr->callback 
a570: 3d 20 73 63 72 69 70 74 3b 0a 09 20 20 20 20 54  = script;..    T
a580: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a590: 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
a5a0: 63 6b 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  ck);..}.    }.. 
a5b0: 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 70     /* allocate p
a5c0: 61 73 73 77 6f 72 64 20 2a 2f 0a 20 20 20 20 69  assword */.    i
a5d0: 66 20 28 70 61 73 73 77 6f 72 64 29 20 7b 0a 09  f (password) {..
a5e0: 28 76 6f 69 64 29 20 54 63 6c 5f 47 65 74 53 74  (void) Tcl_GetSt
a5f0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 61 73 73  ringFromObj(pass
a600: 77 6f 72 64 2c 20 26 6c 65 6e 29 3b 0a 09 69 66  word, &len);..if
a610: 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20 20 73 74   (len) {..    st
a620: 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72 64  atePtr->password
a630: 20 3d 20 70 61 73 73 77 6f 72 64 3b 0a 09 20 20   = password;..  
a640: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
a650: 6e 74 28 73 74 61 74 65 50 74 72 2d 3e 70 61 73  nt(statePtr->pas
a660: 73 77 6f 72 64 29 3b 0a 09 7d 0a 20 20 20 20 7d  sword);..}.    }
a670: 0a 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  ..    /* allocat
a680: 65 20 76 61 6c 69 64 61 74 65 20 63 6f 6d 6d 61  e validate comma
a690: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 20 28 76 63  nd */.    if (vc
a6a0: 6d 64 29 20 7b 0a 09 28 76 6f 69 64 29 20 54 63  md) {..(void) Tc
a6b0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
a6c0: 62 6a 28 76 63 6d 64 2c 20 26 6c 65 6e 29 3b 0a  bj(vcmd, &len);.
a6d0: 09 69 66 20 28 6c 65 6e 29 20 7b 0a 09 20 20 20  .if (len) {..   
a6e0: 20 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64 20   statePtr->vcmd 
a6f0: 3d 20 76 63 6d 64 3b 0a 09 20 20 20 20 54 63 6c  = vcmd;..    Tcl
a700: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 74  _IncrRefCount(st
a710: 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 3b 0a 09  atePtr->vcmd);..
a720: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20  }.    }..    if 
a730: 28 6d 6f 64 65 6c 20 21 3d 20 4e 55 4c 4c 29 20  (model != NULL) 
a740: 7b 0a 09 69 6e 74 20 6d 6f 64 65 3b 0a 09 2f 2a  {..int mode;../*
a750: 20 47 65 74 20 74 68 65 20 22 6d 6f 64 65 6c 22   Get the "model"
a760: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 63 68 61   context */..cha
a770: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  n = Tcl_GetChann
a780: 65 6c 28 69 6e 74 65 72 70 2c 20 6d 6f 64 65 6c  el(interp, model
a790: 2c 20 26 6d 6f 64 65 29 3b 0a 09 69 66 20 28 63  , &mode);..if (c
a7a0: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e  han == (Tcl_Chan
a7b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 20 20  nel) NULL) {..  
a7c0: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
a7d0: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
a7e0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a7f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a800: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 61 6b 65 20  }.../*.. * Make 
a810: 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20  sure to operate 
a820: 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63  on the topmost c
a830: 68 61 6e 6e 65 6c 0a 09 20 2a 2f 0a 09 63 68 61  hannel.. */..cha
a840: 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68  n = Tcl_GetTopCh
a850: 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 09 69 66  annel(chan);..if
a860: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c   (Tcl_GetChannel
a870: 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 54 6c  Type(chan) != Tl
a880: 73 5f 43 68 61 6e 6e 65 6c 54 79 70 65 28 29 29  s_ChannelType())
a890: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65   {..    Tcl_Appe
a8a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a8b0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22   "bad channel \"
a8c0: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
a8d0: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22  lName(chan),..."
a8e0: 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63 68  \": not a TLS ch
a8f0: 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a 29  annel", (char *)
a900: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
a910: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
a920: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d  terp, "TLS", "IM
a930: 50 4f 52 54 22 2c 20 22 43 48 41 4e 4e 45 4c 22  PORT", "CHANNEL"
a940: 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68  , "INVALID", (ch
a950: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20  ar *) NULL);..  
a960: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
a970: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
a980: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
a990: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
a9a0: 7d 0a 09 63 74 78 20 3d 20 28 28 53 74 61 74 65  }..ctx = ((State
a9b0: 20 2a 29 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   *)Tcl_GetChanne
a9c0: 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68  lInstanceData(ch
a9d0: 61 6e 29 29 2d 3e 63 74 78 3b 0a 20 20 20 20 7d  an))->ctx;.    }
a9e0: 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 28 63 74   else {..if ((ct
a9f0: 78 20 3d 20 43 54 58 5f 49 6e 69 74 28 73 74 61  x = CTX_Init(sta
aa00: 74 65 50 74 72 2c 20 73 65 72 76 65 72 2c 20 70  tePtr, server, p
aa10: 72 6f 74 6f 2c 20 6b 65 79 66 69 6c 65 2c 20 63  roto, keyfile, c
aa20: 65 72 74 66 69 6c 65 2c 20 6b 65 79 2c 20 63 65  ertfile, key, ce
aa30: 72 74 2c 20 6b 65 79 5f 6c 65 6e 2c 0a 09 20 20  rt, key_len,..  
aa40: 20 20 63 65 72 74 5f 6c 65 6e 2c 20 43 41 70 61    cert_len, CApa
aa50: 74 68 2c 20 43 41 73 74 6f 72 65 2c 20 43 41 66  th, CAstore, CAf
aa60: 69 6c 65 2c 20 63 69 70 68 65 72 73 2c 20 63 69  ile, ciphers, ci
aa70: 70 68 65 72 73 75 69 74 65 73 2c 20 6c 65 76 65  phersuites, leve
aa80: 6c 2c 20 44 48 70 61 72 61 6d 73 29 29 20 3d 3d  l, DHparams)) ==
aa90: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 6c   NULL) {..    Tl
aaa0: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
aab0: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
aac0: 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  r);..    return 
aad0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20  TCL_ERROR;..}.  
aae0: 20 20 7d 0a 0a 20 20 20 20 73 74 61 74 65 50 74    }..    statePt
aaf0: 72 2d 3e 63 74 78 20 3d 20 63 74 78 3b 0a 0a 20  r->ctx = ctx;.. 
ab00: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65 20     /*.     * We 
ab10: 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  need to make sur
ab20: 65 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 6e  e that the chann
ab30: 65 6c 20 77 6f 72 6b 73 20 69 6e 20 62 69 6e 61  el works in bina
ab40: 72 79 20 28 66 6f 72 20 74 68 65 0a 20 20 20 20  ry (for the.    
ab50: 20 2a 20 65 6e 63 72 79 70 74 69 6f 6e 20 6e 6f   * encryption no
ab60: 74 20 74 6f 20 67 65 74 20 67 6f 6f 66 65 64 20  t to get goofed 
ab70: 75 70 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  up)..     */.   
ab80: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
ab90: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72  (&upperChannelTr
aba0: 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20  anslation);.    
abb0: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
abc0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
abd0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f  cking);.    Tcl_
abe0: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70  DStringInit(&upp
abf0: 65 72 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72  erChannelEOFChar
ac00: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
ac10: 6e 67 49 6e 69 74 28 26 75 70 70 65 72 43 68 61  ngInit(&upperCha
ac20: 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 20  nnelEncoding);. 
ac30: 20 20 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65     Tcl_GetChanne
ac40: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20  lOption(interp, 
ac50: 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68 61 72 22  chan, "-eofchar"
ac60: 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45  , &upperChannelE
ac70: 4f 46 43 68 61 72 29 3b 0a 20 20 20 20 54 63 6c  OFChar);.    Tcl
ac80: 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f  _GetChannelOptio
ac90: 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20  n(interp, chan, 
aca0: 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70  "-encoding", &up
acb0: 70 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69  perChannelEncodi
acc0: 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74  ng);.    Tcl_Get
acd0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
ace0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72  terp, chan, "-tr
acf0: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 26 75 70 70  anslation", &upp
ad00: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
ad10: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 47  tion);.    Tcl_G
ad20: 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28  etChannelOption(
ad30: 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d  interp, chan, "-
ad40: 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75 70 70 65  blocking", &uppe
ad50: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ad60: 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68  );.    Tcl_SetCh
ad70: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65  annelOption(inte
ad80: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e  rp, chan, "-tran
ad90: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72  slation", "binar
ada0: 79 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  y");.    Tcl_Set
adb0: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e  ChannelOption(in
adc0: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 62 6c  terp, chan, "-bl
add0: 6f 63 6b 69 6e 67 22 2c 20 22 74 72 75 65 22 29  ocking", "true")
ade0: 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ;.    dprintf("C
adf0: 6f 6e 73 75 6d 69 6e 67 20 54 63 6c 20 63 68 61  onsuming Tcl cha
ae00: 6e 6e 65 6c 20 25 73 22 2c 20 54 63 6c 5f 47 65  nnel %s", Tcl_Ge
ae10: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61  tChannelName(cha
ae20: 6e 29 29 3b 0a 20 20 20 20 73 74 61 74 65 50 74  n));.    statePt
ae30: 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74  r->self = Tcl_St
ae40: 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  ackChannel(inter
ae50: 70 2c 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  p, Tls_ChannelTy
ae60: 70 65 28 29 2c 20 28 43 6c 69 65 6e 74 44 61 74  pe(), (ClientDat
ae70: 61 29 20 73 74 61 74 65 50 74 72 2c 0a 09 28 54  a) statePtr,..(T
ae80: 43 4c 5f 52 45 41 44 41 42 4c 45 20 7c 20 54 43  CL_READABLE | TC
ae90: 4c 5f 57 52 49 54 41 42 4c 45 29 2c 20 63 68 61  L_WRITABLE), cha
aea0: 6e 29 3b 0a 20 20 20 20 64 70 72 69 6e 74 66 28  n);.    dprintf(
aeb0: 22 43 72 65 61 74 65 64 20 63 68 61 6e 6e 65 6c  "Created channel
aec0: 20 6e 61 6d 65 64 20 25 73 22 2c 20 54 63 6c 5f   named %s", Tcl_
aed0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73  GetChannelName(s
aee0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 29 3b  tatePtr->self));
aef0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74  .    if (statePt
af00: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f  r->self == (Tcl_
af10: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b  Channel) NULL) {
af20: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 75 73 65 20  ../*.. * No use 
af30: 6f 66 20 54 63 6c 5f 45 76 65 6e 74 75 61 6c 6c  of Tcl_Eventuall
af40: 79 46 72 65 65 20 62 65 63 61 75 73 65 20 6e 6f  yFree because no
af50: 20 70 6f 73 73 69 62 6c 65 20 54 63 6c 5f 50 72   possible Tcl_Pr
af60: 65 73 65 72 76 65 2e 0a 09 20 2a 2f 0a 09 54 6c  eserve... */..Tl
af70: 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65 65  s_Free((tls_free
af80: 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50 74  _type *) statePt
af90: 72 29 3b 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67  r);..Tcl_DString
afa0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
afb0: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a  elTranslation);.
afc0: 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65  .Tcl_DStringFree
afd0: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
afe0: 63 6f 64 69 6e 67 29 3b 0a 09 54 63 6c 5f 44 53  coding);..Tcl_DS
aff0: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
b000: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
b010: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
b020: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b030: 6c 6f 63 6b 69 6e 67 29 3b 0a 09 72 65 74 75 72  locking);..retur
b040: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
b050: 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74 43   }..    Tcl_SetC
b060: 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74  hannelOption(int
b070: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73  erp, statePtr->s
b080: 65 6c 66 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69  elf, "-translati
b090: 6f 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67  on", Tcl_DString
b0a0: 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e  Value(&upperChan
b0b0: 6e 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29  nelTranslation))
b0c0: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61  ;.    Tcl_SetCha
b0d0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
b0e0: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c  p, statePtr->sel
b0f0: 66 2c 20 22 2d 65 6e 63 6f 64 69 6e 67 22 2c 20  f, "-encoding", 
b100: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
b110: 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  (&upperChannelEn
b120: 63 6f 64 69 6e 67 29 29 3b 0a 20 20 20 20 54 63  coding));.    Tc
b130: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_SetChannelOpti
b140: 6f 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65  on(interp, state
b150: 50 74 72 2d 3e 73 65 6c 66 2c 20 22 2d 65 6f 66  Ptr->self, "-eof
b160: 63 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69  char", Tcl_DStri
b170: 6e 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68  ngValue(&upperCh
b180: 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a  annelEOFChar));.
b190: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e      Tcl_SetChann
b1a0: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c  elOption(interp,
b1b0: 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c   statePtr->self,
b1c0: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 54 63   "-blocking", Tc
b1d0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
b1e0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63  upperChannelBloc
b1f0: 6b 69 6e 67 29 29 3b 0a 20 20 20 20 54 63 6c 5f  king));.    Tcl_
b200: 44 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70  DStringFree(&upp
b210: 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61  erChannelTransla
b220: 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44  tion);.    Tcl_D
b230: 53 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65  StringFree(&uppe
b240: 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67  rChannelEncoding
b250: 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  );.    Tcl_DStri
b260: 6e 67 46 72 65 65 28 26 75 70 70 65 72 43 68 61  ngFree(&upperCha
b270: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20  nnelEOFChar);.  
b280: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
b290: 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42  e(&upperChannelB
b2a0: 6c 6f 63 6b 69 6e 67 29 3b 0a 0a 20 20 20 20 2f  locking);..    /
b2b0: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 49 6e 69  *.     * SSL Ini
b2c0: 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 20 20  tialization.    
b2d0: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72   */.    statePtr
b2e0: 2d 3e 73 73 6c 20 3d 20 53 53 4c 5f 6e 65 77 28  ->ssl = SSL_new(
b2f0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a  statePtr->ctx);.
b300: 20 20 20 20 69 66 20 28 21 73 74 61 74 65 50 74      if (!statePt
b310: 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f 2a 20 53 53  r->ssl) {../* SS
b320: 4c 20 6c 69 62 72 61 72 79 20 65 72 72 6f 72 20  L library error 
b330: 2a 2f 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  */..Tcl_AppendRe
b340: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
b350: 75 6c 64 6e 27 74 20 63 6f 6e 73 74 72 75 63 74  uldn't construct
b360: 20 73 73 6c 20 73 65 73 73 69 6f 6e 3a 20 22 2c   ssl session: ",
b370: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28   GET_ERR_REASON(
b380: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ), (char *) NULL
b390: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45  );..    Tcl_SetE
b3a0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
b3b0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
b3c0: 2c 20 22 49 4e 49 54 22 2c 20 22 46 41 49 4c 45  , "INIT", "FAILE
b3d0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
b3e0: 4c 29 3b 0a 09 54 6c 73 5f 46 72 65 65 28 28 74  L);..Tls_Free((t
b3f0: 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29 20  ls_free_type *) 
b400: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75  statePtr);..retu
b410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b420: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
b430: 68 6f 73 74 20 73 65 72 76 65 72 20 6e 61 6d 65  host server name
b440: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 65 72 76   */.    if (serv
b450: 65 72 6e 61 6d 65 29 20 7b 0a 09 2f 2a 20 53 65  ername) {../* Se
b460: 74 73 20 74 68 65 20 73 65 72 76 65 72 20 6e 61  ts the server na
b470: 6d 65 20 69 6e 64 69 63 61 74 69 6f 6e 20 28 53  me indication (S
b480: 4e 49 29 20 69 6e 20 43 6c 69 65 6e 74 48 65 6c  NI) in ClientHel
b490: 6c 6f 20 65 78 74 65 6e 73 69 6f 6e 20 2a 2f 0a  lo extension */.
b4a0: 09 2f 2a 20 50 65 72 20 52 46 43 20 36 30 36 36  ./* Per RFC 6066
b4b0: 2c 20 68 6f 73 74 6e 61 6d 65 20 69 73 20 61 20  , hostname is a 
b4c0: 41 53 43 49 49 20 65 6e 63 6f 64 65 64 20 73 74  ASCII encoded st
b4d0: 72 69 6e 67 2c 20 74 68 6f 75 67 68 20 52 46 43  ring, though RFC
b4e0: 20 34 33 36 36 20 73 61 79 73 20 55 54 46 2d 38   4366 says UTF-8
b4f0: 2e 20 2a 2f 0a 09 69 66 20 28 21 53 53 4c 5f 73  . */..if (!SSL_s
b500: 65 74 5f 74 6c 73 65 78 74 5f 68 6f 73 74 5f 6e  et_tlsext_host_n
b510: 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ame(statePtr->ss
b520: 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29 20 26  l, servername) &
b530: 26 20 72 65 71 75 69 72 65 29 20 7b 0a 09 20 20  & require) {..  
b540: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b550: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20  lt(interp, "Set 
b560: 53 4e 49 20 65 78 74 65 6e 73 69 6f 6e 20 66 61  SNI extension fa
b570: 69 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52  iled: ", GET_ERR
b580: 5f 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72  _REASON(), (char
b590: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b5a0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
b5b0: 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20  (interp, "TLS", 
b5c0: 22 49 4d 50 4f 52 54 22 2c 20 22 53 4e 49 22 2c  "IMPORT", "SNI",
b5d0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
b5e0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
b5f0: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
b600: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
b610: 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72  Ptr);..    retur
b620: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
b630: 0a 09 2f 2a 20 53 65 74 20 68 6f 73 74 6e 61 6d  ../* Set hostnam
b640: 65 20 66 6f 72 20 70 65 65 72 20 63 65 72 74 69  e for peer certi
b650: 66 69 63 61 74 65 20 68 6f 73 74 6e 61 6d 65 20  ficate hostname 
b660: 76 65 72 69 66 69 63 61 74 69 6f 6e 20 69 6e 20  verification in 
b670: 63 6c 69 65 6e 74 73 2e 0a 09 20 20 20 44 6f 6e  clients...   Don
b680: 27 74 20 75 73 65 20 53 53 4c 5f 73 65 74 31 5f  't use SSL_set1_
b690: 68 6f 73 74 20 73 69 6e 63 65 20 69 74 20 68 61  host since it ha
b6a0: 73 20 6c 69 6d 69 74 61 74 69 6f 6e 73 2e 20 2a  s limitations. *
b6b0: 2f 0a 09 69 66 20 28 21 53 53 4c 5f 61 64 64 31  /..if (!SSL_add1
b6c0: 5f 68 6f 73 74 28 73 74 61 74 65 50 74 72 2d 3e  _host(statePtr->
b6d0: 73 73 6c 2c 20 73 65 72 76 65 72 6e 61 6d 65 29  ssl, servername)
b6e0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
b6f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
b700: 2c 20 22 53 65 74 20 44 4e 53 20 68 6f 73 74 6e  , "Set DNS hostn
b710: 61 6d 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 47  ame failed: ", G
b720: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
b730: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
b740: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72  ..    Tcl_SetErr
b750: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
b760: 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22 2c 20  TLS", "IMPORT", 
b770: 22 48 4f 53 54 4e 41 4d 45 22 2c 20 22 46 41 49  "HOSTNAME", "FAI
b780: 4c 45 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  LED", (char *) N
b790: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 6c 73 5f 46  ULL);..    Tls_F
b7a0: 72 65 65 28 28 74 6c 73 5f 66 72 65 65 5f 74 79  ree((tls_free_ty
b7b0: 70 65 20 2a 29 20 73 74 61 74 65 50 74 72 29 3b  pe *) statePtr);
b7c0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
b7d0: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d  _ERROR;..}.    }
b7e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 75 6d 65 20  ..    /* Resume 
b7f0: 73 65 73 73 69 6f 6e 20 69 64 20 2a 2f 0a 20 20  session id */.  
b800: 20 20 69 66 20 28 73 65 73 73 69 6f 6e 5f 69 64    if (session_id
b810: 20 26 26 20 73 74 72 6c 65 6e 28 73 65 73 73 69   && strlen(sessi
b820: 6f 6e 5f 69 64 29 20 3c 3d 20 53 53 4c 5f 4d 41  on_id) <= SSL_MA
b830: 58 5f 53 49 44 5f 43 54 58 5f 4c 45 4e 47 54 48  X_SID_CTX_LENGTH
b840: 29 20 7b 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f  ) {../* SSL_set_
b850: 73 65 73 73 69 6f 6e 28 29 20 2a 2f 0a 09 69 66  session() */..if
b860: 20 28 21 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 73   (!SSL_SESSION_s
b870: 65 74 31 5f 69 64 5f 63 6f 6e 74 65 78 74 28 53  et1_id_context(S
b880: 53 4c 5f 67 65 74 5f 73 65 73 73 69 6f 6e 28 73  SL_get_session(s
b890: 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c 0a 09  tatePtr->ssl),..
b8a0: 09 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  .(const unsigned
b8b0: 20 63 68 61 72 20 2a 29 20 73 65 73 73 69 6f 6e   char *) session
b8c0: 5f 69 64 2c 20 28 75 6e 73 69 67 6e 65 64 20 69  _id, (unsigned i
b8d0: 6e 74 29 20 73 74 72 6c 65 6e 28 73 65 73 73 69  nt) strlen(sessi
b8e0: 6f 6e 5f 69 64 29 29 29 20 7b 0a 09 20 20 20 20  on_id))) {..    
b8f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
b900: 28 69 6e 74 65 72 70 2c 20 22 52 65 73 75 6d 65  (interp, "Resume
b910: 20 73 65 73 73 69 6f 6e 20 66 61 69 6c 65 64 3a   session failed:
b920: 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 53   ", GET_ERR_REAS
b930: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
b940: 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53  ULL);..    Tcl_S
b950: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65  etErrorCode(inte
b960: 72 70 2c 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f  rp, "TLS", "IMPO
b970: 52 54 22 2c 20 22 53 45 53 53 49 4f 4e 22 2c 20  RT", "SESSION", 
b980: 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72 20  "FAILED", (char 
b990: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
b9a0: 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72 65  ls_Free((tls_fre
b9b0: 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65 50  e_type *) stateP
b9c0: 74 72 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e  tr);..    return
b9d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20   TCL_ERROR;..}. 
b9e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 6e 61     }..    /* Ena
b9f0: 62 6c 65 20 41 70 70 6c 69 63 61 74 69 6f 6e 2d  ble Application-
ba00: 4c 61 79 65 72 20 50 72 6f 74 6f 63 6f 6c 20 4e  Layer Protocol N
ba10: 65 67 6f 74 69 61 74 69 6f 6e 2e 20 45 78 61 6d  egotiation. Exam
ba20: 70 6c 65 73 20 61 72 65 3a 20 68 74 74 70 2f 31  ples are: http/1
ba30: 2e 30 2c 0a 09 68 74 74 70 2f 31 2e 31 2c 20 68  .0,..http/1.1, h
ba40: 32 2c 20 68 33 2c 20 66 74 70 2c 20 69 6d 61 70  2, h3, ftp, imap
ba50: 2c 20 70 6f 70 33 2c 20 78 6d 70 70 2d 63 6c 69  , pop3, xmpp-cli
ba60: 65 6e 74 2c 20 78 6d 70 70 2d 73 65 72 76 65 72  ent, xmpp-server
ba70: 2c 20 6d 71 74 74 2c 20 69 72 63 2c 20 65 74 63  , mqtt, irc, etc
ba80: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 61 6c 70  . */.    if (alp
ba90: 6e 29 20 7b 0a 09 2f 2a 20 43 6f 6e 76 65 72 74  n) {../* Convert
baa0: 20 61 20 54 43 4c 20 6c 69 73 74 20 69 6e 74 6f   a TCL list into
bab0: 20 61 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73 74   a protocol-list
bac0: 20 69 6e 20 77 69 72 65 2d 66 6f 72 6d 61 74 20   in wire-format 
bad0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61  */..unsigned cha
bae0: 72 20 2a 70 72 6f 74 6f 73 2c 20 2a 70 3b 0a 09  r *protos, *p;..
baf0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 70 72 6f  unsigned int pro
bb00: 74 6f 73 5f 6c 65 6e 20 3d 20 30 3b 0a 09 54 63  tos_len = 0;..Tc
bb10: 6c 5f 53 69 7a 65 20 63 6e 74 2c 20 69 3b 0a 09  l_Size cnt, i;..
bb20: 69 6e 74 20 6a 3b 0a 09 54 63 6c 5f 4f 62 6a 20  int j;..Tcl_Obj 
bb30: 2a 2a 6c 69 73 74 3b 0a 0a 09 69 66 20 28 54 63  **list;...if (Tc
bb40: 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  l_ListObjGetElem
bb50: 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 6c 70  ents(interp, alp
bb60: 6e 2c 20 26 63 6e 74 2c 20 26 6c 69 73 74 29 20  n, &cnt, &list) 
bb70: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
bb80: 20 20 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f    Tls_Free((tls_
bb90: 66 72 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61  free_type *) sta
bba0: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 72 65 74  tePtr);..    ret
bbb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09  urn TCL_ERROR;..
bbc0: 7d 0a 0a 09 2f 2a 20 44 65 74 65 72 6d 69 6e 65  }.../* Determine
bbd0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 72 65 71 75   the memory requ
bbe0: 69 72 65 64 20 66 6f 72 20 74 68 65 20 70 72 6f  ired for the pro
bbf0: 74 6f 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 66  tocol-list */..f
bc00: 6f 72 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 63  or (i = 0; i < c
bc10: 6e 74 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  nt; i++) {..    
bc20: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
bc30: 6d 4f 62 6a 28 6c 69 73 74 5b 69 5d 2c 20 26 6c  mObj(list[i], &l
bc40: 65 6e 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65  en);..    if (le
bc50: 6e 20 3e 20 32 35 35 29 20 7b 0a 09 09 54 63 6c  n > 255) {...Tcl
bc60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
bc70: 74 65 72 70 2c 20 22 41 4c 50 4e 20 70 72 6f 74  terp, "ALPN prot
bc80: 6f 63 6f 6c 20 6e 61 6d 65 73 20 74 6f 6f 20 6c  ocol names too l
bc90: 6f 6e 67 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ong", (char *) N
bca0: 55 4c 4c 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45  ULL);...Tcl_SetE
bcb0: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
bcc0: 20 22 54 4c 53 22 2c 20 22 49 4d 50 4f 52 54 22   "TLS", "IMPORT"
bcd0: 2c 20 22 41 4c 50 4e 22 2c 20 22 46 41 49 4c 45  , "ALPN", "FAILE
bce0: 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  D", (char *) NUL
bcf0: 4c 29 3b 0a 09 09 54 6c 73 5f 46 72 65 65 28 28  L);...Tls_Free((
bd00: 74 6c 73 5f 66 72 65 65 5f 74 79 70 65 20 2a 29  tls_free_type *)
bd10: 20 73 74 61 74 65 50 74 72 29 3b 0a 09 09 72 65   statePtr);...re
bd20: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bd30: 09 20 20 20 20 7d 0a 09 20 20 20 20 70 72 6f 74  .    }..    prot
bd40: 6f 73 5f 6c 65 6e 20 2b 3d 20 31 20 2b 20 28 69  os_len += 1 + (i
bd50: 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 0a 09 2f 2a  nt) len;..}.../*
bd60: 20 42 75 69 6c 64 20 74 68 65 20 63 6f 6d 70 6c   Build the compl
bd70: 65 74 65 20 70 72 6f 74 6f 63 6f 6c 2d 6c 69 73  ete protocol-lis
bd80: 74 20 2a 2f 0a 09 70 72 6f 74 6f 73 20 3d 20 63  t */..protos = c
bd90: 6b 61 6c 6c 6f 63 28 70 72 6f 74 6f 73 5f 6c 65  kalloc(protos_le
bda0: 6e 29 3b 0a 09 2f 2a 20 70 72 6f 74 6f 63 6f 6c  n);../* protocol
bdb0: 2d 6c 69 73 74 73 20 63 6f 6e 73 69 73 74 20 6f  -lists consist o
bdc0: 66 20 38 2d 62 69 74 20 6c 65 6e 67 74 68 2d 70  f 8-bit length-p
bdd0: 72 65 66 69 78 65 64 2c 20 62 79 74 65 20 73 74  refixed, byte st
bde0: 72 69 6e 67 73 20 2a 2f 0a 09 66 6f 72 20 28 6a  rings */..for (j
bdf0: 20 3d 20 30 2c 20 70 20 3d 20 70 72 6f 74 6f 73   = 0, p = protos
be00: 3b 20 6a 20 3c 20 63 6e 74 3b 20 6a 2b 2b 29 20  ; j < cnt; j++) 
be10: 7b 0a 09 20 20 20 20 63 68 61 72 20 2a 73 74 72  {..    char *str
be20: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
be30: 46 72 6f 6d 4f 62 6a 28 6c 69 73 74 5b 6a 5d 2c  FromObj(list[j],
be40: 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 2a 70 2b   &len);..    *p+
be50: 2b 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  + = (unsigned ch
be60: 61 72 29 20 6c 65 6e 3b 0a 09 20 20 20 20 6d 65  ar) len;..    me
be70: 6d 63 70 79 28 70 2c 20 73 74 72 2c 20 28 73 69  mcpy(p, str, (si
be80: 7a 65 5f 74 29 20 6c 65 6e 29 3b 0a 09 20 20 20  ze_t) len);..   
be90: 20 70 20 2b 3d 20 6c 65 6e 3b 0a 09 7d 0a 0a 09   p += len;..}...
bea0: 2f 2a 20 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f  /* SSL_set_alpn_
beb0: 70 72 6f 74 6f 73 20 6d 61 6b 65 73 20 61 20 63  protos makes a c
bec0: 6f 70 79 20 6f 66 20 74 68 65 20 70 72 6f 74 6f  opy of the proto
bed0: 63 6f 6c 2d 6c 69 73 74 20 2a 2f 0a 09 2f 2a 20  col-list */../* 
bee0: 4e 6f 74 65 3a 20 54 68 69 73 20 66 75 6e 63 74  Note: This funct
bef0: 69 6f 6e 20 72 65 76 65 72 73 65 73 20 74 68 65  ion reverses the
bf00: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 63 6f   return value co
bf10: 6e 76 65 6e 74 69 6f 6e 20 2a 2f 0a 09 69 66 20  nvention */..if 
bf20: 28 53 53 4c 5f 73 65 74 5f 61 6c 70 6e 5f 70 72  (SSL_set_alpn_pr
bf30: 6f 74 6f 73 28 73 74 61 74 65 50 74 72 2d 3e 73  otos(statePtr->s
bf40: 73 6c 2c 20 70 72 6f 74 6f 73 2c 20 70 72 6f 74  sl, protos, prot
bf50: 6f 73 5f 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20  os_len)) {..    
bf60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
bf70: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 41 4c  (interp, "Set AL
bf80: 50 4e 20 70 72 6f 74 6f 63 6f 6c 73 20 66 61 69  PN protocols fai
bf90: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f  led: ", GET_ERR_
bfa0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20  REASON(), (char 
bfb0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
bfc0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
bfd0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
bfe0: 49 4d 50 4f 52 54 22 2c 20 22 41 4c 50 4e 22 2c  IMPORT", "ALPN",
bff0: 20 22 46 41 49 4c 45 44 22 2c 20 28 63 68 61 72   "FAILED", (char
c000: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20   *) NULL);..    
c010: 54 6c 73 5f 46 72 65 65 28 28 74 6c 73 5f 66 72  Tls_Free((tls_fr
c020: 65 65 5f 74 79 70 65 20 2a 29 20 73 74 61 74 65  ee_type *) state
c030: 50 74 72 29 3b 0a 09 20 20 20 20 63 6b 66 72 65  Ptr);..    ckfre
c040: 65 28 70 72 6f 74 6f 73 29 3b 0a 09 20 20 20 20  e(protos);..    
c050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c060: 3b 0a 09 7d 0a 0a 09 2f 2a 20 53 74 6f 72 65 20  ;..}.../* Store 
c070: 70 72 6f 74 6f 63 6f 6c 73 20 6c 69 73 74 20 2a  protocols list *
c080: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 70 72 6f  /..statePtr->pro
c090: 74 6f 73 20 3d 20 70 72 6f 74 6f 73 3b 0a 09 73  tos = protos;..s
c0a0: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 5f  tatePtr->protos_
c0b0: 6c 65 6e 20 3d 20 70 72 6f 74 6f 73 5f 6c 65 6e  len = protos_len
c0c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
c0d0: 73 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73  statePtr->protos
c0e0: 20 3d 20 4e 55 4c 4c 3b 0a 09 73 74 61 74 65 50   = NULL;..stateP
c0f0: 74 72 2d 3e 70 72 6f 74 6f 73 5f 6c 65 6e 20 3d  tr->protos_len =
c100: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
c110: 2a 0a 20 20 20 20 20 2a 20 53 53 4c 20 43 61 6c  *.     * SSL Cal
c120: 6c 62 61 63 6b 73 0a 20 20 20 20 20 2a 2f 0a 20  lbacks.     */. 
c130: 20 20 20 53 53 4c 5f 73 65 74 5f 61 70 70 5f 64     SSL_set_app_d
c140: 61 74 61 28 73 74 61 74 65 50 74 72 2d 3e 73 73  ata(statePtr->ss
c150: 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74 65  l, (void *)state
c160: 50 74 72 29 3b 09 2f 2a 20 70 6f 69 6e 74 20 62  Ptr);./* point b
c170: 61 63 6b 20 74 6f 20 75 73 20 2a 2f 0a 20 20 20  ack to us */.   
c180: 20 53 53 4c 5f 73 65 74 5f 76 65 72 69 66 79 28   SSL_set_verify(
c190: 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 76  statePtr->ssl, v
c1a0: 65 72 69 66 79 2c 20 56 65 72 69 66 79 43 61 6c  erify, VerifyCal
c1b0: 6c 62 61 63 6b 29 3b 0a 20 20 20 20 2f 2a 53 53  lback);.    /*SS
c1c0: 4c 5f 73 65 74 5f 76 65 72 69 66 79 5f 64 65 70  L_set_verify_dep
c1d0: 74 68 28 53 53 4c 5f 73 65 74 5f 76 65 72 69 66  th(SSL_set_verif
c1e0: 79 5f 64 65 70 74 68 2c 20 30 29 3b 2a 2f 0a 20  y_depth, 0);*/. 
c1f0: 20 20 20 53 53 4c 5f 73 65 74 5f 69 6e 66 6f 5f     SSL_set_info_
c200: 63 61 6c 6c 62 61 63 6b 28 73 74 61 74 65 50 74  callback(statePt
c210: 72 2d 3e 73 73 6c 2c 20 49 6e 66 6f 43 61 6c 6c  r->ssl, InfoCall
c220: 62 61 63 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  back);..    /* C
c230: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 6f 62 73 65  allback for obse
c240: 72 76 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6d  rving protocol m
c250: 65 73 73 61 67 65 73 20 2a 2f 0a 23 69 66 6e 64  essages */.#ifnd
c260: 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53  ef OPENSSL_NO_SS
c270: 4c 5f 54 52 41 43 45 0a 20 20 20 20 2f 2a 20 76  L_TRACE.    /* v
c280: 6f 69 64 20 53 53 4c 5f 43 54 58 5f 73 65 74 5f  oid SSL_CTX_set_
c290: 6d 73 67 5f 63 61 6c 6c 62 61 63 6b 5f 61 72 67  msg_callback_arg
c2a0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c2b0: 28 76 6f 69 64 20 2a 29 73 74 61 74 65 50 74 72  (void *)statePtr
c2c0: 29 3b 0a 20 20 20 20 76 6f 69 64 20 53 53 4c 5f  );.    void SSL_
c2d0: 43 54 58 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c  CTX_set_msg_call
c2e0: 62 61 63 6b 28 73 74 61 74 65 50 74 72 2d 3e 63  back(statePtr->c
c2f0: 74 78 2c 20 4d 65 73 73 61 67 65 43 61 6c 6c 62  tx, MessageCallb
c300: 61 63 6b 29 3b 20 2a 2f 0a 20 20 20 20 53 53 4c  ack); */.    SSL
c310: 5f 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63  _set_msg_callbac
c320: 6b 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e  k_arg(statePtr->
c330: 73 73 6c 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ssl, (void *)sta
c340: 74 65 50 74 72 29 3b 0a 20 20 20 20 53 53 4c 5f  tePtr);.    SSL_
c350: 73 65 74 5f 6d 73 67 5f 63 61 6c 6c 62 61 63 6b  set_msg_callback
c360: 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
c370: 4d 65 73 73 61 67 65 43 61 6c 6c 62 61 63 6b 29  MessageCallback)
c380: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
c390: 20 43 72 65 61 74 65 20 54 63 6c 5f 43 68 61 6e   Create Tcl_Chan
c3a0: 6e 65 6c 20 42 49 4f 20 48 61 6e 64 6c 65 72 20  nel BIO Handler 
c3b0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d  */.    statePtr-
c3c0: 3e 70 5f 62 69 6f 09 3d 20 42 49 4f 5f 6e 65 77  >p_bio.= BIO_new
c3d0: 5f 74 63 6c 28 73 74 61 74 65 50 74 72 2c 20 42  _tcl(statePtr, B
c3e0: 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a 20 20 20  IO_NOCLOSE);.   
c3f0: 20 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 09 3d   statePtr->bio.=
c400: 20 42 49 4f 5f 6e 65 77 28 42 49 4f 5f 66 5f 73   BIO_new(BIO_f_s
c410: 73 6c 28 29 29 3b 0a 0a 20 20 20 20 69 66 20 28  sl());..    if (
c420: 73 65 72 76 65 72 29 20 7b 0a 09 2f 2a 20 53 65  server) {../* Se
c430: 72 76 65 72 20 63 61 6c 6c 62 61 63 6b 73 20 2a  rver callbacks *
c440: 2f 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 74  /..SSL_CTX_set_t
c450: 6c 73 65 78 74 5f 73 65 72 76 65 72 6e 61 6d 65  lsext_servername
c460: 5f 61 72 67 28 73 74 61 74 65 50 74 72 2d 3e 63  _arg(statePtr->c
c470: 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74 61 74  tx, (void *)stat
c480: 65 50 74 72 29 3b 0a 09 53 53 4c 5f 43 54 58 5f  ePtr);..SSL_CTX_
c490: 73 65 74 5f 74 6c 73 65 78 74 5f 73 65 72 76 65  set_tlsext_serve
c4a0: 72 6e 61 6d 65 5f 63 61 6c 6c 62 61 63 6b 28 73  rname_callback(s
c4b0: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 4e  tatePtr->ctx, SN
c4c0: 49 43 61 6c 6c 62 61 63 6b 29 3b 0a 09 53 53 4c  ICallback);..SSL
c4d0: 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
c4e0: 68 65 6c 6c 6f 5f 63 62 28 73 74 61 74 65 50 74  hello_cb(statePt
c4f0: 72 2d 3e 63 74 78 2c 20 48 65 6c 6c 6f 43 61 6c  r->ctx, HelloCal
c500: 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73  lback, (void *)s
c510: 74 61 74 65 50 74 72 29 3b 0a 09 69 66 20 28 73  tatePtr);..if (s
c520: 74 61 74 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20  tatePtr->protos 
c530: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
c540: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 61 6c 70 6e  SSL_CTX_set_alpn
c550: 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74 65  _select_cb(state
c560: 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43 61  Ptr->ctx, ALPNCa
c570: 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29  llback, (void *)
c580: 73 74 61 74 65 50 74 72 29 3b 0a 23 69 66 64 65  statePtr);.#ifde
c590: 66 20 55 53 45 5f 4e 50 4e 0a 09 20 20 20 20 69  f USE_NPN..    i
c5a0: 66 20 28 74 6c 73 31 5f 32 20 3d 3d 20 30 20 26  f (tls1_2 == 0 &
c5b0: 26 20 74 6c 73 31 5f 33 20 3d 3d 20 30 29 20 7b  & tls1_3 == 0) {
c5c0: 0a 09 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6e  ...SSL_CTX_set_n
c5d0: 65 78 74 5f 70 72 6f 74 6f 73 5f 61 64 76 65 72  ext_protos_adver
c5e0: 74 69 73 65 64 5f 63 62 28 73 74 61 74 65 50 74  tised_cb(statePt
c5f0: 72 2d 3e 63 74 78 2c 20 4e 50 4e 43 61 6c 6c 62  r->ctx, NPNCallb
c600: 61 63 6b 2c 20 28 76 6f 69 64 20 2a 29 73 74 61  ack, (void *)sta
c610: 74 65 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 23  tePtr);..    }.#
c620: 65 6e 64 69 66 0a 09 7d 0a 0a 09 2f 2a 20 45 6e  endif..}.../* En
c630: 61 62 6c 65 20 73 65 72 76 65 72 20 74 6f 20 73  able server to s
c640: 65 6e 64 20 63 65 72 74 20 72 65 71 75 65 73 74  end cert request
c650: 20 61 66 74 65 72 20 68 61 6e 64 73 68 61 6b 65   after handshake
c660: 20 28 54 4c 53 20 31 2e 33 20 6f 6e 6c 79 29 20   (TLS 1.3 only) 
c670: 2a 2f 0a 09 2f 2a 20 41 20 77 72 69 74 65 20 6f  */../* A write o
c680: 70 65 72 61 74 69 6f 6e 20 6d 75 73 74 20 74 61  peration must ta
c690: 6b 65 20 70 6c 61 63 65 20 66 6f 72 20 74 68 65  ke place for the
c6a0: 20 43 65 72 74 69 66 69 63 61 74 65 20 52 65 71   Certificate Req
c6b0: 75 65 73 74 20 74 6f 20 62 65 0a 09 20 20 20 73  uest to be..   s
c6c0: 65 6e 74 20 74 6f 20 74 68 65 20 63 6c 69 65 6e  ent to the clien
c6d0: 74 2c 20 74 68 69 73 20 63 61 6e 20 62 65 20 64  t, this can be d
c6e0: 6f 6e 65 20 77 69 74 68 20 53 53 4c 5f 64 6f 5f  one with SSL_do_
c6f0: 68 61 6e 64 73 68 61 6b 65 28 29 2e 20 2a 2f 0a  handshake(). */.
c700: 09 69 66 20 28 72 65 71 75 65 73 74 20 26 26 20  .if (request && 
c710: 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b 65 20 26  post_handshake &
c720: 26 20 74 6c 73 31 5f 33 29 20 7b 0a 09 20 20 20  & tls1_3) {..   
c730: 20 53 53 4c 5f 76 65 72 69 66 79 5f 63 6c 69 65   SSL_verify_clie
c740: 6e 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  nt_post_handshak
c750: 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  e(statePtr->ssl)
c760: 3b 0a 09 7d 0a 0a 09 2f 2a 20 73 65 74 20 61 75  ;..}.../* set au
c770: 74 6f 6d 61 74 69 63 20 63 75 72 76 65 20 73 65  tomatic curve se
c780: 6c 65 63 74 69 6f 6e 20 2a 2f 0a 09 53 53 4c 5f  lection */..SSL_
c790: 73 65 74 5f 65 63 64 68 5f 61 75 74 6f 28 73 74  set_ecdh_auto(st
c7a0: 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 31 29 3b  atePtr->ssl, 1);
c7b0: 0a 0a 09 2f 2a 20 53 65 74 20 73 65 72 76 65 72  .../* Set server
c7c0: 20 6d 6f 64 65 20 2a 2f 0a 09 73 74 61 74 65 50   mode */..stateP
c7d0: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53  tr->flags |= TLS
c7e0: 5f 54 43 4c 5f 53 45 52 56 45 52 3b 0a 09 53 53  _TCL_SERVER;..SS
c7f0: 4c 5f 73 65 74 5f 61 63 63 65 70 74 5f 73 74 61  L_set_accept_sta
c800: 74 65 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  te(statePtr->ssl
c810: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
c820: 09 2f 2a 20 43 6c 69 65 6e 74 20 63 61 6c 6c 62  ./* Client callb
c830: 61 63 6b 73 20 2a 2f 0a 23 69 66 64 65 66 20 55  acks */.#ifdef U
c840: 53 45 5f 4e 50 4e 0a 09 69 66 20 28 73 74 61 74  SE_NPN..if (stat
c850: 65 50 74 72 2d 3e 70 72 6f 74 6f 73 20 21 3d 20  ePtr->protos != 
c860: 4e 55 4c 4c 20 26 26 20 74 6c 73 31 5f 32 20 3d  NULL && tls1_2 =
c870: 3d 20 30 20 26 26 20 74 6c 73 31 5f 33 20 3d 3d  = 0 && tls1_3 ==
c880: 20 30 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 43   0) {..    SSL_C
c890: 54 58 5f 73 65 74 5f 6e 65 78 74 5f 70 72 6f 74  TX_set_next_prot
c8a0: 6f 5f 73 65 6c 65 63 74 5f 63 62 28 73 74 61 74  o_select_cb(stat
c8b0: 65 50 74 72 2d 3e 63 74 78 2c 20 41 4c 50 4e 43  ePtr->ctx, ALPNC
c8c0: 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 20 2a  allback, (void *
c8d0: 29 73 74 61 74 65 50 74 72 29 3b 0a 09 7d 0a 23  )statePtr);..}.#
c8e0: 65 6e 64 69 66 0a 0a 09 2f 2a 20 53 65 73 73 69  endif.../* Sessi
c8f0: 6f 6e 20 63 61 63 68 69 6e 67 20 2a 2f 0a 09 53  on caching */..S
c900: 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 73 73 69  SL_CTX_set_sessi
c910: 6f 6e 5f 63 61 63 68 65 5f 6d 6f 64 65 28 73 74  on_cache_mode(st
c920: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 53 53 4c  atePtr->ctx, SSL
c930: 5f 53 45 53 53 5f 43 41 43 48 45 5f 43 4c 49 45  _SESS_CACHE_CLIE
c940: 4e 54 20 7c 20 53 53 4c 5f 53 45 53 53 5f 43 41  NT | SSL_SESS_CA
c950: 43 48 45 5f 4e 4f 5f 49 4e 54 45 52 4e 41 4c 5f  CHE_NO_INTERNAL_
c960: 53 54 4f 52 45 29 3b 0a 09 53 53 4c 5f 43 54 58  STORE);..SSL_CTX
c970: 5f 73 65 73 73 5f 73 65 74 5f 6e 65 77 5f 63 62  _sess_set_new_cb
c980: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20  (statePtr->ctx, 
c990: 53 65 73 73 69 6f 6e 43 61 6c 6c 62 61 63 6b 29  SessionCallback)
c9a0: 3b 0a 0a 09 2f 2a 20 45 6e 61 62 6c 65 20 70 6f  ;.../* Enable po
c9b0: 73 74 20 68 61 6e 64 73 68 61 6b 65 20 41 75 74  st handshake Aut
c9c0: 68 65 6e 74 69 63 61 74 69 6f 6e 20 65 78 74 65  hentication exte
c9d0: 6e 73 69 6f 6e 2e 20 54 4c 53 20 31 2e 33 20 6f  nsion. TLS 1.3 o
c9e0: 6e 6c 79 2c 20 6e 6f 74 20 68 74 74 70 2f 32 2e  nly, not http/2.
c9f0: 20 2a 2f 0a 09 69 66 20 28 72 65 71 75 65 73 74   */..if (request
ca00: 20 26 26 20 70 6f 73 74 5f 68 61 6e 64 73 68 61   && post_handsha
ca10: 6b 65 29 20 7b 0a 09 20 20 20 20 53 53 4c 5f 73  ke) {..    SSL_s
ca20: 65 74 5f 70 6f 73 74 5f 68 61 6e 64 73 68 61 6b  et_post_handshak
ca30: 65 5f 61 75 74 68 28 73 74 61 74 65 50 74 72 2d  e_auth(statePtr-
ca40: 3e 73 73 6c 2c 20 31 29 3b 0a 09 7d 0a 0a 09 2f  >ssl, 1);..}.../
ca50: 2a 20 53 65 74 20 63 6c 69 65 6e 74 20 6d 6f 64  * Set client mod
ca60: 65 20 2a 2f 0a 09 53 53 4c 5f 73 65 74 5f 63 6f  e */..SSL_set_co
ca70: 6e 6e 65 63 74 5f 73 74 61 74 65 28 73 74 61 74  nnect_state(stat
ca80: 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20  ePtr->ssl);.    
ca90: 7d 0a 20 20 20 20 53 53 4c 5f 73 65 74 5f 62 69  }.    SSL_set_bi
caa0: 6f 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c  o(statePtr->ssl,
cab0: 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69 6f   statePtr->p_bio
cac0: 2c 20 73 74 61 74 65 50 74 72 2d 3e 70 5f 62 69  , statePtr->p_bi
cad0: 6f 29 3b 0a 20 20 20 20 42 49 4f 5f 73 65 74 5f  o);.    BIO_set_
cae0: 73 73 6c 28 73 74 61 74 65 50 74 72 2d 3e 62 69  ssl(statePtr->bi
caf0: 6f 2c 20 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  o, statePtr->ssl
cb00: 2c 20 42 49 4f 5f 4e 4f 43 4c 4f 53 45 29 3b 0a  , BIO_NOCLOSE);.
cb10: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45  .    /*.     * E
cb20: 6e 64 20 6f 66 20 53 53 4c 20 49 6e 69 74 0a 20  nd of SSL Init. 
cb30: 20 20 20 20 2a 2f 0a 20 20 20 20 64 70 72 69 6e      */.    dprin
cb40: 74 66 28 22 52 65 74 75 72 6e 69 6e 67 20 25 73  tf("Returning %s
cb50: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65  ", Tcl_GetChanne
cb60: 6c 4e 61 6d 65 28 73 74 61 74 65 50 74 72 2d 3e  lName(statePtr->
cb70: 73 65 6c 66 29 29 3b 0a 20 20 20 20 54 63 6c 5f  self));.    Tcl_
cb80: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
cb90: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47  , (char *) Tcl_G
cba0: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 73 74  etChannelName(st
cbb0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 2c 20 54  atePtr->self), T
cbc0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 0a 20  CL_VOLATILE);.. 
cbd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
cbe0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
cbf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
cc30: 2a 0a 20 2a 20 55 6e 69 6d 70 6f 72 74 4f 62 6a  *. * UnimportObj
cc40: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
cc50: 73 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 69  s procedure is i
cc60: 6e 76 6f 6b 65 64 20 74 6f 20 72 65 6d 6f 76 65  nvoked to remove
cc70: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cc80: 6e 6e 65 6c 20 66 69 6c 74 65 72 2e 0a 20 2a 0a  nnel filter.. *.
cc90: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
cca0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65   standard Tcl re
ccb0: 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  sult.. *. * Side
ccc0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79   effects:. *.May
ccd0: 20 6d 6f 64 69 66 79 20 74 68 65 20 62 65 68 61   modify the beha
cce0: 76 69 6f 72 20 6f 66 20 61 6e 20 49 4f 20 63 68  vior of an IO ch
ccf0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  annel.. *. *----
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
cd40: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 0a 55   */.static int.U
cd50: 6e 69 6d 70 6f 72 74 4f 62 6a 43 6d 64 28 43 6c  nimportObjCmd(Cl
cd60: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
cd70: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20  ata, Tcl_Interp 
cd80: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a  *interp, int obj
cd90: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73  c, Tcl_Obj *cons
cda0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20  t objv[]) {.    
cdb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
cdc0: 2c 20 63 68 69 6c 64 3b 09 2f 2a 20 54 68 65 20  , child;./* The 
cdd0: 73 74 61 63 6b 65 64 20 61 6e 64 20 75 6e 64 65  stacked and unde
cde0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 73 20  rlying channels 
cdf0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
ce00: 6e 67 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 54  ng upperChannelT
ce10: 72 61 6e 73 6c 61 74 69 6f 6e 2c 20 75 70 70 65  ranslation, uppe
ce20: 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b 69 6e 67  rChannelBlocking
ce30: 2c 20 75 70 70 65 72 43 68 61 6e 6e 65 6c 45 6e  , upperChannelEn
ce40: 63 6f 64 69 6e 67 2c 20 75 70 70 65 72 43 68 61  coding, upperCha
ce50: 6e 6e 65 6c 45 4f 46 43 68 61 72 3b 0a 20 20 20  nnelEOFChar;.   
ce60: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f   int res = TCL_O
ce70: 4b 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c  K;.    (void) cl
ce80: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 64  ientData;..    d
ce90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29  printf("Called")
cea0: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  ;..    if (objc 
ceb0: 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f  != 2) {..Tcl_Wro
cec0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ced0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e  , 1, objv, "chan
cee0: 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 54  nel");..return T
cef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
cf00: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65  .    /* Validate
cf10: 20 63 68 61 6e 6e 65 6c 20 6e 61 6d 65 20 2a 2f   channel name */
cf20: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f  .    chan = Tcl_
cf30: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72  GetChannel(inter
cf40: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
cf50: 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
cf60: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d  ;.    if (chan =
cf70: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20  = (Tcl_Channel) 
cf80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20  NULL) {..return 
cf90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
cfa0: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75  ..    /* Make su
cfb0: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e  re to operate on
cfc0: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61   the topmost cha
cfd0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e  nnel */.    chan
cfe0: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61   = Tcl_GetTopCha
cff0: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20 20 20 20  nnel(chan);.    
d000: 63 68 69 6c 64 20 3d 20 54 63 6c 5f 47 65 74 53  child = Tcl_GetS
d010: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 63 68  tackedChannel(ch
d020: 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72  an);..    /* Ver
d030: 69 66 79 20 69 73 20 61 20 73 74 61 63 6b 65 64  ify is a stacked
d040: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20   channel */.    
d050: 69 66 20 28 63 68 69 6c 64 20 3d 3d 20 4e 55 4c  if (child == NUL
d060: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
d070: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
d080: 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 2c  bad channel \"",
d090: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e   Tcl_GetChannelN
d0a0: 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09 22 5c 22  ame(chan),..."\"
d0b0: 3a 20 6e 6f 74 20 61 20 73 74 61 63 6b 65 64 20  : not a stacked 
d0c0: 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20  channel", (char 
d0d0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54  *) NULL);..    T
d0e0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
d0f0: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22  interp, "TLS", "
d100: 55 4e 49 4d 50 4f 52 54 22 2c 20 22 43 48 41 4e  UNIMPORT", "CHAN
d110: 4e 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c  NEL", "INVALID",
d120: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
d130: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d140: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
d150: 2a 20 46 6c 75 73 68 20 61 6e 79 20 70 65 6e 64  * Flush any pend
d160: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 20 20  ing data */.    
d170: 69 66 20 28 54 63 6c 5f 46 6c 75 73 68 28 63 68  if (Tcl_Flush(ch
d180: 61 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  an) != TCL_OK) {
d190: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
d1a0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54  OR;.    }..    T
d1b0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
d1c0: 75 70 70 65 72 43 68 61 6e 6e 65 6c 54 72 61 6e  upperChannelTran
d1d0: 73 6c 61 74 69 6f 6e 29 3b 0a 20 20 20 20 54 63  slation);.    Tc
d1e0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 75  l_DStringInit(&u
d1f0: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d200: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53  ing);.    Tcl_DS
d210: 74 72 69 6e 67 49 6e 69 74 28 26 75 70 70 65 72  tringInit(&upper
d220: 43 68 61 6e 6e 65 6c 45 4f 46 43 68 61 72 29 3b  ChannelEOFChar);
d230: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d240: 49 6e 69 74 28 26 75 70 70 65 72 43 68 61 6e 6e  Init(&upperChann
d250: 65 6c 45 6e 63 6f 64 69 6e 67 29 3b 0a 0a 20 20  elEncoding);..  
d260: 20 20 2f 2a 20 47 65 74 20 63 75 72 72 65 6e 74    /* Get current
d270: 20 63 6f 6e 66 69 67 20 2d 20 45 4f 4c 20 74 72   config - EOL tr
d280: 61 6e 73 6c 61 74 69 6f 6e 2c 20 65 6e 63 6f 64  anslation, encod
d290: 69 6e 67 20 61 6e 64 20 62 75 66 66 65 72 69 6e  ing and bufferin
d2a0: 67 20 6f 70 74 69 6f 6e 73 20 61 72 65 20 73 68  g options are sh
d2b0: 61 72 65 64 20 62 65 74 77 65 65 6e 20 61 6c 6c  ared between all
d2c0: 20 63 68 61 6e 6e 65 6c 73 20 69 6e 20 74 68 65   channels in the
d2d0: 20 73 74 61 63 6b 20 2a 2f 0a 20 20 20 20 54 63   stack */.    Tc
d2e0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69  l_GetChannelOpti
d2f0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c  on(interp, chan,
d300: 20 22 2d 62 6c 6f 63 6b 69 6e 67 22 2c 20 26 75   "-blocking", &u
d310: 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f 63 6b  pperChannelBlock
d320: 69 6e 67 29 3b 0a 20 20 20 20 54 63 6c 5f 47 65  ing);.    Tcl_Ge
d330: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d340: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 65  nterp, chan, "-e
d350: 6e 63 6f 64 69 6e 67 22 2c 20 26 75 70 70 65 72  ncoding", &upper
d360: 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29  ChannelEncoding)
d370: 3b 0a 20 20 20 20 54 63 6c 5f 47 65 74 43 68 61  ;.    Tcl_GetCha
d380: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d390: 70 2c 20 63 68 61 6e 2c 20 22 2d 65 6f 66 63 68  p, chan, "-eofch
d3a0: 61 72 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e  ar", &upperChann
d3b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d3c0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_GetChannelOp
d3d0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61  tion(interp, cha
d3e0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  n, "-translation
d3f0: 22 2c 20 26 75 70 70 65 72 43 68 61 6e 6e 65 6c  ", &upperChannel
d400: 54 72 61 6e 73 6c 61 74 69 6f 6e 29 3b 0a 0a 20  Translation);.. 
d410: 20 20 20 2f 2a 20 55 6e 73 74 61 63 6b 20 74 68     /* Unstack th
d420: 65 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 72 65  e channel and re
d430: 73 74 6f 72 65 20 75 6e 64 65 72 6c 79 69 6e 67  store underlying
d440: 20 63 68 61 6e 6e 65 6c 20 63 6f 6e 66 69 67 20   channel config 
d450: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55  */.    if (Tcl_U
d460: 6e 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e  nstackChannel(in
d470: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54  terp, chan) == T
d480: 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 65  CL_OK) {..Tcl_Se
d490: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69  tChannelOption(i
d4a0: 6e 74 65 72 70 2c 20 63 68 69 6c 64 2c 20 22 2d  nterp, child, "-
d4b0: 65 6e 63 6f 64 69 6e 67 22 2c 20 54 63 6c 5f 44  encoding", Tcl_D
d4c0: 53 74 72 69 6e 67 56 61 6c 75 65 28 26 75 70 70  StringValue(&upp
d4d0: 65 72 43 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e  erChannelEncodin
d4e0: 67 29 29 3b 0a 09 54 63 6c 5f 53 65 74 43 68 61  g));..Tcl_SetCha
d4f0: 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72  nnelOption(inter
d500: 70 2c 20 63 68 69 6c 64 2c 20 22 2d 65 6f 66 63  p, child, "-eofc
d510: 68 61 72 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e  har", Tcl_DStrin
d520: 67 56 61 6c 75 65 28 26 75 70 70 65 72 43 68 61  gValue(&upperCha
d530: 6e 6e 65 6c 45 4f 46 43 68 61 72 29 29 3b 0a 09  nnelEOFChar));..
d540: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70  Tcl_SetChannelOp
d550: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 69  tion(interp, chi
d560: 6c 64 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f  ld, "-translatio
d570: 6e 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  n", Tcl_DStringV
d580: 61 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e  alue(&upperChann
d590: 65 6c 54 72 61 6e 73 6c 61 74 69 6f 6e 29 29 3b  elTranslation));
d5a0: 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c  ..Tcl_SetChannel
d5b0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63  Option(interp, c
d5c0: 68 69 6c 64 2c 20 22 2d 62 6c 6f 63 6b 69 6e 67  hild, "-blocking
d5d0: 22 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ", Tcl_DStringVa
d5e0: 6c 75 65 28 26 75 70 70 65 72 43 68 61 6e 6e 65  lue(&upperChanne
d5f0: 6c 42 6c 6f 63 6b 69 6e 67 29 29 3b 0a 20 20 20  lBlocking));.   
d600: 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 73 20 3d   } else {..res =
d610: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
d620: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d  }..    /* Clean-
d630: 75 70 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53  up */.    Tcl_DS
d640: 74 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72  tringFree(&upper
d650: 43 68 61 6e 6e 65 6c 54 72 61 6e 73 6c 61 74 69  ChannelTranslati
d660: 6f 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 44 53 74  on);.    Tcl_DSt
d670: 72 69 6e 67 46 72 65 65 28 26 75 70 70 65 72 43  ringFree(&upperC
d680: 68 61 6e 6e 65 6c 45 6e 63 6f 64 69 6e 67 29 3b  hannelEncoding);
d690: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d6a0: 46 72 65 65 28 26 75 70 70 65 72 43 68 61 6e 6e  Free(&upperChann
d6b0: 65 6c 45 4f 46 43 68 61 72 29 3b 0a 20 20 20 20  elEOFChar);.    
d6c0: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
d6d0: 26 75 70 70 65 72 43 68 61 6e 6e 65 6c 42 6c 6f  &upperChannelBlo
d6e0: 63 6b 69 6e 67 29 3b 0a 20 20 20 20 72 65 74 75  cking);.    retu
d6f0: 72 6e 20 72 65 73 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  rn res;.}.../*. 
d700: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d740: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 43 54 58 5f 49  ----. *. * CTX_I
d750: 6e 69 74 20 2d 2d 20 63 6f 6e 73 74 72 75 63 74  nit -- construct
d760: 20 61 20 53 53 4c 5f 43 54 58 20 69 6e 73 74 61   a SSL_CTX insta
d770: 6e 63 65 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  nce. *. * Result
d780: 73 3a 0a 20 2a 09 41 20 76 61 6c 69 64 20 53 53  s:. *.A valid SS
d790: 4c 5f 43 54 58 20 69 6e 73 74 61 6e 63 65 20 6f  L_CTX instance o
d7a0: 72 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 53 69  r NULL.. *. * Si
d7b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 63  de effects:. *.c
d7c0: 6f 6e 73 74 72 75 63 74 73 20 53 53 4c 20 63 6f  onstructs SSL co
d7d0: 6e 74 65 78 74 20 28 43 54 58 29 0a 20 2a 0a 20  ntext (CTX). *. 
d7e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
d7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d820: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
d830: 53 53 4c 5f 43 54 58 20 2a 0a 43 54 58 5f 49 6e  SSL_CTX *.CTX_In
d840: 69 74 28 53 74 61 74 65 20 2a 73 74 61 74 65 50  it(State *stateP
d850: 74 72 2c 20 69 6e 74 20 69 73 53 65 72 76 65 72  tr, int isServer
d860: 2c 20 69 6e 74 20 70 72 6f 74 6f 2c 20 63 68 61  , int proto, cha
d870: 72 20 2a 6b 65 79 66 69 6c 65 2c 20 63 68 61 72  r *keyfile, char
d880: 20 2a 63 65 72 74 66 69 6c 65 2c 0a 20 20 20 20   *certfile,.    
d890: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b  unsigned char *k
d8a0: 65 79 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ey, unsigned cha
d8b0: 72 20 2a 63 65 72 74 2c 20 54 63 6c 5f 53 69 7a  r *cert, Tcl_Siz
d8c0: 65 20 6b 65 79 5f 6c 65 6e 2c 20 54 63 6c 5f 53  e key_len, Tcl_S
d8d0: 69 7a 65 20 63 65 72 74 5f 6c 65 6e 2c 20 63 68  ize cert_len, ch
d8e0: 61 72 20 2a 43 41 70 61 74 68 2c 0a 20 20 20 20  ar *CApath,.    
d8f0: 63 68 61 72 20 2a 43 41 73 74 6f 72 65 2c 20 63  char *CAstore, c
d900: 68 61 72 20 2a 43 41 66 69 6c 65 2c 20 63 68 61  har *CAfile, cha
d910: 72 20 2a 63 69 70 68 65 72 73 2c 20 63 68 61 72  r *ciphers, char
d920: 20 2a 63 69 70 68 65 72 73 75 69 74 65 73 2c 20   *ciphersuites, 
d930: 69 6e 74 20 6c 65 76 65 6c 2c 20 63 68 61 72 20  int level, char 
d940: 2a 44 48 70 61 72 61 6d 73 29 20 7b 0a 20 20 20  *DHparams) {.   
d950: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d960: 65 72 70 20 3d 20 73 74 61 74 65 50 74 72 2d 3e  erp = statePtr->
d970: 69 6e 74 65 72 70 3b 0a 20 20 20 20 53 53 4c 5f  interp;.    SSL_
d980: 43 54 58 20 2a 63 74 78 20 3d 20 4e 55 4c 4c 3b  CTX *ctx = NULL;
d990: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
d9a0: 20 64 73 3b 0a 20 20 20 20 69 6e 74 20 6f 66 66   ds;.    int off
d9b0: 20 3d 20 30 2c 20 61 62 6f 72 74 20 3d 20 30 3b   = 0, abort = 0;
d9c0: 0a 20 20 20 20 69 6e 74 20 6c 6f 61 64 5f 70 72  .    int load_pr
d9d0: 69 76 61 74 65 5f 6b 65 79 3b 0a 20 20 20 20 63  ivate_key;.    c
d9e0: 6f 6e 73 74 20 53 53 4c 5f 4d 45 54 48 4f 44 20  onst SSL_METHOD 
d9f0: 2a 6d 65 74 68 6f 64 3b 0a 0a 20 20 20 20 64 70  *method;..    dp
da00: 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b  rintf("Called");
da10: 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 74 6f  ..    if (!proto
da20: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
da30: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e  esult(interp, "n
da40: 6f 20 76 61 6c 69 64 20 70 72 6f 74 6f 63 6f 6c  o valid protocol
da50: 20 73 65 6c 65 63 74 65 64 22 2c 20 28 63 68 61   selected", (cha
da60: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
da70: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
da80: 0a 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 53  .    /* create S
da90: 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 23 69  SL context */.#i
daa0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f  f OPENSSL_VERSIO
dab0: 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 31 30  N_NUMBER >= 0x10
dac0: 31 30 30 30 30 30 4c 20 7c 7c 20 64 65 66 69 6e  100000L || defin
dad0: 65 64 28 4e 4f 5f 53 53 4c 32 29 20 7c 7c 20 64  ed(NO_SSL2) || d
dae0: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
daf0: 4f 5f 53 53 4c 32 29 0a 20 20 20 20 69 66 20 28  O_SSL2).    if (
db00: 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54  ENABLED(proto, T
db10: 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32 29 29 20  LS_PROTO_SSL2)) 
db20: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  {..Tcl_AppendRes
db30: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c  ult(interp, "SSL
db40: 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73  2 protocol not s
db50: 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72  upported", (char
db60: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75   *) NULL);..retu
db70: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23  rn NULL;.    }.#
db80: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
db90: 64 28 4e 4f 5f 53 53 4c 33 29 20 7c 7c 20 64 65  d(NO_SSL3) || de
dba0: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
dbb0: 5f 53 53 4c 33 29 0a 20 20 20 20 69 66 20 28 45  _SSL3).    if (E
dbc0: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
dbd0: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 29 20 7b  S_PROTO_SSL3)) {
dbe0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
dbf0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 53 53 4c 33  lt(interp, "SSL3
dc00: 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20 73 75   protocol not su
dc10: 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61 72 20  pported", (char 
dc20: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
dc30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 23 65  n NULL;.    }.#e
dc40: 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
dc50: 28 4e 4f 5f 54 4c 53 31 29 20 7c 7c 20 64 65 66  (NO_TLS1) || def
dc60: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
dc70: 54 4c 53 31 29 0a 20 20 20 20 69 66 20 28 45 4e  TLS1).    if (EN
dc80: 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53  ABLED(proto, TLS
dc90: 5f 50 52 4f 54 4f 5f 54 4c 53 31 29 29 20 7b 0a  _PROTO_TLS1)) {.
dca0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
dcb0: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
dcc0: 2e 30 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .0 protocol not 
dcd0: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
dce0: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
dcf0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
dd00: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dd10: 65 64 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 7c 7c  ed(NO_TLS1_1) ||
dd20: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
dd30: 5f 4e 4f 5f 54 4c 53 31 5f 31 29 0a 20 20 20 20  _NO_TLS1_1).    
dd40: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dd50: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
dd60: 31 5f 31 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_1)) {..Tcl_App
dd70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
dd80: 2c 20 22 54 4c 53 20 31 2e 31 20 70 72 6f 74 6f  , "TLS 1.1 proto
dd90: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
dda0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
ddb0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
ddc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
ddd0: 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c  if defined(NO_TL
dde0: 53 31 5f 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  S1_2) || defined
ddf0: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
de00: 5f 32 29 0a 20 20 20 20 69 66 20 28 45 4e 41 42  _2).    if (ENAB
de10: 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50  LED(proto, TLS_P
de20: 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 29 20 7b 0a  ROTO_TLS1_2)) {.
de30: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
de40: 74 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 20 31  t(interp, "TLS 1
de50: 2e 32 20 70 72 6f 74 6f 63 6f 6c 20 6e 6f 74 20  .2 protocol not 
de60: 73 75 70 70 6f 72 74 65 64 22 2c 20 28 63 68 61  supported", (cha
de70: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74  r *) NULL);..ret
de80: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
de90: 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
dea0: 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 7c 7c  ed(NO_TLS1_3) ||
deb0: 20 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c   defined(OPENSSL
dec0: 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20  _NO_TLS1_3).    
ded0: 69 66 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74  if (ENABLED(prot
dee0: 6f 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53  o, TLS_PROTO_TLS
def0: 31 5f 33 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  1_3)) {..Tcl_App
df00: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
df10: 2c 20 22 54 4c 53 20 31 2e 33 20 70 72 6f 74 6f  , "TLS 1.3 proto
df20: 63 6f 6c 20 6e 6f 74 20 73 75 70 70 6f 72 74 65  col not supporte
df30: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  d", (char *) NUL
df40: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  L);..return NULL
df50: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
df60: 20 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20     if (proto == 
df70: 30 29 20 7b 0a 09 2f 2a 20 55 73 65 20 66 75 6c  0) {../* Use ful
df80: 6c 20 72 61 6e 67 65 20 2a 2f 0a 09 53 53 4c 5f  l range */..SSL_
df90: 43 54 58 5f 73 65 74 5f 6d 69 6e 5f 70 72 6f 74  CTX_set_min_prot
dfa0: 6f 5f 76 65 72 73 69 6f 6e 28 63 74 78 2c 20 30  o_version(ctx, 0
dfb0: 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f  );..SSL_CTX_set_
dfc0: 6d 61 78 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  max_proto_versio
dfd0: 6e 28 63 74 78 2c 20 30 29 3b 0a 20 20 20 20 7d  n(ctx, 0);.    }
dfe0: 0a 0a 20 20 20 20 73 77 69 74 63 68 20 28 70 72  ..    switch (pr
dff0: 6f 74 6f 29 20 7b 0a 23 69 66 20 4f 50 45 4e 53  oto) {.#if OPENS
e000: 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
e010: 52 20 3c 20 30 78 31 30 31 30 30 30 30 30 4c 20  R < 0x10100000L 
e020: 26 26 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53  && !defined(NO_S
e030: 53 4c 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  SL2) && !defined
e040: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 32  (OPENSSL_NO_SSL2
e050: 29 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50  ).    case TLS_P
e060: 52 4f 54 4f 5f 53 53 4c 32 3a 0a 09 6d 65 74 68  ROTO_SSL2:..meth
e070: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
e080: 53 53 4c 76 32 5f 73 65 72 76 65 72 5f 6d 65 74  SSLv2_server_met
e090: 68 6f 64 28 29 20 3a 20 53 53 4c 76 32 5f 63 6c  hod() : SSLv2_cl
e0a0: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 09  ient_method();..
e0b0: 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 23 69  break;.#endif.#i
e0c0: 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 53 53  f !defined(NO_SS
e0d0: 4c 33 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  L3) && !defined(
e0e0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 29  OPENSSL_NO_SSL3)
e0f0: 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45   && !defined(OPE
e100: 4e 53 53 4c 5f 4e 4f 5f 53 53 4c 33 5f 4d 45 54  NSSL_NO_SSL3_MET
e110: 48 4f 44 29 0a 20 20 20 20 63 61 73 65 20 54 4c  HOD).    case TL
e120: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 3a 0a 09 6d  S_PROTO_SSL3:..m
e130: 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72  ethod = isServer
e140: 20 3f 20 53 53 4c 76 33 5f 73 65 72 76 65 72 5f   ? SSLv3_server_
e150: 6d 65 74 68 6f 64 28 29 20 3a 20 53 53 4c 76 33  method() : SSLv3
e160: 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29  _client_method()
e170: 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66  ;..break;.#endif
e180: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f  .#if !defined(NO
e190: 5f 54 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e  _TLS1) && !defin
e1a0: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e1b0: 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  S1) && !defined(
e1c0: 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f  OPENSSL_NO_TLS1_
e1d0: 4d 45 54 48 4f 44 29 0a 20 20 20 20 63 61 73 65  METHOD).    case
e1e0: 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 3a   TLS_PROTO_TLS1:
e1f0: 0a 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72  ..method = isSer
e200: 76 65 72 20 3f 20 54 4c 53 76 31 5f 73 65 72 76  ver ? TLSv1_serv
e210: 65 72 5f 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c  er_method() : TL
e220: 53 76 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f  Sv1_client_metho
e230: 64 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e  d();..break;.#en
e240: 64 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64  dif.#if !defined
e250: 28 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21  (NO_TLS1_1) && !
e260: 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f  defined(OPENSSL_
e270: 4e 4f 5f 54 4c 53 31 5f 31 29 20 26 26 20 21 64  NO_TLS1_1) && !d
e280: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e290: 4f 5f 54 4c 53 31 5f 31 5f 4d 45 54 48 4f 44 29  O_TLS1_1_METHOD)
e2a0: 0a 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52  .    case TLS_PR
e2b0: 4f 54 4f 5f 54 4c 53 31 5f 31 3a 0a 09 6d 65 74  OTO_TLS1_1:..met
e2c0: 68 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f  hod = isServer ?
e2d0: 20 54 4c 53 76 31 5f 31 5f 73 65 72 76 65 72 5f   TLSv1_1_server_
e2e0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31  method() : TLSv1
e2f0: 5f 31 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64  _1_client_method
e300: 28 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64  ();..break;.#end
e310: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e320: 4e 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64  NO_TLS1_2) && !d
e330: 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e  efined(OPENSSL_N
e340: 4f 5f 54 4c 53 31 5f 32 29 20 26 26 20 21 64 65  O_TLS1_2) && !de
e350: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e360: 5f 54 4c 53 31 5f 32 5f 4d 45 54 48 4f 44 29 0a  _TLS1_2_METHOD).
e370: 20 20 20 20 63 61 73 65 20 54 4c 53 5f 50 52 4f      case TLS_PRO
e380: 54 4f 5f 54 4c 53 31 5f 32 3a 0a 09 6d 65 74 68  TO_TLS1_2:..meth
e390: 6f 64 20 3d 20 69 73 53 65 72 76 65 72 20 3f 20  od = isServer ? 
e3a0: 54 4c 53 76 31 5f 32 5f 73 65 72 76 65 72 5f 6d  TLSv1_2_server_m
e3b0: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 76 31 5f  ethod() : TLSv1_
e3c0: 32 5f 63 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28  2_client_method(
e3d0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69  );..break;.#endi
e3e0: 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  f.#if !defined(N
e3f0: 4f 5f 54 4c 53 31 5f 33 29 20 26 26 20 21 64 65  O_TLS1_3) && !de
e400: 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f  fined(OPENSSL_NO
e410: 5f 54 4c 53 31 5f 33 29 0a 20 20 20 20 63 61 73  _TLS1_3).    cas
e420: 65 20 54 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31  e TLS_PROTO_TLS1
e430: 5f 33 3a 0a 09 2f 2a 20 55 73 65 20 74 68 65 20  _3:../* Use the 
e440: 67 65 6e 65 72 69 63 20 6d 65 74 68 6f 64 20 61  generic method a
e450: 6e 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 72 61  nd constraint ra
e460: 6e 67 65 20 61 66 74 65 72 20 63 6f 6e 74 65 78  nge after contex
e470: 74 20 69 73 20 63 72 65 61 74 65 64 20 2a 2f 0a  t is created */.
e480: 09 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76  .method = isServ
e490: 65 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f  er ? TLS_server_
e4a0: 6d 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63  method() : TLS_c
e4b0: 6c 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a  lient_method();.
e4c0: 09 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 20  .break;.#endif. 
e4d0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 09 2f 2a 20     default:../* 
e4e0: 4e 65 67 6f 74 69 61 74 65 20 68 69 67 68 65 73  Negotiate highes
e4f0: 74 20 61 76 61 69 6c 61 62 6c 65 20 53 53 4c 2f  t available SSL/
e500: 54 4c 53 20 76 65 72 73 69 6f 6e 20 2a 2f 0a 09  TLS version */..
e510: 6d 65 74 68 6f 64 20 3d 20 69 73 53 65 72 76 65  method = isServe
e520: 72 20 3f 20 54 4c 53 5f 73 65 72 76 65 72 5f 6d  r ? TLS_server_m
e530: 65 74 68 6f 64 28 29 20 3a 20 54 4c 53 5f 63 6c  ethod() : TLS_cl
e540: 69 65 6e 74 5f 6d 65 74 68 6f 64 28 29 3b 0a 23  ient_method();.#
e550: 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
e560: 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 31 30  ON_NUMBER < 0x10
e570: 31 30 30 30 30 30 4c 20 26 26 20 21 64 65 66 69  100000L && !defi
e580: 6e 65 64 28 4e 4f 5f 53 53 4c 32 29 20 26 26 20  ned(NO_SSL2) && 
e590: 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53 53 4c  !defined(OPENSSL
e5a0: 5f 4e 4f 5f 53 53 4c 32 29 0a 09 6f 66 66 20 7c  _NO_SSL2)..off |
e5b0: 3d 20 28 45 4e 41 42 4c 45 44 28 70 72 6f 74 6f  = (ENABLED(proto
e5c0: 2c 20 54 4c 53 5f 50 52 4f 54 4f 5f 53 53 4c 32  , TLS_PROTO_SSL2
e5d0: 29 20 20 20 3f 20 30 20 3a 20 53 53 4c 5f 4f 50  )   ? 0 : SSL_OP
e5e0: 5f 4e 4f 5f 53 53 4c 76 32 29 3b 0a 23 65 6e 64  _NO_SSLv2);.#end
e5f0: 69 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  if.#if !defined(
e600: 4e 4f 5f 53 53 4c 33 29 20 26 26 20 21 64 65 66  NO_SSL3) && !def
e610: 69 6e 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f  ined(OPENSSL_NO_
e620: 53 53 4c 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  SSL3)..off |= (E
e630: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e640: 53 5f 50 52 4f 54 4f 5f 53 53 4c 33 29 20 20 20  S_PROTO_SSL3)   
e650: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e660: 53 53 4c 76 33 29 3b 0a 23 65 6e 64 69 66 0a 23  SSLv3);.#endif.#
e670: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e680: 4c 53 31 29 20 26 26 20 21 64 65 66 69 6e 65 64  LS1) && !defined
e690: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e6a0: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e6b0: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e6c0: 4f 54 4f 5f 54 4c 53 31 29 20 20 20 3f 20 30 20  OTO_TLS1)   ? 0 
e6d0: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
e6e0: 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 21  1);.#endif.#if !
e6f0: 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f  defined(NO_TLS1_
e700: 31 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 4f  1) && !defined(O
e710: 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 31  PENSSL_NO_TLS1_1
e720: 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41 42 4c  )..off |= (ENABL
e730: 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f 50 52  ED(proto, TLS_PR
e740: 4f 54 4f 5f 54 4c 53 31 5f 31 29 20 3f 20 30 20  OTO_TLS1_1) ? 0 
e750: 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c 53 76  : SSL_OP_NO_TLSv
e760: 31 5f 31 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  1_1);.#endif.#if
e770: 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 4c 53   !defined(NO_TLS
e780: 31 5f 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  1_2) && !defined
e790: 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c 53 31  (OPENSSL_NO_TLS1
e7a0: 5f 32 29 0a 09 6f 66 66 20 7c 3d 20 28 45 4e 41  _2)..off |= (ENA
e7b0: 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c 53 5f  BLED(proto, TLS_
e7c0: 50 52 4f 54 4f 5f 54 4c 53 31 5f 32 29 20 3f 20  PROTO_TLS1_2) ? 
e7d0: 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f 54 4c  0 : SSL_OP_NO_TL
e7e0: 53 76 31 5f 32 29 3b 0a 23 65 6e 64 69 66 0a 23  Sv1_2);.#endif.#
e7f0: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54  if !defined(NO_T
e800: 4c 53 31 5f 33 29 20 26 26 20 21 64 65 66 69 6e  LS1_3) && !defin
e810: 65 64 28 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 54 4c  ed(OPENSSL_NO_TL
e820: 53 31 5f 33 29 0a 09 6f 66 66 20 7c 3d 20 28 45  S1_3)..off |= (E
e830: 4e 41 42 4c 45 44 28 70 72 6f 74 6f 2c 20 54 4c  NABLED(proto, TL
e840: 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29 20  S_PROTO_TLS1_3) 
e850: 3f 20 30 20 3a 20 53 53 4c 5f 4f 50 5f 4e 4f 5f  ? 0 : SSL_OP_NO_
e860: 54 4c 53 76 31 5f 33 29 3b 0a 23 65 6e 64 69 66  TLSv1_3);.#endif
e870: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a  ..break;.    }..
e880: 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
e890: 72 6f 72 28 29 3b 0a 0a 20 20 20 20 63 74 78 20  ror();..    ctx 
e8a0: 3d 20 53 53 4c 5f 43 54 58 5f 6e 65 77 28 6d 65  = SSL_CTX_new(me
e8b0: 74 68 6f 64 29 3b 0a 20 20 20 20 69 66 20 28 21  thod);.    if (!
e8c0: 63 74 78 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e  ctx) {..return N
e8d0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
e8e0: 69 66 20 28 67 65 74 65 6e 76 28 53 53 4c 4b 45  if (getenv(SSLKE
e8f0: 59 4c 4f 47 46 49 4c 45 29 29 20 7b 0a 09 53 53  YLOGFILE)) {..SS
e900: 4c 5f 43 54 58 5f 73 65 74 5f 6b 65 79 6c 6f 67  L_CTX_set_keylog
e910: 5f 63 61 6c 6c 62 61 63 6b 28 63 74 78 2c 20 4b  _callback(ctx, K
e920: 65 79 4c 6f 67 43 61 6c 6c 62 61 63 6b 29 3b 0a  eyLogCallback);.
e930: 20 20 20 20 7d 0a 0a 23 69 66 20 21 64 65 66 69      }..#if !defi
e940: 6e 65 64 28 4e 4f 5f 54 4c 53 31 5f 33 29 20 26  ned(NO_TLS1_3) &
e950: 26 20 21 64 65 66 69 6e 65 64 28 4f 50 45 4e 53  & !defined(OPENS
e960: 53 4c 5f 4e 4f 5f 54 4c 53 31 5f 33 29 0a 20 20  SL_NO_TLS1_3).  
e970: 20 20 69 66 20 28 70 72 6f 74 6f 20 3d 3d 20 54    if (proto == T
e980: 4c 53 5f 50 52 4f 54 4f 5f 54 4c 53 31 5f 33 29  LS_PROTO_TLS1_3)
e990: 20 7b 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f   {..SSL_CTX_set_
e9a0: 6d 69 6e 5f 70 72 6f 74 6f 5f 76 65 72 73 69 6f  min_proto_versio
e9b0: 6e 28 63 74 78 2c 20 54 4c 53 31 5f 33 5f 56 45  n(ctx, TLS1_3_VE
e9c0: 52 53 49 4f 4e 29 3b 0a 09 53 53 4c 5f 43 54 58  RSION);..SSL_CTX
e9d0: 5f 73 65 74 5f 6d 61 78 5f 70 72 6f 74 6f 5f 76  _set_max_proto_v
e9e0: 65 72 73 69 6f 6e 28 63 74 78 2c 20 54 4c 53 31  ersion(ctx, TLS1
e9f0: 5f 33 5f 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20  _3_VERSION);.   
ea00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
ea10: 2a 20 46 6f 72 63 65 20 63 69 70 68 65 72 20 73  * Force cipher s
ea20: 65 6c 65 63 74 69 6f 6e 20 6f 72 64 65 72 20 62  election order b
ea30: 79 20 73 65 72 76 65 72 20 2a 2f 0a 20 20 20 20  y server */.    
ea40: 69 66 20 28 21 69 73 53 65 72 76 65 72 29 20 7b  if (!isServer) {
ea50: 0a 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 6f 70  ..SSL_CTX_set_op
ea60: 74 69 6f 6e 73 28 63 74 78 2c 20 53 53 4c 5f 4f  tions(ctx, SSL_O
ea70: 50 5f 43 49 50 48 45 52 5f 53 45 52 56 45 52 5f  P_CIPHER_SERVER_
ea80: 50 52 45 46 45 52 45 4e 43 45 29 3b 0a 20 20 20  PREFERENCE);.   
ea90: 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53 4c 5f   }..#if OPENSSL_
eaa0: 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c  VERSION_NUMBER <
eab0: 20 30 78 31 30 31 30 30 30 30 30 4c 0a 20 20 20   0x10100000L.   
eac0: 20 4f 70 65 6e 53 53 4c 5f 61 64 64 5f 61 6c 6c   OpenSSL_add_all
ead0: 5f 61 6c 67 6f 72 69 74 68 6d 73 28 29 3b 20 2f  _algorithms(); /
eae0: 2a 20 4c 6f 61 64 20 63 69 70 68 65 72 73 20 61  * Load ciphers a
eaf0: 6e 64 20 64 69 67 65 73 74 73 20 2a 2f 0a 23 65  nd digests */.#e
eb00: 6e 64 69 66 0a 0a 20 20 20 20 53 53 4c 5f 43 54  ndif..    SSL_CT
eb10: 58 5f 73 65 74 5f 61 70 70 5f 64 61 74 61 28 63  X_set_app_data(c
eb20: 74 78 2c 20 28 76 6f 69 64 2a 29 69 6e 74 65 72  tx, (void*)inter
eb30: 70 29 3b 09 2f 2a 20 72 65 6d 65 6d 62 65 72 20  p);./* remember 
eb40: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  the interpreter 
eb50: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
eb60: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
eb70: 53 53 4c 5f 4f 50 5f 41 4c 4c 29 3b 09 2f 2a 20  SSL_OP_ALL);./* 
eb80: 45 6e 61 62 6c 65 20 61 6c 6c 20 53 53 4c 20 62  Enable all SSL b
eb90: 75 67 20 77 6f 72 6b 61 72 6f 75 6e 64 73 20 2a  ug workarounds *
eba0: 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73 65  /.    SSL_CTX_se
ebb0: 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20 53  t_options(ctx, S
ebc0: 53 4c 5f 4f 50 5f 4e 4f 5f 43 4f 4d 50 52 45 53  SL_OP_NO_COMPRES
ebd0: 53 49 4f 4e 29 3b 09 2f 2a 20 44 69 73 61 62 6c  SION);./* Disabl
ebe0: 65 20 63 6f 6d 70 72 65 73 73 69 6f 6e 20 65 76  e compression ev
ebf0: 65 6e 20 69 66 20 73 75 70 70 6f 72 74 65 64 20  en if supported 
ec00: 2a 2f 0a 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  */.    SSL_CTX_s
ec10: 65 74 5f 6f 70 74 69 6f 6e 73 28 63 74 78 2c 20  et_options(ctx, 
ec20: 6f 66 66 29 3b 09 09 2f 2a 20 44 69 73 61 62 6c  off);../* Disabl
ec30: 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 74  e specified prot
ec40: 6f 63 6f 6c 20 76 65 72 73 69 6f 6e 73 20 2a 2f  ocol versions */
ec50: 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 77 20 77  ..    /* Allow w
ec60: 72 69 74 65 73 20 74 6f 20 72 65 70 6f 72 74 20  rites to report 
ec70: 73 75 63 63 65 73 73 20 77 68 65 6e 20 6c 65 73  success when les
ec80: 73 20 74 68 61 6e 20 61 6c 6c 20 72 65 63 6f 72  s than all recor
ec90: 64 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ds have been wri
eca0: 74 74 65 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  tten */.    SSL_
ecb0: 43 54 58 5f 73 65 74 5f 6d 6f 64 65 28 63 74 78  CTX_set_mode(ctx
ecc0: 2c 20 53 53 4c 5f 4d 4f 44 45 5f 45 4e 41 42 4c  , SSL_MODE_ENABL
ecd0: 45 5f 50 41 52 54 49 41 4c 5f 57 52 49 54 45 29  E_PARTIAL_WRITE)
ece0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 69 73 61 62 6c  ;..    /* Disabl
ecf0: 65 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74 72  e attempts to tr
ed00: 79 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65  y to process the
ed10: 20 6e 65 78 74 20 72 65 63 6f 72 64 20 69 6e 73   next record ins
ed20: 74 65 61 64 20 6f 66 20 72 65 74 75 72 6e 69 6e  tead of returnin
ed30: 67 20 61 66 74 65 72 20 61 0a 20 20 20 20 20 20  g after a.      
ed40: 20 6e 6f 6e 2d 61 70 70 20 72 65 63 6f 72 64 2e   non-app record.
ed50: 20 41 76 6f 69 64 73 20 68 61 6e 67 73 20 69 6e   Avoids hangs in
ed60: 20 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20   blocking mode, 
ed70: 77 68 65 6e 20 75 73 69 6e 67 20 53 53 4c 5f 72  when using SSL_r
ed80: 65 61 64 28 29 20 61 6e 64 20 61 0a 20 20 20 20  ead() and a.    
ed90: 20 20 20 6e 6f 6e 2d 61 70 70 6c 69 63 61 74 69     non-applicati
eda0: 6f 6e 20 72 65 63 6f 72 64 20 77 61 73 20 73 65  on record was se
edb0: 6e 74 20 61 6e 64 20 6e 6f 20 61 70 70 6c 69 63  nt and no applic
edc0: 61 74 69 6f 6e 20 64 61 74 61 20 77 61 73 20 73  ation data was s
edd0: 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f  ent. */.    SSL_
ede0: 43 54 58 5f 63 6c 65 61 72 5f 6d 6f 64 65 28 63  CTX_clear_mode(c
edf0: 74 78 2c 20 53 53 4c 5f 4d 4f 44 45 5f 41 55 54  tx, SSL_MODE_AUT
ee00: 4f 5f 52 45 54 52 59 29 3b 0a 0a 20 20 20 20 53  O_RETRY);..    S
ee10: 53 4c 5f 43 54 58 5f 73 65 73 73 5f 73 65 74 5f  SL_CTX_sess_set_
ee20: 63 61 63 68 65 5f 73 69 7a 65 28 63 74 78 2c 20  cache_size(ctx, 
ee30: 31 32 38 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  128);..    /* Se
ee40: 74 20 75 73 65 72 20 64 65 66 69 6e 65 64 20 63  t user defined c
ee50: 69 70 68 65 72 73 2c 20 63 69 70 68 65 72 20 73  iphers, cipher s
ee60: 75 69 74 65 73 2c 20 61 6e 64 20 73 65 63 75 72  uites, and secur
ee70: 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 20  ity level */.   
ee80: 20 69 66 20 28 28 63 69 70 68 65 72 73 20 21 3d   if ((ciphers !=
ee90: 20 4e 55 4c 4c 29 20 26 26 20 21 53 53 4c 5f 43   NULL) && !SSL_C
eea0: 54 58 5f 73 65 74 5f 63 69 70 68 65 72 5f 6c 69  TX_set_cipher_li
eeb0: 73 74 28 63 74 78 2c 20 63 69 70 68 65 72 73 29  st(ctx, ciphers)
eec0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
eed0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
eee0: 65 74 20 63 69 70 68 65 72 73 20 66 61 69 6c 65  et ciphers faile
eef0: 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69 70 68  d: No valid ciph
ef00: 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29 20 4e  ers", (char *) N
ef10: 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58 5f 66  ULL);..SSL_CTX_f
ef20: 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74 75 72  ree(ctx);..retur
ef30: 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  n NULL;.    }.  
ef40: 20 20 69 66 20 28 28 63 69 70 68 65 72 73 75 69    if ((ciphersui
ef50: 74 65 73 20 21 3d 20 4e 55 4c 4c 29 20 26 26 20  tes != NULL) && 
ef60: 21 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 69 70  !SSL_CTX_set_cip
ef70: 68 65 72 73 75 69 74 65 73 28 63 74 78 2c 20 63  hersuites(ctx, c
ef80: 69 70 68 65 72 73 75 69 74 65 73 29 29 20 7b 0a  iphersuites)) {.
ef90: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
efa0: 74 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 63  t(interp, "Set c
efb0: 69 70 68 65 72 20 73 75 69 74 65 73 20 66 61 69  ipher suites fai
efc0: 6c 65 64 3a 20 4e 6f 20 76 61 6c 69 64 20 63 69  led: No valid ci
efd0: 70 68 65 72 73 22 2c 20 28 63 68 61 72 20 2a 29  phers", (char *)
efe0: 20 4e 55 4c 4c 29 3b 0a 09 53 53 4c 5f 43 54 58   NULL);..SSL_CTX
eff0: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 72 65 74  _free(ctx);..ret
f000: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  urn NULL;.    }.
f010: 0a 20 20 20 20 2f 2a 20 53 65 74 20 73 65 63 75  .    /* Set secu
f020: 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 20 20  rity level */.  
f030: 20 20 69 66 20 28 6c 65 76 65 6c 20 3e 20 2d 31    if (level > -1
f040: 20 26 26 20 6c 65 76 65 6c 20 3c 20 36 29 20 7b   && level < 6) {
f050: 0a 09 2f 2a 20 53 53 4c 5f 73 65 74 5f 73 65 63  ../* SSL_set_sec
f060: 75 72 69 74 79 5f 6c 65 76 65 6c 20 2a 2f 0a 09  urity_level */..
f070: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 73 65 63 75  SSL_CTX_set_secu
f080: 72 69 74 79 5f 6c 65 76 65 6c 28 63 74 78 2c 20  rity_level(ctx, 
f090: 6c 65 76 65 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20  level);.    }.. 
f0a0: 20 20 20 2f 2a 20 73 65 74 20 73 6f 6d 65 20 63     /* set some c
f0b0: 61 6c 6c 62 61 63 6b 73 20 2a 2f 0a 20 20 20 20  allbacks */.    
f0c0: 53 53 4c 5f 43 54 58 5f 73 65 74 5f 64 65 66 61  SSL_CTX_set_defa
f0d0: 75 6c 74 5f 70 61 73 73 77 64 5f 63 62 28 63 74  ult_passwd_cb(ct
f0e0: 78 2c 20 50 61 73 73 77 6f 72 64 43 61 6c 6c 62  x, PasswordCallb
f0f0: 61 63 6b 29 3b 0a 20 20 20 20 53 53 4c 5f 43 54  ack);.    SSL_CT
f100: 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f 70 61  X_set_default_pa
f110: 73 73 77 64 5f 63 62 5f 75 73 65 72 64 61 74 61  sswd_cb_userdata
f120: 28 63 74 78 2c 20 28 76 6f 69 64 20 2a 29 73 74  (ctx, (void *)st
f130: 61 74 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a  atePtr);..    /*
f140: 20 72 65 61 64 20 61 20 44 69 66 66 69 65 2d 48   read a Diffie-H
f150: 65 6c 6c 6d 61 6e 20 70 61 72 61 6d 65 74 65 72  ellman parameter
f160: 73 20 66 69 6c 65 2c 20 6f 72 20 75 73 65 20 74  s file, or use t
f170: 68 65 20 62 75 69 6c 74 2d 69 6e 20 6f 6e 65 20  he built-in one 
f180: 2a 2f 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69  */.    Tcl_DStri
f190: 6e 67 49 6e 69 74 28 26 64 73 29 3b 0a 23 69 66  ngInit(&ds);.#if
f1a0: 64 65 66 20 4f 50 45 4e 53 53 4c 5f 4e 4f 5f 44  def OPENSSL_NO_D
f1b0: 48 0a 20 20 20 20 69 66 20 28 44 48 70 61 72 61  H.    if (DHpara
f1c0: 6d 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ms != NULL) {..T
f1d0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
f1e0: 69 6e 74 65 72 70 2c 20 22 44 48 20 70 61 72 61  interp, "DH para
f1f0: 6d 65 74 65 72 20 73 75 70 70 6f 72 74 20 6e 6f  meter support no
f200: 74 20 61 76 61 69 6c 61 62 6c 65 22 2c 20 28 63  t available", (c
f210: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 53  har *) NULL);..S
f220: 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74 78 29  SL_CTX_free(ctx)
f230: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a  ;..return NULL;.
f240: 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
f250: 7b 0a 09 44 48 2a 20 64 68 3b 0a 09 69 66 20 28  {..DH* dh;..if (
f260: 44 48 70 61 72 61 6d 73 20 21 3d 20 4e 55 4c 4c  DHparams != NULL
f270: 29 20 7b 0a 09 20 20 20 20 42 49 4f 20 2a 62 69  ) {..    BIO *bi
f280: 6f 3b 0a 0a 09 20 20 20 20 62 69 6f 20 3d 20 42  o;...    bio = B
f290: 49 4f 5f 6e 65 77 5f 66 69 6c 65 28 46 32 4e 28  IO_new_file(F2N(
f2a0: 44 48 70 61 72 61 6d 73 2c 20 26 64 73 29 2c 20  DHparams, &ds), 
f2b0: 22 72 22 29 3b 0a 09 20 20 20 20 69 66 20 28 21  "r");..    if (!
f2c0: 62 69 6f 29 20 7b 0a 09 09 54 63 6c 5f 44 53 74  bio) {...Tcl_DSt
f2d0: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f2e0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
f2f0: 74 28 69 6e 74 65 72 70 2c 20 22 43 6f 75 6c 64  t(interp, "Could
f300: 20 6e 6f 74 20 66 69 6e 64 20 44 48 20 70 61 72   not find DH par
f310: 61 6d 65 74 65 72 73 20 66 69 6c 65 22 2c 20 28  ameters file", (
f320: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f330: 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 63 74  .SSL_CTX_free(ct
f340: 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c  x);...return NUL
f350: 4c 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  L;..    }...    
f360: 64 68 20 3d 20 50 45 4d 5f 72 65 61 64 5f 62 69  dh = PEM_read_bi
f370: 6f 5f 44 48 70 61 72 61 6d 73 28 62 69 6f 2c 20  o_DHparams(bio, 
f380: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  NULL, NULL, NULL
f390: 29 3b 0a 09 20 20 20 20 42 49 4f 5f 66 72 65 65  );..    BIO_free
f3a0: 28 62 69 6f 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (bio);..    Tcl_
f3b0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 29  DStringFree(&ds)
f3c0: 3b 0a 09 20 20 20 20 69 66 20 28 21 64 68 29 20  ;..    if (!dh) 
f3d0: 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65  {...Tcl_AppendRe
f3e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 6f  sult(interp, "Co
f3f0: 75 6c 64 20 6e 6f 74 20 72 65 61 64 20 44 48 20  uld not read DH 
f400: 70 61 72 61 6d 65 74 65 72 73 20 66 72 6f 6d 20  parameters from 
f410: 66 69 6c 65 22 2c 20 28 63 68 61 72 20 2a 29 20  file", (char *) 
f420: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f430: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f440: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f450: 7d 0a 09 20 20 20 20 53 53 4c 5f 43 54 58 5f 73  }..    SSL_CTX_s
f460: 65 74 5f 74 6d 70 5f 64 68 28 63 74 78 2c 20 64  et_tmp_dh(ctx, d
f470: 68 29 3b 0a 09 20 20 20 20 44 48 5f 66 72 65 65  h);..    DH_free
f480: 28 64 68 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b  (dh);...} else {
f490: 0a 09 20 20 20 20 2f 2a 20 55 73 65 20 77 65 6c  ..    /* Use wel
f4a0: 6c 20 6b 6e 6f 77 6e 20 44 48 20 70 61 72 61 6d  l known DH param
f4b0: 65 74 65 72 73 20 74 68 61 74 20 68 61 76 65 20  eters that have 
f4c0: 62 75 69 6c 74 2d 69 6e 20 73 75 70 70 6f 72 74  built-in support
f4d0: 20 69 6e 20 4f 70 65 6e 53 53 4c 20 2a 2f 0a 09   in OpenSSL */..
f4e0: 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
f4f0: 5f 73 65 74 5f 64 68 5f 61 75 74 6f 28 63 74 78  _set_dh_auto(ctx
f500: 2c 20 31 29 29 20 7b 0a 09 09 54 63 6c 5f 41 70  , 1)) {...Tcl_Ap
f510: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
f520: 70 2c 20 22 43 6f 75 6c 64 20 6e 6f 74 20 65 6e  p, "Could not en
f530: 61 62 6c 65 20 73 65 74 20 44 48 20 61 75 74 6f  able set DH auto
f540: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41  : ", GET_ERR_REA
f550: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20  SON(), (char *) 
f560: 4e 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58  NULL);...SSL_CTX
f570: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65  _free(ctx);...re
f580: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20  turn NULL;..    
f590: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69  }..}.    }.#endi
f5a0: 66 0a 0a 20 20 20 20 2f 2a 20 73 65 74 20 6f 75  f..    /* set ou
f5b0: 72 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f  r certificate */
f5c0: 0a 20 20 20 20 6c 6f 61 64 5f 70 72 69 76 61 74  .    load_privat
f5d0: 65 5f 6b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  e_key = 0;.    i
f5e0: 66 20 28 63 65 72 74 66 69 6c 65 20 21 3d 20 4e  f (certfile != N
f5f0: 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72 69  ULL) {..load_pri
f600: 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 0a 09  vate_key = 1;...
f610: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f620: 63 65 72 74 69 66 69 63 61 74 65 5f 66 69 6c 65  certificate_file
f630: 28 63 74 78 2c 20 46 32 4e 28 63 65 72 74 66 69  (ctx, F2N(certfi
f640: 6c 65 2c 20 26 64 73 29 2c 20 53 53 4c 5f 46 49  le, &ds), SSL_FI
f650: 4c 45 54 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30  LETYPE_PEM) <= 0
f660: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74  ) {..    Tcl_DSt
f670: 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
f680: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
f690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e  sult(interp, "un
f6a0: 61 62 6c 65 20 74 6f 20 73 65 74 20 63 65 72 74  able to set cert
f6b0: 69 66 69 63 61 74 65 20 66 69 6c 65 20 22 2c 20  ificate file ", 
f6c0: 63 65 72 74 66 69 6c 65 2c 20 22 3a 20 22 2c 0a  certfile, ": ",.
f6d0: 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e  ..GET_ERR_REASON
f6e0: 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  (), (char *) NUL
f6f0: 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54 58  L);..    SSL_CTX
f700: 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20 20  _free(ctx);..   
f710: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d   return NULL;..}
f720: 0a 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65  ..Tcl_DStringFre
f730: 65 28 26 64 73 29 3b 0a 0a 20 20 20 20 7d 20 65  e(&ds);..    } e
f740: 6c 73 65 20 69 66 20 28 63 65 72 74 20 21 3d 20  lse if (cert != 
f750: 4e 55 4c 4c 29 20 7b 0a 09 6c 6f 61 64 5f 70 72  NULL) {..load_pr
f760: 69 76 61 74 65 5f 6b 65 79 20 3d 20 31 3b 0a 09  ivate_key = 1;..
f770: 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f  if (SSL_CTX_use_
f780: 63 65 72 74 69 66 69 63 61 74 65 5f 41 53 4e 31  certificate_ASN1
f790: 28 63 74 78 2c 20 28 69 6e 74 29 20 63 65 72 74  (ctx, (int) cert
f7a0: 5f 6c 65 6e 2c 20 63 65 72 74 29 20 3c 3d 20 30  _len, cert) <= 0
f7b0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70  ) {..    Tcl_App
f7c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
f7d0: 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74  , "unable to set
f7e0: 20 63 65 72 74 69 66 69 63 61 74 65 3a 20 22 2c   certificate: ",
f7f0: 0a 09 09 47 45 54 5f 45 52 52 5f 52 45 41 53 4f  ...GET_ERR_REASO
f800: 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  N(), (char *) NU
f810: 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f 43 54  LL);..    SSL_CT
f820: 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09 20 20  X_free(ctx);..  
f830: 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09    return NULL;..
f840: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  }.    } else {..
f850: 63 65 72 74 66 69 6c 65 20 3d 20 28 63 68 61 72  certfile = (char
f860: 2a 29 58 35 30 39 5f 67 65 74 5f 64 65 66 61 75  *)X509_get_defau
f870: 6c 74 5f 63 65 72 74 5f 66 69 6c 65 28 29 3b 0a  lt_cert_file();.
f880: 0a 09 69 66 20 28 53 53 4c 5f 43 54 58 5f 75 73  ..if (SSL_CTX_us
f890: 65 5f 63 65 72 74 69 66 69 63 61 74 65 5f 66 69  e_certificate_fi
f8a0: 6c 65 28 63 74 78 2c 20 63 65 72 74 66 69 6c 65  le(ctx, certfile
f8b0: 2c 20 53 53 4c 5f 46 49 4c 45 54 59 50 45 5f 50  , SSL_FILETYPE_P
f8c0: 45 4d 29 20 3c 3d 20 30 29 20 7b 0a 23 69 66 20  EM) <= 0) {.#if 
f8d0: 30 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  0..    Tcl_Appen
f8e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
f8f0: 22 75 6e 61 62 6c 65 20 74 6f 20 75 73 65 20 64  "unable to use d
f900: 65 66 61 75 6c 74 20 63 65 72 74 69 66 69 63 61  efault certifica
f910: 74 65 20 66 69 6c 65 20 22 2c 20 63 65 72 74 66  te file ", certf
f920: 69 6c 65 2c 20 22 3a 20 22 2c 0a 09 09 47 45 54  ile, ": ",...GET
f930: 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c 20 28  _ERR_REASON(), (
f940: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09  char *) NULL);..
f950: 20 20 20 20 53 53 4c 5f 43 54 58 5f 66 72 65 65      SSL_CTX_free
f960: 28 63 74 78 29 3b 0a 09 20 20 20 20 72 65 74 75  (ctx);..    retu
f970: 72 6e 20 4e 55 4c 4c 3b 0a 23 65 6e 64 69 66 0a  rn NULL;.#endif.
f980: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  .}.    }..    /*
f990: 20 73 65 74 20 6f 75 72 20 70 72 69 76 61 74 65   set our private
f9a0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
f9b0: 6c 6f 61 64 5f 70 72 69 76 61 74 65 5f 6b 65 79  load_private_key
f9c0: 29 20 7b 0a 09 69 66 20 28 6b 65 79 66 69 6c 65  ) {..if (keyfile
f9d0: 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6b 65 79 20   == NULL && key 
f9e0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
f9f0: 6b 65 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69  keyfile = certfi
fa00: 6c 65 3b 0a 09 7d 0a 0a 09 69 66 20 28 6b 65 79  le;..}...if (key
fa10: 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  file != NULL) {.
fa20: 09 20 20 20 20 2f 2a 20 67 65 74 20 74 68 65 20  .    /* get the 
fa30: 70 72 69 76 61 74 65 20 6b 65 79 20 61 73 73 6f  private key asso
fa40: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69 73  ciated with this
fa50: 20 63 65 72 74 69 66 69 63 61 74 65 20 2a 2f 0a   certificate */.
fa60: 09 20 20 20 20 69 66 20 28 6b 65 79 66 69 6c 65  .    if (keyfile
fa70: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6b 65   == NULL) {...ke
fa80: 79 66 69 6c 65 20 3d 20 63 65 72 74 66 69 6c 65  yfile = certfile
fa90: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69  ;..    }...    i
faa0: 66 20 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50  f (SSL_CTX_use_P
fab0: 72 69 76 61 74 65 4b 65 79 5f 66 69 6c 65 28 63  rivateKey_file(c
fac0: 74 78 2c 20 46 32 4e 28 6b 65 79 66 69 6c 65 2c  tx, F2N(keyfile,
fad0: 20 26 64 73 29 2c 20 53 53 4c 5f 46 49 4c 45 54   &ds), SSL_FILET
fae0: 59 50 45 5f 50 45 4d 29 20 3c 3d 20 30 29 20 7b  YPE_PEM) <= 0) {
faf0: 0a 09 09 54 63 6c 5f 44 53 74 72 69 6e 67 46 72  ...Tcl_DStringFr
fb00: 65 65 28 26 64 73 29 3b 0a 09 09 2f 2a 20 66 6c  ee(&ds);.../* fl
fb10: 75 73 68 20 74 68 65 20 70 61 73 73 70 68 72 61  ush the passphra
fb20: 73 65 20 77 68 69 63 68 20 6d 69 67 68 74 20 62  se which might b
fb30: 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 72 65  e left in the re
fb40: 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c 5f 53 65  sult */...Tcl_Se
fb50: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
fb60: 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41 54 49 43  NULL, TCL_STATIC
fb70: 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52  );...Tcl_AppendR
fb80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
fb90: 6e 61 62 6c 65 20 74 6f 20 73 65 74 20 70 75 62  nable to set pub
fba0: 6c 69 63 20 6b 65 79 20 66 69 6c 65 20 22 2c 20  lic key file ", 
fbb0: 6b 65 79 66 69 6c 65 2c 20 22 20 22 2c 0a 09 09  keyfile, " ",...
fbc0: 20 20 20 20 47 45 54 5f 45 52 52 5f 52 45 41 53      GET_ERR_REAS
fbd0: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e  ON(), (char *) N
fbe0: 55 4c 4c 29 3b 0a 09 09 53 53 4c 5f 43 54 58 5f  ULL);...SSL_CTX_
fbf0: 66 72 65 65 28 63 74 78 29 3b 0a 09 09 72 65 74  free(ctx);...ret
fc00: 75 72 6e 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d  urn NULL;..    }
fc10: 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  ..    Tcl_DStrin
fc20: 67 46 72 65 65 28 26 64 73 29 3b 0a 0a 09 7d 20  gFree(&ds);...} 
fc30: 65 6c 73 65 20 69 66 20 28 6b 65 79 20 21 3d 20  else if (key != 
fc40: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
fc50: 28 53 53 4c 5f 43 54 58 5f 75 73 65 5f 50 72 69  (SSL_CTX_use_Pri
fc60: 76 61 74 65 4b 65 79 5f 41 53 4e 31 28 45 56 50  vateKey_ASN1(EVP
fc70: 5f 50 4b 45 59 5f 52 53 41 2c 20 63 74 78 2c 20  _PKEY_RSA, ctx, 
fc80: 6b 65 79 2c 20 28 69 6e 74 29 20 6b 65 79 5f 6c  key, (int) key_l
fc90: 65 6e 29 20 3c 3d 20 30 29 20 7b 0a 09 09 2f 2a  en) <= 0) {.../*
fca0: 20 66 6c 75 73 68 20 74 68 65 20 70 61 73 73 70   flush the passp
fcb0: 68 72 61 73 65 20 77 68 69 63 68 20 6d 69 67 68  hrase which migh
fcc0: 74 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68 65  t be left in the
fcd0: 20 72 65 73 75 6c 74 20 2a 2f 0a 09 09 54 63 6c   result */...Tcl
fce0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
fcf0: 70 2c 20 4e 55 4c 4c 2c 20 54 43 4c 5f 53 54 41  p, NULL, TCL_STA
fd00: 54 49 43 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65  TIC);...Tcl_Appe
fd10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fd20: 20 22 75 6e 61 62 6c 65 20 74 6f 20 73 65 74 20   "unable to set 
fd30: 70 75 62 6c 69 63 20 6b 65 79 3a 20 22 2c 20 47  public key: ", G
fd40: 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 2c  ET_ERR_REASON(),
fd50: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
fd60: 0a 09 09 53 53 4c 5f 43 54 58 5f 66 72 65 65 28  ...SSL_CTX_free(
fd70: 63 74 78 29 3b 0a 09 09 72 65 74 75 72 6e 20 4e  ctx);...return N
fd80: 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ULL;..    }..}..
fd90: 2f 2a 20 4e 6f 77 20 77 65 20 6b 6e 6f 77 20 74  /* Now we know t
fda0: 68 61 74 20 61 20 6b 65 79 20 61 6e 64 20 63 65  hat a key and ce
fdb0: 72 74 20 68 61 76 65 20 62 65 65 6e 20 73 65 74  rt have been set
fdc0: 20 61 67 61 69 6e 73 74 0a 09 20 2a 20 74 68 65   against.. * the
fdd0: 20 53 53 4c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a   SSL context */.
fde0: 09 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 63 68  .if (!SSL_CTX_ch
fdf0: 65 63 6b 5f 70 72 69 76 61 74 65 5f 6b 65 79 28  eck_private_key(
fe00: 63 74 78 29 29 20 7b 0a 09 20 20 20 20 54 63 6c  ctx)) {..    Tcl
fe10: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
fe20: 74 65 72 70 2c 20 22 70 72 69 76 61 74 65 20 6b  terp, "private k
fe30: 65 79 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  ey does not matc
fe40: 68 20 74 68 65 20 63 65 72 74 69 66 69 63 61 74  h the certificat
fe50: 65 20 70 75 62 6c 69 63 20 6b 65 79 22 2c 0a 09  e public key",..
fe60: 09 09 20 20 20 20 20 28 63 68 61 72 20 2a 29 20  ..     (char *) 
fe70: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 53 53 4c 5f  NULL);..    SSL_
fe80: 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 09  CTX_free(ctx);..
fe90: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
fea0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ..}.    }..    /
feb0: 2a 20 53 65 74 20 74 6f 20 75 73 65 20 74 68 65  * Set to use the
fec0: 20 64 65 66 61 75 6c 74 20 6c 6f 63 61 74 69 6f   default locatio
fed0: 6e 20 61 6e 64 20 66 69 6c 65 20 66 6f 72 20 43  n and file for C
fee0: 65 72 74 69 66 69 63 61 74 65 20 41 75 74 68 6f  ertificate Autho
fef0: 72 69 74 79 20 28 43 41 29 20 63 65 72 74 69 66  rity (CA) certif
ff00: 69 63 61 74 65 73 2e 0a 20 20 20 20 20 2a 20 54  icates..     * T
ff10: 68 65 20 64 65 66 61 75 6c 74 20 43 41 20 63 65  he default CA ce
ff20: 72 74 69 66 69 63 61 74 65 73 20 64 69 72 65 63  rtificates direc
ff30: 74 6f 72 79 20 69 73 20 63 61 6c 6c 65 64 20 63  tory is called c
ff40: 65 72 74 73 20 69 6e 20 74 68 65 20 64 65 66 61  erts in the defa
ff50: 75 6c 74 20 4f 70 65 6e 53 53 4c 0a 20 20 20 20  ult OpenSSL.    
ff60: 20 2a 20 64 69 72 65 63 74 6f 72 79 2e 20 49 74   * directory. It
ff70: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 43 41   contains the CA
ff80: 20 63 65 72 74 69 66 69 63 61 74 65 73 20 69 6e   certificates in
ff90: 20 50 45 4d 20 66 6f 72 6d 61 74 2c 20 77 69 74   PEM format, wit
ffa0: 68 20 6f 6e 65 20 63 65 72 74 69 66 69 63 61 74  h one certificat
ffb0: 65 20 70 65 72 0a 20 20 20 20 20 2a 20 66 69 6c  e per.     * fil
ffc0: 65 2e 20 54 68 65 20 76 65 72 69 66 79 20 70 61  e. The verify pa
ffd0: 74 68 20 61 6e 64 20 73 74 6f 72 65 20 63 61 6e  th and store can
ffe0: 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 62   be overridden b
fff0: 79 20 74 68 65 20 53 53 4c 5f 43 45 52 54 5f 44  y the SSL_CERT_D
10000 49 52 20 65 6e 76 20 76 61 72 2e 20 54 68 65 0a  IR env var. The.
10010 20 20 20 20 20 2a 20 64 65 66 61 75 6c 74 20 43       * default C
10020 41 20 63 65 72 74 69 66 69 63 61 74 65 73 20 66  A certificates f
10030 69 6c 65 20 69 73 20 63 61 6c 6c 65 64 20 63 65  ile is called ce
10040 72 74 2e 70 65 6d 20 69 6e 20 74 68 65 20 64 65  rt.pem in the de
10050 66 61 75 6c 74 20 4f 70 65 6e 53 53 4c 20 64 69  fault OpenSSL di
10060 72 65 63 74 6f 72 79 2e 0a 20 20 20 20 20 2a 20  rectory..     * 
10070 54 68 65 20 76 65 72 69 66 79 20 66 69 6c 65 20  The verify file 
10080 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64 65  can be overridde
10090 6e 20 62 79 20 74 68 65 20 53 53 4c 5f 43 45 52  n by the SSL_CER
100a0 54 5f 46 49 4c 45 20 65 6e 76 20 76 61 72 2e 20  T_FILE env var. 
100b0 2a 2f 0a 20 20 20 20 69 66 20 28 21 53 53 4c 5f  */.    if (!SSL_
100c0 43 54 58 5f 73 65 74 5f 64 65 66 61 75 6c 74 5f  CTX_set_default_
100d0 76 65 72 69 66 79 5f 70 61 74 68 73 28 63 74 78  verify_paths(ctx
100e0 29 29 20 7b 0a 09 61 62 6f 72 74 2b 2b 3b 0a 20  )) {..abort++;. 
100f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65     }..    /* Ove
10100 72 72 69 64 65 73 20 66 6f 72 20 74 68 65 20 43  rrides for the C
10110 41 20 76 65 72 69 66 79 20 70 61 74 68 20 61 6e  A verify path an
10120 64 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 7b 0a  d file */.    {.
10130 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53  #if OPENSSL_VERS
10140 49 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33  ION_NUMBER < 0x3
10150 30 30 30 30 30 30 30 4c 0a 09 69 66 20 28 43 41  0000000L..if (CA
10160 70 61 74 68 20 21 3d 20 4e 55 4c 4c 20 7c 7c 20  path != NULL || 
10170 43 41 66 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20  CAfile != NULL) 
10180 7b 0a 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69  {..    Tcl_DStri
10190 6e 67 20 64 73 31 3b 0a 09 20 20 20 20 54 63 6c  ng ds1;..    Tcl
101a0 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64 73  _DStringInit(&ds
101b0 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28 21 53  1);...    if (!S
101c0 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76 65 72 69  SL_CTX_load_veri
101d0 66 79 5f 6c 6f 63 61 74 69 6f 6e 73 28 63 74 78  fy_locations(ctx
101e0 2c 20 46 32 4e 28 43 41 66 69 6c 65 2c 20 26 64  , F2N(CAfile, &d
101f0 73 29 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20  s), F2N(CApath, 
10200 26 64 73 31 29 29 29 20 7b 0a 09 09 61 62 6f 72  &ds1))) {...abor
10210 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  t++;..    }..   
10220 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
10230 28 26 64 73 29 3b 0a 09 20 20 20 20 54 63 6c 5f  (&ds);..    Tcl_
10240 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 73 31  DStringFree(&ds1
10250 29 3b 0a 0a 09 20 20 20 20 2f 2a 20 53 65 74 20  );...    /* Set 
10260 6c 69 73 74 20 6f 66 20 43 41 73 20 74 6f 20 73  list of CAs to s
10270 65 6e 64 20 74 6f 20 63 6c 69 65 6e 74 20 77 68  end to client wh
10280 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 61 20  en requesting a 
10290 63 6c 69 65 6e 74 20 63 65 72 74 69 66 69 63 61  client certifica
102a0 74 65 20 2a 2f 0a 09 20 20 20 20 2f 2a 20 68 74  te */..    /* ht
102b0 74 70 73 3a 2f 2f 73 6f 75 72 63 65 66 6f 72 67  tps://sourceforg
102c0 65 2e 6e 65 74 2f 70 2f 74 6c 73 2f 62 75 67 73  e.net/p/tls/bugs
102d0 2f 35 37 2f 20 2a 2f 0a 09 20 20 20 20 2f 2a 20  /57/ */..    /* 
102e0 58 58 58 3a 54 4f 44 4f 3a 20 4c 65 74 20 74 68  XXX:TODO: Let th
102f0 65 20 75 73 65 72 20 73 75 70 70 6c 79 20 76 61  e user supply va
10300 6c 75 65 73 20 68 65 72 65 20 69 6e 73 74 65 61  lues here instea
10310 64 20 6f 66 20 73 6f 6d 65 74 68 69 6e 67 20 74  d of something t
10320 68 61 74 20 65 78 69 73 74 73 20 6f 6e 20 74 68  hat exists on th
10330 65 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a  e filesystem */.
10340 09 20 20 20 20 53 54 41 43 4b 5f 4f 46 28 58 35  .    STACK_OF(X5
10350 30 39 5f 4e 41 4d 45 29 20 2a 63 65 72 74 4e 61  09_NAME) *certNa
10360 6d 65 73 20 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63  mes = SSL_load_c
10370 6c 69 65 6e 74 5f 43 41 5f 66 69 6c 65 28 46 32  lient_CA_file(F2
10380 4e 28 43 41 66 69 6c 65 2c 20 26 64 73 29 29 3b  N(CAfile, &ds));
10390 0a 09 20 20 20 20 69 66 20 28 63 65 72 74 4e 61  ..    if (certNa
103a0 6d 65 73 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  mes != NULL) {..
103b0 09 53 53 4c 5f 43 54 58 5f 73 65 74 5f 63 6c 69  .SSL_CTX_set_cli
103c0 65 6e 74 5f 43 41 5f 6c 69 73 74 28 63 74 78 2c  ent_CA_list(ctx,
103d0 20 63 65 72 74 4e 61 6d 65 73 29 3b 0a 09 20 20   certNames);..  
103e0 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f 44 53 74    }..    Tcl_DSt
103f0 72 69 6e 67 46 72 65 65 28 26 64 73 29 3b 0a 09  ringFree(&ds);..
10400 7d 0a 0a 23 65 6c 73 65 0a 09 2f 2a 20 44 69 72  }..#else../* Dir
10410 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
10420 67 20 43 41 20 63 65 72 74 69 66 69 63 61 74 65  g CA certificate
10430 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d 61 74 2e  s in PEM format.
10440 20 2a 2f 0a 09 69 66 20 28 43 41 70 61 74 68 20   */..if (CApath 
10450 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  != NULL) {..    
10460 69 66 20 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61  if (!SSL_CTX_loa
10470 64 5f 76 65 72 69 66 79 5f 64 69 72 28 63 74 78  d_verify_dir(ctx
10480 2c 20 46 32 4e 28 43 41 70 61 74 68 2c 20 26 64  , F2N(CApath, &d
10490 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  s))) {...abort++
104a0 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
104b0 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
104c0 73 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 55 52 49  s);..}..../* URI
104d0 20 66 6f 72 20 74 6f 20 61 20 73 74 6f 72 65 2c   for to a store,
104e0 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 61 20   which may be a 
104f0 73 69 6e 67 6c 65 20 63 6f 6e 74 61 69 6e 65 72  single container
10500 20 6f 72 20 61 20 63 61 74 61 6c 6f 67 20 6f 66   or a catalog of
10510 20 63 6f 6e 74 61 69 6e 65 72 73 2e 20 2a 2f 0a   containers. */.
10520 09 69 66 20 28 43 41 73 74 6f 72 65 20 21 3d 20  .if (CAstore != 
10530 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 69 66 20  NULL) {..    if 
10540 28 21 53 53 4c 5f 43 54 58 5f 6c 6f 61 64 5f 76  (!SSL_CTX_load_v
10550 65 72 69 66 79 5f 73 74 6f 72 65 28 63 74 78 2c  erify_store(ctx,
10560 20 46 32 4e 28 43 41 73 74 6f 72 65 2c 20 26 64   F2N(CAstore, &d
10570 73 29 29 29 20 7b 0a 09 09 61 62 6f 72 74 2b 2b  s))) {...abort++
10580 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63  ;..    }..    Tc
10590 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
105a0 73 29 3b 0a 09 7d 0a 09 0a 09 2f 2a 20 46 69 6c  s);..}..../* Fil
105b0 65 20 6f 66 20 43 41 20 63 65 72 74 69 66 69 63  e of CA certific
105c0 61 74 65 73 20 69 6e 20 50 45 4d 20 66 6f 72 6d  ates in PEM form
105d0 61 74 2e 20 20 2a 2f 0a 09 69 66 20 28 43 41 66  at.  */..if (CAf
105e0 69 6c 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  ile != NULL) {..
105f0 20 20 20 20 69 66 20 28 21 53 53 4c 5f 43 54 58      if (!SSL_CTX
10600 5f 6c 6f 61 64 5f 76 65 72 69 66 79 5f 66 69 6c  _load_verify_fil
10610 65 28 63 74 78 2c 20 46 32 4e 28 43 41 66 69 6c  e(ctx, F2N(CAfil
10620 65 2c 20 26 64 73 29 29 29 20 7b 0a 09 09 61 62  e, &ds))) {...ab
10630 6f 72 74 2b 2b 3b 0a 09 20 20 20 20 7d 0a 09 20  ort++;..    }.. 
10640 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
10650 65 65 28 26 64 73 29 3b 0a 0a 09 20 20 20 20 2f  ee(&ds);...    /
10660 2a 20 53 65 74 20 6c 69 73 74 20 6f 66 20 43 41  * Set list of CA
10670 73 20 74 6f 20 73 65 6e 64 20 74 6f 20 63 6c 69  s to send to cli
10680 65 6e 74 20 77 68 65 6e 20 72 65 71 75 65 73 74  ent when request
10690 69 6e 67 20 61 20 63 6c 69 65 6e 74 20 63 65 72  ing a client cer
106a0 74 69 66 69 63 61 74 65 20 2a 2f 0a 09 20 20 20  tificate */..   
106b0 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
106c0 41 4d 45 29 20 2a 63 65 72 74 4e 61 6d 65 73 20  AME) *certNames 
106d0 3d 20 53 53 4c 5f 6c 6f 61 64 5f 63 6c 69 65 6e  = SSL_load_clien
106e0 74 5f 43 41 5f 66 69 6c 65 28 46 32 4e 28 43 41  t_CA_file(F2N(CA
106f0 66 69 6c 65 2c 20 26 64 73 29 29 3b 0a 09 20 20  file, &ds));..  
10700 20 20 69 66 20 28 63 65 72 74 4e 61 6d 65 73 20    if (certNames 
10710 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 53 53 4c  != NULL) {...SSL
10720 5f 43 54 58 5f 73 65 74 5f 63 6c 69 65 6e 74 5f  _CTX_set_client_
10730 43 41 5f 6c 69 73 74 28 63 74 78 2c 20 63 65 72  CA_list(ctx, cer
10740 74 4e 61 6d 65 73 29 3b 0a 09 20 20 20 20 7d 0a  tNames);..    }.
10750 09 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
10760 46 72 65 65 28 26 64 73 29 3b 0a 09 7d 0a 23 65  Free(&ds);..}.#e
10770 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ndif.    }..    
10780 72 65 74 75 72 6e 20 63 74 78 3b 0a 7d 0a 0c 0a  return ctx;.}...
10790 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
107a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
107d0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 53  --------. *. * S
107e0 74 61 74 75 73 4f 62 6a 43 6d 64 20 2d 2d 20 72  tatusObjCmd -- r
107f0 65 74 75 72 6e 20 63 65 72 74 69 66 69 63 61 74  eturn certificat
10800 65 20 66 6f 72 20 63 6f 6e 6e 65 63 74 65 64 20  e for connected 
10810 70 65 65 72 20 69 6e 66 6f 2e 0a 20 2a 0a 20 2a  peer info.. *. *
10820 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
10830 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
10840 6c 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  lt.. *. * Side e
10850 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  ffects:. *.None.
10860 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
10870 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10880 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74  ---------. */.st
108b0 61 74 69 63 20 69 6e 74 0a 53 74 61 74 75 73 4f  atic int.StatusO
108c0 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61  bjCmd(ClientData
108d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c   clientData, Tcl
108e0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
108f0 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f   int objc, Tcl_O
10900 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
10910 29 20 7b 0a 20 20 20 20 53 74 61 74 65 20 2a 73  ) {.    State *s
10920 74 61 74 65 50 74 72 3b 0a 20 20 20 20 58 35 30  tatePtr;.    X50
10930 39 20 2a 70 65 65 72 3b 0a 20 20 20 20 54 63 6c  9 *peer;.    Tcl
10940 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 20 20  _Obj *objPtr;.  
10950 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68    Tcl_Channel ch
10960 61 6e 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 68  an;.    char *ch
10970 61 6e 6e 65 6c 4e 61 6d 65 2c 20 2a 63 69 70 68  annelName, *ciph
10980 65 72 73 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64  ers;.    int mod
10990 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  e;.    const uns
109a0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 72 6f 74  igned char *prot
109b0 6f 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  o;.    unsigned 
109c0 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 69 6e 74  int len;.    int
109d0 20 6e 69 64 2c 20 72 65 73 3b 0a 20 20 20 20 28   nid, res;.    (
109e0 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61  void) clientData
109f0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
10a00 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
10a10 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f  f (objc < 2 || o
10a20 62 6a 63 20 3e 20 33 20 7c 7c 20 28 6f 62 6a 63  bjc > 3 || (objc
10a30 20 3d 3d 20 33 20 26 26 20 21 73 74 72 63 6d 70   == 3 && !strcmp
10a40 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
10a50 62 6a 76 5b 31 5d 29 2c 20 22 2d 6c 6f 63 61 6c  bjv[1]), "-local
10a60 22 29 29 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e  "))) {..Tcl_Wron
10a70 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
10a80 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 6c 6f 63   1, objv, "?-loc
10a90 61 6c 3f 20 63 68 61 6e 6e 65 6c 22 29 3b 0a 09  al? channel");..
10aa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10ab0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
10ac0 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a  Get channel Id *
10ad0 2f 0a 20 20 20 20 63 68 61 6e 6e 65 6c 4e 61 6d  /.    channelNam
10ae0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10af0 67 28 6f 62 6a 76 5b 28 6f 62 6a 63 20 3d 3d 20  g(objv[(objc == 
10b00 32 20 3f 20 31 20 3a 20 32 29 5d 29 3b 0a 20 20  2 ? 1 : 2)]);.  
10b10 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74    chan = Tcl_Get
10b20 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
10b30 63 68 61 6e 6e 65 6c 4e 61 6d 65 2c 20 26 6d 6f  channelName, &mo
10b40 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61  de);.    if (cha
10b50 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65  n == (Tcl_Channe
10b60 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75  l) NULL) {..retu
10b70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10b80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65    }..    /* Make
10b90 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65   sure to operate
10ba0 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20   on the topmost 
10bb0 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63  channel */.    c
10bc0 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70  han = Tcl_GetTop
10bd0 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 20  Channel(chan);. 
10be0 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68     if (Tcl_GetCh
10bf0 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20  annelType(chan) 
10c00 21 3d 20 54 6c 73 5f 43 68 61 6e 6e 65 6c 54 79  != Tls_ChannelTy
10c10 70 65 28 29 29 20 7b 0a 09 54 63 6c 5f 41 70 70  pe()) {..Tcl_App
10c20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10c30 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c  , "bad channel \
10c40 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  "", Tcl_GetChann
10c50 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 09  elName(chan),...
10c60 22 5c 22 3a 20 6e 6f 74 20 61 20 54 4c 53 20 63  "\": not a TLS c
10c70 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 20 2a  hannel", (char *
10c80 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65  ) NULL);..Tcl_Se
10c90 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
10ca0 70 2c 20 22 54 4c 53 22 2c 20 22 53 54 41 54 55  p, "TLS", "STATU
10cb0 53 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22  S", "CHANNEL", "
10cc0 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20  INVALID", (char 
10cd0 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
10ce0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10cf0 20 7d 0a 20 20 20 20 73 74 61 74 65 50 74 72 20   }.    statePtr 
10d00 3d 20 28 53 74 61 74 65 20 2a 29 20 54 63 6c 5f  = (State *) Tcl_
10d10 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
10d20 63 65 44 61 74 61 28 63 68 61 6e 29 3b 0a 0a 20  ceData(chan);.. 
10d30 20 20 20 2f 2a 20 47 65 74 20 63 65 72 74 69 66     /* Get certif
10d40 69 63 61 74 65 20 66 6f 72 20 70 65 65 72 20 6f  icate for peer o
10d50 72 20 73 65 6c 66 20 2a 2f 0a 20 20 20 20 69 66  r self */.    if
10d60 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
10d70 70 65 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 70  peer = SSL_get_p
10d80 65 65 72 5f 63 65 72 74 69 66 69 63 61 74 65 28  eer_certificate(
10d90 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a  statePtr->ssl);.
10da0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 65      } else {..pe
10db0 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 65 72  er = SSL_get_cer
10dc0 74 69 66 69 63 61 74 65 28 73 74 61 74 65 50 74  tificate(statePt
10dd0 72 2d 3e 73 73 6c 29 3b 0a 20 20 20 20 7d 0a 20  r->ssl);.    }. 
10de0 20 20 20 2f 2a 20 47 65 74 20 58 35 30 39 20 63     /* Get X509 c
10df0 65 72 74 69 66 69 63 61 74 65 20 69 6e 66 6f 20  ertificate info 
10e00 2a 2f 0a 20 20 20 20 69 66 20 28 70 65 65 72 29  */.    if (peer)
10e10 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54 6c 73   {..objPtr = Tls
10e20 5f 4e 65 77 58 35 30 39 4f 62 6a 28 69 6e 74 65  _NewX509Obj(inte
10e30 72 70 2c 20 70 65 65 72 29 3b 0a 09 69 66 20 28  rp, peer);..if (
10e40 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 20 20  objc == 2) {..  
10e50 20 20 58 35 30 39 5f 66 72 65 65 28 70 65 65 72    X509_free(peer
10e60 29 3b 0a 09 20 20 20 20 70 65 65 72 20 3d 20 4e  );..    peer = N
10e70 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c  ULL;..}.    } el
10e80 73 65 20 7b 0a 09 6f 62 6a 50 74 72 20 3d 20 54  se {..objPtr = T
10e90 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c  cl_NewListObj(0,
10ea0 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20   NULL);.    }.. 
10eb0 20 20 20 2f 2a 20 50 65 65 72 20 6e 61 6d 65 20     /* Peer name 
10ec0 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f 53  */.    LAPPEND_S
10ed0 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74  TR(interp, objPt
10ee0 72 2c 20 22 70 65 65 72 6e 61 6d 65 22 2c 20 53  r, "peername", S
10ef0 53 4c 5f 67 65 74 30 5f 70 65 65 72 6e 61 6d 65  SL_get0_peername
10f00 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 2c  (statePtr->ssl),
10f10 20 2d 31 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e   -1);.    LAPPEN
10f20 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c 20 6f 62  D_INT(interp, ob
10f30 6a 50 74 72 2c 20 22 73 62 69 74 73 22 2c 20 53  jPtr, "sbits", S
10f40 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 5f 62 69  SL_get_cipher_bi
10f50 74 73 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  ts(statePtr->ssl
10f60 2c 20 4e 55 4c 4c 29 29 3b 0a 0a 20 20 20 20 63  , NULL));..    c
10f70 69 70 68 65 72 73 20 3d 20 28 63 68 61 72 2a 29  iphers = (char*)
10f80 53 53 4c 5f 67 65 74 5f 63 69 70 68 65 72 28 73  SSL_get_cipher(s
10f90 74 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 20  tatePtr->ssl);. 
10fa0 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69     LAPPEND_STR(i
10fb0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
10fc0 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 73  cipher", ciphers
10fd0 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
10fe0 65 72 69 66 79 20 74 68 65 20 58 35 30 39 20 63  erify the X509 c
10ff0 65 72 74 69 66 69 63 61 74 65 20 70 72 65 73 65  ertificate prese
11000 6e 74 65 64 20 62 79 20 74 68 65 20 70 65 65 72  nted by the peer
11010 20 2a 2f 0a 20 20 20 20 4c 41 50 50 45 4e 44 5f   */.    LAPPEND_
11020 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
11030 74 72 2c 20 22 76 65 72 69 66 79 52 65 73 75 6c  tr, "verifyResul
11040 74 22 2c 0a 09 58 35 30 39 5f 76 65 72 69 66 79  t",..X509_verify
11050 5f 63 65 72 74 5f 65 72 72 6f 72 5f 73 74 72 69  _cert_error_stri
11060 6e 67 28 53 53 4c 5f 67 65 74 5f 76 65 72 69 66  ng(SSL_get_verif
11070 79 5f 72 65 73 75 6c 74 28 73 74 61 74 65 50 74  y_result(statePt
11080 72 2d 3e 73 73 6c 29 29 2c 20 2d 31 29 3b 0a 0a  r->ssl)), -1);..
11090 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f      /* Verify mo
110a0 64 65 20 2a 2f 0a 20 20 20 20 6d 6f 64 65 20 3d  de */.    mode =
110b0 20 53 53 4c 5f 67 65 74 5f 76 65 72 69 66 79 5f   SSL_get_verify_
110c0 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e 73  mode(statePtr->s
110d0 73 6c 29 3b 0a 20 20 20 20 69 66 20 28 6d 6f 64  sl);.    if (mod
110e0 65 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f  e && SSL_VERIFY_
110f0 4e 4f 4e 45 29 20 7b 0a 09 4c 41 50 50 45 4e 44  NONE) {..LAPPEND
11100 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
11110 50 74 72 2c 20 22 76 65 72 69 66 79 4d 6f 64 65  Ptr, "verifyMode
11120 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
11130 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63      } else {..Tc
11140 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 50 74  l_Obj *listObjPt
11150 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
11160 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  bj(0, NULL);..if
11170 20 28 6d 6f 64 65 20 26 26 20 53 53 4c 5f 56 45   (mode && SSL_VE
11180 52 49 46 59 5f 50 45 45 52 29 20 7b 0a 09 20 20  RIFY_PEER) {..  
11190 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
111a0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
111b0 70 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54  p, listObjPtr, T
111c0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
111d0 22 70 65 65 72 22 2c 20 2d 31 29 29 3b 0a 09 7d  "peer", -1));..}
111e0 0a 09 69 66 20 28 6d 6f 64 65 20 26 26 20 53 53  ..if (mode && SS
111f0 4c 5f 56 45 52 49 46 59 5f 46 41 49 4c 5f 49 46  L_VERIFY_FAIL_IF
11200 5f 4e 4f 5f 50 45 45 52 5f 43 45 52 54 29 20 7b  _NO_PEER_CERT) {
11210 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
11220 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11230 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
11240 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11250 4f 62 6a 28 22 66 61 69 6c 20 69 66 20 6e 6f 20  Obj("fail if no 
11260 70 65 65 72 20 63 65 72 74 22 2c 20 2d 31 29 29  peer cert", -1))
11270 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65 20 26  ;..}..if (mode &
11280 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 43 4c 49  & SSL_VERIFY_CLI
11290 45 4e 54 5f 4f 4e 43 45 29 20 7b 0a 09 20 20 20  ENT_ONCE) {..   
112a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
112b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
112c0 2c 20 6c 69 73 74 4f 62 6a 50 74 72 2c 20 54 63  , listObjPtr, Tc
112d0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
112e0 63 6c 69 65 6e 74 20 6f 6e 63 65 22 2c 20 2d 31  client once", -1
112f0 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6d 6f 64 65  ));..}..if (mode
11300 20 26 26 20 53 53 4c 5f 56 45 52 49 46 59 5f 50   && SSL_VERIFY_P
11310 4f 53 54 5f 48 41 4e 44 53 48 41 4b 45 29 20 7b  OST_HANDSHAKE) {
11320 0a 09 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ..    Tcl_ListOb
11330 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11340 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 50 74  nterp, listObjPt
11350 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  r, Tcl_NewString
11360 4f 62 6a 28 22 70 6f 73 74 20 68 61 6e 64 73 68  Obj("post handsh
11370 61 6b 65 22 2c 20 2d 31 29 29 3b 0a 09 7d 0a 09  ake", -1));..}..
11380 4c 41 50 50 45 4e 44 5f 4f 42 4a 28 69 6e 74 65  LAPPEND_OBJ(inte
11390 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 76 65 72  rp, objPtr, "ver
113a0 69 66 79 4d 6f 64 65 22 2c 20 6c 69 73 74 4f 62  ifyMode", listOb
113b0 6a 50 74 72 29 0a 20 20 20 20 7d 0a 0a 20 20 20  jPtr).    }..   
113c0 20 2f 2a 20 56 65 72 69 66 79 20 6d 6f 64 65 20   /* Verify mode 
113d0 64 65 70 74 68 20 2a 2f 0a 20 20 20 20 4c 41 50  depth */.    LAP
113e0 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
113f0 20 6f 62 6a 50 74 72 2c 20 22 76 65 72 69 66 79   objPtr, "verify
11400 44 65 70 74 68 22 2c 20 53 53 4c 5f 67 65 74 5f  Depth", SSL_get_
11410 76 65 72 69 66 79 5f 64 65 70 74 68 28 73 74 61  verify_depth(sta
11420 74 65 50 74 72 2d 3e 73 73 6c 29 29 3b 0a 0a 20  tePtr->ssl));.. 
11430 20 20 20 2f 2a 20 52 65 70 6f 72 74 20 74 68 65     /* Report the
11440 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11450 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11460 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
11470 6e 20 2a 2f 0a 20 20 20 20 53 53 4c 5f 67 65 74  n */.    SSL_get
11480 30 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28  0_alpn_selected(
11490 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26  statePtr->ssl, &
114a0 70 72 6f 74 6f 2c 20 26 6c 65 6e 29 3b 0a 20 20  proto, &len);.  
114b0 20 20 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e    LAPPEND_STR(in
114c0 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
114d0 6c 70 6e 22 2c 20 28 63 68 61 72 20 2a 29 70 72  lpn", (char *)pr
114e0 6f 74 6f 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20  oto, (Tcl_Size) 
114f0 6c 65 6e 29 3b 0a 20 20 20 20 4c 41 50 50 45 4e  len);.    LAPPEN
11500 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11510 6a 50 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22  jPtr, "protocol"
11520 2c 20 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f  , SSL_get_versio
11530 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 29  n(statePtr->ssl)
11540 2c 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 56  , -1);..    /* V
11550 61 6c 69 64 20 66 6f 72 20 6e 6f 6e 2d 52 53 41  alid for non-RSA
11560 20 73 69 67 6e 61 74 75 72 65 20 61 6e 64 20 54   signature and T
11570 4c 53 20 31 2e 33 20 2a 2f 0a 20 20 20 20 69 66  LS 1.3 */.    if
11580 20 28 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09   (objc == 2) {..
11590 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f 70 65  res = SSL_get_pe
115a0 65 72 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  er_signature_nid
115b0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
115c0 26 6e 69 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73  &nid);.    } els
115d0 65 20 7b 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67  e {..res = SSL_g
115e0 65 74 5f 73 69 67 6e 61 74 75 72 65 5f 6e 69 64  et_signature_nid
115f0 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20  (statePtr->ssl, 
11600 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  &nid);.    }.   
11610 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69 64 20   if (!res) {nid 
11620 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50 45 4e  = 0;}.    LAPPEN
11630 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
11640 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75 72 65  jPtr, "signature
11650 48 61 73 68 41 6c 67 6f 72 69 74 68 6d 22 2c 20  HashAlgorithm", 
11660 4f 42 4a 5f 6e 69 64 32 6c 6e 28 6e 69 64 29 2c  OBJ_nid2ln(nid),
11670 20 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 64   -1);..    /* Ad
11680 64 65 64 20 69 6e 20 4f 70 65 6e 53 53 4c 20 31  ded in OpenSSL 1
11690 2e 31 2e 31 61 20 2a 2f 0a 23 69 66 20 4f 50 45  .1.1a */.#if OPE
116a0 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
116b0 42 45 52 20 3e 20 30 78 31 30 31 30 31 30 30 30  BER > 0x10101000
116c0 4c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d  L.    if (objc =
116d0 3d 20 32 29 20 7b 0a 09 72 65 73 20 3d 20 53 53  = 2) {..res = SS
116e0 4c 5f 67 65 74 5f 70 65 65 72 5f 73 69 67 6e 61  L_get_peer_signa
116f0 74 75 72 65 5f 74 79 70 65 5f 6e 69 64 28 73 74  ture_type_nid(st
11700 61 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 6e 69  atePtr->ssl, &ni
11710 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  d);.    } else {
11720 0a 09 72 65 73 20 3d 20 53 53 4c 5f 67 65 74 5f  ..res = SSL_get_
11730 73 69 67 6e 61 74 75 72 65 5f 74 79 70 65 5f 6e  signature_type_n
11740 69 64 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  id(statePtr->ssl
11750 2c 20 26 6e 69 64 29 3b 0a 20 20 20 20 7d 0a 20  , &nid);.    }. 
11760 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 6e 69     if (!res) {ni
11770 64 20 3d 20 30 3b 7d 0a 20 20 20 20 4c 41 50 50  d = 0;}.    LAPP
11780 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
11790 6f 62 6a 50 74 72 2c 20 22 73 69 67 6e 61 74 75  objPtr, "signatu
117a0 72 65 54 79 70 65 22 2c 20 4f 42 4a 5f 6e 69 64  reType", OBJ_nid
117b0 32 6c 6e 28 6e 69 64 29 2c 20 2d 31 29 3b 0a 23  2ln(nid), -1);.#
117c0 65 6e 64 69 66 0a 0a 20 20 20 20 54 63 6c 5f 53  endif..    Tcl_S
117d0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
117e0 72 70 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20  rp, objPtr);.   
117f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11800 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
11810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
11850 20 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 49 6e 66   * ConnectionInf
11860 6f 4f 62 6a 43 6d 64 20 2d 2d 20 72 65 74 75 72  oObjCmd -- retur
11870 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66  n connection inf
11880 6f 20 66 72 6f 6d 20 4f 70 65 6e 53 53 4c 2e 0a  o from OpenSSL..
11890 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
118a0 2a 09 41 20 6c 69 73 74 20 6f 66 20 63 6f 6e 6e  *.A list of conn
118b0 65 63 74 69 6f 6e 20 69 6e 66 6f 0a 20 20 2a 0a  ection info.  *.
118c0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
118d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
118f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11900 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
11910 63 20 69 6e 74 20 43 6f 6e 6e 65 63 74 69 6f 6e  c int Connection
11920 49 6e 66 6f 4f 62 6a 43 6d 64 28 43 6c 69 65 6e  InfoObjCmd(Clien
11930 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
11940 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
11950 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20  terp, int objc, 
11960 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f  Tcl_Obj *const o
11970 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c  bjv[]) {.    Tcl
11980 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 09 09  _Channel chan;..
11990 2f 2a 20 54 68 65 20 63 68 61 6e 6e 65 6c 20 74  /* The channel t
119a0 6f 20 73 65 74 20 61 20 6d 6f 64 65 20 6f 6e 20  o set a mode on 
119b0 2a 2f 0a 20 20 20 20 53 74 61 74 65 20 2a 73 74  */.    State *st
119c0 61 74 65 50 74 72 3b 09 09 2f 2a 20 63 6c 69 65  atePtr;../* clie
119d0 6e 74 20 73 74 61 74 65 20 66 6f 72 20 73 73 6c  nt state for ssl
119e0 20 73 6f 63 6b 65 74 20 2a 2f 0a 20 20 20 20 54   socket */.    T
119f0 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20  cl_Obj *objPtr, 
11a00 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 63 6f  *listPtr;.    co
11a10 6e 73 74 20 53 53 4c 20 2a 73 73 6c 3b 0a 20 20  nst SSL *ssl;.  
11a20 20 20 63 6f 6e 73 74 20 53 53 4c 5f 43 49 50 48    const SSL_CIPH
11a30 45 52 20 2a 63 69 70 68 65 72 3b 0a 20 20 20 20  ER *cipher;.    
11a40 63 6f 6e 73 74 20 53 53 4c 5f 53 45 53 53 49 4f  const SSL_SESSIO
11a50 4e 20 2a 73 65 73 73 69 6f 6e 3b 0a 20 20 20 20  N *session;.    
11a60 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64  const EVP_MD *md
11a70 3b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69  ;.    (void) cli
11a80 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66  entData;..    if
11a90 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09   (objc != 2) {..
11aa0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11ab0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11ac0 2c 20 22 63 68 61 6e 6e 65 6c 22 29 3b 0a 09 72  , "channel");..r
11ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e  .    }..    chan
11af0 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65   = Tcl_GetChanne
11b00 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  l(interp, Tcl_Ge
11b10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
11b20 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 20  , NULL);.    if 
11b30 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68  (chan == (Tcl_Ch
11b40 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09  annel) NULL) {..
11b50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11b60 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
11b70 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65  Make sure to ope
11b80 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d  rate on the topm
11b90 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20  ost channel */. 
11ba0 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65     chan = Tcl_Ge
11bb0 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e  tTopChannel(chan
11bc0 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47  );.    if (Tcl_G
11bd0 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68  etChannelType(ch
11be0 61 6e 29 20 21 3d 20 54 6c 73 5f 43 68 61 6e 6e  an) != Tls_Chann
11bf0 65 6c 54 79 70 65 28 29 29 20 7b 0a 09 54 63 6c  elType()) {..Tcl
11c00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11c10 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e  terp, "bad chann
11c20 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43  el \"", Tcl_GetC
11c30 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29  hannelName(chan)
11c40 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20  ,..    "\": not 
11c50 61 20 54 4c 53 20 63 68 61 6e 6e 65 6c 22 2c 20  a TLS channel", 
11c60 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
11c70 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64  .Tcl_SetErrorCod
11c80 65 28 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c  e(interp, "TLS",
11c90 20 22 43 4f 4e 4e 45 43 54 49 4f 4e 22 2c 20 22   "CONNECTION", "
11ca0 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 41 4c  CHANNEL", "INVAL
11cb0 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55  ID", (char *) NU
11cc0 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  LL);..return TCL
11cd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
11ce0 20 20 20 6f 62 6a 50 74 72 20 3d 20 54 63 6c 5f     objPtr = Tcl_
11cf0 4e 65 77 4c 69 73 74 4f 62 6a 28 30 2c 20 4e 55  NewListObj(0, NU
11d00 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e  LL);..    /* Con
11d10 6e 65 63 74 69 6f 6e 20 69 6e 66 6f 20 2a 2f 0a  nection info */.
11d20 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28      statePtr = (
11d30 53 74 61 74 65 20 2a 29 54 63 6c 5f 47 65 74 43  State *)Tcl_GetC
11d40 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61  hannelInstanceDa
11d50 74 61 28 63 68 61 6e 29 3b 0a 20 20 20 20 73 73  ta(chan);.    ss
11d60 6c 20 3d 20 73 74 61 74 65 50 74 72 2d 3e 73 73  l = statePtr->ss
11d70 6c 3b 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21  l;.    if (ssl !
11d80 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
11d90 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11da0 70 72 6f 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64  proto;..unsigned
11db0 20 69 6e 74 20 75 6c 65 6e 3b 0a 0a 09 2f 2a 20   int ulen;.../* 
11dc0 49 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  Initialization f
11dd0 69 6e 69 73 68 65 64 20 2a 2f 0a 09 4c 41 50 50  inished */..LAPP
11de0 45 4e 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c  END_BOOL(interp,
11df0 20 6f 62 6a 50 74 72 2c 20 22 69 6e 69 74 5f 66   objPtr, "init_f
11e00 69 6e 69 73 68 65 64 22 2c 20 53 53 4c 5f 69 73  inished", SSL_is
11e10 5f 69 6e 69 74 5f 66 69 6e 69 73 68 65 64 28 73  _init_finished(s
11e20 73 6c 29 29 3b 0a 09 0a 09 2f 2a 20 63 6f 6e 6e  sl));..../* conn
11e30 65 63 74 69 6f 6e 20 73 74 61 74 65 20 2a 2f 0a  ection state */.
11e40 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
11e50 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 74  erp, objPtr, "st
11e60 61 74 65 22 2c 20 53 53 4c 5f 73 74 61 74 65 5f  ate", SSL_state_
11e70 73 74 72 69 6e 67 5f 6c 6f 6e 67 28 73 73 6c 29  string_long(ssl)
11e80 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20  , -1);.../* Get 
11e90 53 4e 49 20 72 65 71 75 65 73 74 65 64 20 73 65  SNI requested se
11ea0 72 76 65 72 20 6e 61 6d 65 20 2a 2f 0a 09 4c 41  rver name */..LA
11eb0 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70  PPEND_STR(interp
11ec0 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 72 76 65  , objPtr, "serve
11ed0 72 6e 61 6d 65 22 2c 20 53 53 4c 5f 67 65 74 5f  rname", SSL_get_
11ee0 73 65 72 76 65 72 6e 61 6d 65 28 73 73 6c 2c 20  servername(ssl, 
11ef0 54 4c 53 45 58 54 5f 4e 41 4d 45 54 59 50 45 5f  TLSEXT_NAMETYPE_
11f00 68 6f 73 74 5f 6e 61 6d 65 29 2c 20 2d 31 29 3b  host_name), -1);
11f10 0a 0a 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65  .../* Report the
11f20 20 73 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63   selected protoc
11f30 6f 6c 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ol as a result o
11f40 66 20 74 68 65 20 6e 65 67 6f 74 69 61 74 69 6f  f the negotiatio
11f50 6e 20 2a 2f 0a 09 53 53 4c 5f 67 65 74 30 5f 61  n */..SSL_get0_a
11f60 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73 74 61  lpn_selected(sta
11f70 74 65 50 74 72 2d 3e 73 73 6c 2c 20 26 70 72 6f  tePtr->ssl, &pro
11f80 74 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50  to, &ulen);..LAP
11f90 50 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c  PEND_STR(interp,
11fa0 20 6f 62 6a 50 74 72 2c 20 22 61 6c 70 6e 22 2c   objPtr, "alpn",
11fb0 20 28 63 68 61 72 20 2a 29 70 72 6f 74 6f 2c 20   (char *)proto, 
11fc0 28 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29  (Tcl_Size) ulen)
11fd0 3b 0a 0a 09 2f 2a 20 47 65 74 20 70 72 6f 74 6f  ;.../* Get proto
11fe0 63 6f 6c 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  col */..LAPPEND_
11ff0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12000 74 72 2c 20 22 70 72 6f 74 6f 63 6f 6c 22 2c 20  tr, "protocol", 
12010 53 53 4c 5f 67 65 74 5f 76 65 72 73 69 6f 6e 28  SSL_get_version(
12020 73 73 6c 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20  ssl), -1);.../* 
12030 52 65 6e 65 67 6f 74 69 61 74 69 6f 6e 20 61 6c  Renegotiation al
12040 6c 6f 77 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e  lowed */..LAPPEN
12050 44 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f  D_BOOL(interp, o
12060 62 6a 50 74 72 2c 20 22 72 65 6e 65 67 6f 74 69  bjPtr, "renegoti
12070 61 74 69 6f 6e 5f 61 6c 6c 6f 77 65 64 22 2c 20  ation_allowed", 
12080 53 53 4c 5f 67 65 74 5f 73 65 63 75 72 65 5f 72  SSL_get_secure_r
12090 65 6e 65 67 6f 74 69 61 74 69 6f 6e 5f 73 75 70  enegotiation_sup
120a0 70 6f 72 74 28 28 53 53 4c 20 2a 29 20 73 73 6c  port((SSL *) ssl
120b0 29 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 73 65 63  ));.../* Get sec
120c0 75 72 69 74 79 20 6c 65 76 65 6c 20 2a 2f 0a 09  urity level */..
120d0 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65  LAPPEND_INT(inte
120e0 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63  rp, objPtr, "sec
120f0 75 72 69 74 79 5f 6c 65 76 65 6c 22 2c 20 53 53  urity_level", SS
12100 4c 5f 67 65 74 5f 73 65 63 75 72 69 74 79 5f 6c  L_get_security_l
12110 65 76 65 6c 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a  evel(ssl));.../*
12120 20 53 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f   Session info */
12130 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
12140 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12150 73 65 73 73 69 6f 6e 5f 72 65 75 73 65 64 22 2c  session_reused",
12160 20 53 53 4c 5f 73 65 73 73 69 6f 6e 5f 72 65 75   SSL_session_reu
12170 73 65 64 28 73 73 6c 29 29 3b 0a 0a 09 2f 2a 20  sed(ssl));.../* 
12180 49 73 20 73 65 72 76 65 72 20 69 6e 66 6f 20 2a  Is server info *
12190 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
121a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
121b0 22 69 73 5f 73 65 72 76 65 72 22 2c 20 53 53 4c  "is_server", SSL
121c0 5f 69 73 5f 73 65 72 76 65 72 28 73 73 6c 29 29  _is_server(ssl))
121d0 3b 0a 0a 09 2f 2a 20 49 73 20 44 54 4c 53 20 2a  ;.../* Is DTLS *
121e0 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
121f0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
12200 22 69 73 5f 64 74 6c 73 22 2c 20 53 53 4c 5f 69  "is_dtls", SSL_i
12210 73 5f 64 74 6c 73 28 73 73 6c 29 29 3b 0a 0a 23  s_dtls(ssl));..#
12220 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
12230 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 33  ON_NUMBER >= 0x3
12240 30 32 30 30 30 30 30 4c 0a 09 2f 2a 20 49 73 20  0200000L../* Is 
12250 51 55 49 43 20 2a 2f 0a 09 4c 41 50 50 45 4e 44  QUIC */..LAPPEND
12260 5f 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62  _BOOL(interp, ob
12270 6a 50 74 72 2c 20 22 69 73 5f 71 75 69 63 22 2c  jPtr, "is_quic",
12280 20 53 53 4c 5f 69 73 5f 71 75 69 63 28 73 73 6c   SSL_is_quic(ssl
12290 29 29 3b 0a 0a 09 2f 2a 20 49 73 20 54 4c 53 20  ));.../* Is TLS 
122a0 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c  */..LAPPEND_BOOL
122b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
122c0 20 22 69 73 5f 74 6c 73 22 2c 20 53 53 4c 5f 69   "is_tls", SSL_i
122d0 73 5f 74 6c 73 28 73 73 6c 29 29 3b 0a 23 65 6e  s_tls(ssl));.#en
122e0 64 69 66 0a 0a 09 2f 2a 20 44 41 4e 45 20 54 4c  dif.../* DANE TL
122f0 53 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e  S authentication
12300 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f   */..LAPPEND_BOO
12310 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  L(interp, objPtr
12320 2c 20 22 64 61 6e 65 5f 61 75 74 68 22 2c 20 53  , "dane_auth", S
12330 53 4c 5f 67 65 74 30 5f 64 61 6e 65 28 73 73 6c  SL_get0_dane(ssl
12340 29 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 09 2f 2a  ) != NULL);.../*
12350 20 57 61 69 74 69 6e 67 20 66 6f 72 20 61 73 79   Waiting for asy
12360 6e 63 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 42  nc */..LAPPEND_B
12370 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  OOL(interp, objP
12380 74 72 2c 20 22 77 61 69 74 69 6e 67 5f 66 6f 72  tr, "waiting_for
12390 5f 61 73 79 6e 63 22 2c 20 53 53 4c 5f 77 61 69  _async", SSL_wai
123a0 74 69 6e 67 5f 66 6f 72 5f 61 73 79 6e 63 28 73  ting_for_async(s
123b0 73 6c 29 29 3b 0a 0a 09 2f 2a 20 54 69 6d 65 2d  sl));.../* Time-
123c0 6f 75 74 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  out */..LAPPEND_
123d0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
123e0 50 74 72 2c 20 22 74 69 6d 65 2d 6f 75 74 22 2c  Ptr, "time-out",
123f0 20 53 53 4c 5f 67 65 74 5f 64 65 66 61 75 6c 74   SSL_get_default
12400 5f 74 69 6d 65 6f 75 74 28 73 73 6c 29 29 3b 0a  _timeout(ssl));.
12410 0a 09 2f 2a 20 49 73 20 43 65 72 74 69 66 69 63  ../* Is Certific
12420 61 74 65 20 54 72 61 6e 73 70 61 72 65 6e 63 79  ate Transparency
12430 20 76 61 6c 69 64 61 74 69 6f 6e 20 65 6e 61 62   validation enab
12440 6c 65 64 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  led */..LAPPEND_
12450 42 4f 4f 4c 28 69 6e 74 65 72 70 2c 20 6f 62 6a  BOOL(interp, obj
12460 50 74 72 2c 20 22 63 74 5f 65 6e 61 62 6c 65 64  Ptr, "ct_enabled
12470 22 2c 20 53 53 4c 5f 63 74 5f 69 73 5f 65 6e 61  ", SSL_ct_is_ena
12480 62 6c 65 64 28 73 73 6c 29 29 3b 0a 20 20 20 20  bled(ssl));.    
12490 7d 0a 0a 20 20 20 20 2f 2a 20 43 69 70 68 65 72  }..    /* Cipher
124a0 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 63 69 70   info */.    cip
124b0 68 65 72 20 3d 20 53 53 4c 5f 67 65 74 5f 63 75  her = SSL_get_cu
124c0 72 72 65 6e 74 5f 63 69 70 68 65 72 28 73 73 6c  rrent_cipher(ssl
124d0 29 3b 0a 20 20 20 20 69 66 20 28 63 69 70 68 65  );.    if (ciphe
124e0 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68  r != NULL) {..ch
124f0 61 72 20 62 75 66 5b 42 55 46 53 49 5a 5d 20 3d  ar buf[BUFSIZ] =
12500 20 7b 30 7d 3b 0a 09 69 6e 74 20 62 69 74 73 2c   {0};..int bits,
12510 20 61 6c 67 5f 62 69 74 73 3b 0a 0a 09 2f 2a 20   alg_bits;.../* 
12520 43 69 70 68 65 72 20 6e 61 6d 65 20 2a 2f 0a 09  Cipher name */..
12530 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74 65  LAPPEND_STR(inte
12540 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 69 70  rp, objPtr, "cip
12550 68 65 72 22 2c 20 53 53 4c 5f 43 49 50 48 45 52  her", SSL_CIPHER
12560 5f 67 65 74 5f 6e 61 6d 65 28 63 69 70 68 65 72  _get_name(cipher
12570 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 52 46 43  ), -1);.../* RFC
12580 20 6e 61 6d 65 20 6f 66 20 63 69 70 68 65 72 20   name of cipher 
12590 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28  */..LAPPEND_STR(
125a0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
125b0 22 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65 22 2c  "standard_name",
125c0 20 53 53 4c 5f 43 49 50 48 45 52 5f 73 74 61 6e   SSL_CIPHER_stan
125d0 64 61 72 64 5f 6e 61 6d 65 28 63 69 70 68 65 72  dard_name(cipher
125e0 29 2c 20 2d 31 29 3b 0a 0a 09 2f 2a 20 4f 70 65  ), -1);.../* Ope
125f0 6e 53 53 4c 20 6e 61 6d 65 20 6f 66 20 63 69 70  nSSL name of cip
12600 68 65 72 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  her */..LAPPEND_
12610 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
12620 74 72 2c 20 22 6f 70 65 6e 73 73 6c 5f 6e 61 6d  tr, "openssl_nam
12630 65 22 2c 20 4f 50 45 4e 53 53 4c 5f 63 69 70 68  e", OPENSSL_ciph
12640 65 72 5f 6e 61 6d 65 28 53 53 4c 5f 43 49 50 48  er_name(SSL_CIPH
12650 45 52 5f 73 74 61 6e 64 61 72 64 5f 6e 61 6d 65  ER_standard_name
12660 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12670 0a 09 2f 2a 20 6e 75 6d 62 65 72 20 6f 66 20 73  ../* number of s
12680 65 63 72 65 74 20 62 69 74 73 20 75 73 65 64 20  ecret bits used 
12690 66 6f 72 20 63 69 70 68 65 72 20 2a 2f 0a 09 62  for cipher */..b
126a0 69 74 73 20 3d 20 53 53 4c 5f 43 49 50 48 45 52  its = SSL_CIPHER
126b0 5f 67 65 74 5f 62 69 74 73 28 63 69 70 68 65 72  _get_bits(cipher
126c0 2c 20 26 61 6c 67 5f 62 69 74 73 29 3b 0a 09 4c  , &alg_bits);..L
126d0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
126e0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 73 65 63 72  p, objPtr, "secr
126f0 65 74 5f 62 69 74 73 22 2c 20 62 69 74 73 29 3b  et_bits", bits);
12700 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12710 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 61  terp, objPtr, "a
12720 6c 67 6f 72 69 74 68 6d 5f 62 69 74 73 22 2c 20  lgorithm_bits", 
12730 61 6c 67 5f 62 69 74 73 29 3b 0a 09 2f 2a 20 61  alg_bits);../* a
12740 6c 67 5f 62 69 74 73 20 69 73 20 61 63 74 75 61  lg_bits is actua
12750 6c 20 6b 65 79 20 73 65 63 72 65 74 20 62 69 74  l key secret bit
12760 73 2e 20 49 66 20 75 73 65 20 62 69 74 73 20 61  s. If use bits a
12770 6e 64 20 73 65 63 72 65 74 20 28 61 6c 67 6f 72  nd secret (algor
12780 69 74 68 6d 29 20 62 69 74 73 20 64 69 66 66 65  ithm) bits diffe
12790 72 2c 0a 09 20 20 20 74 68 65 20 72 65 73 74 20  r,..   the rest 
127a0 6f 66 20 74 68 65 20 62 69 74 73 20 61 72 65 20  of the bits are 
127b0 66 69 78 65 64 2c 20 69 2e 65 2e 20 66 6f 72 20  fixed, i.e. for 
127c0 6c 69 6d 69 74 65 64 20 65 78 70 6f 72 74 20 63  limited export c
127d0 69 70 68 65 72 73 20 28 62 69 74 73 20 3c 20 35  iphers (bits < 5
127e0 36 29 20 2a 2f 0a 0a 09 2f 2a 20 49 6e 64 69 63  6) */.../* Indic
127f0 61 74 65 73 20 77 68 69 63 68 20 53 53 4c 2f 54  ates which SSL/T
12800 4c 53 20 70 72 6f 74 6f 63 6f 6c 20 76 65 72 73  LS protocol vers
12810 69 6f 6e 20 66 69 72 73 74 20 64 65 66 69 6e 65  ion first define
12820 64 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a  d the cipher */.
12830 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12840 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6d 69  erp, objPtr, "mi
12850 6e 5f 76 65 72 73 69 6f 6e 22 2c 20 53 53 4c 5f  n_version", SSL_
12860 43 49 50 48 45 52 5f 67 65 74 5f 76 65 72 73 69  CIPHER_get_versi
12870 6f 6e 28 63 69 70 68 65 72 29 2c 20 2d 31 29 3b  on(cipher), -1);
12880 0a 0a 09 2f 2a 20 43 69 70 68 65 72 20 4e 49 44  .../* Cipher NID
12890 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52   */..LAPPEND_STR
128a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
128b0 20 22 63 69 70 68 65 72 4e 49 44 22 2c 20 28 63   "cipherNID", (c
128c0 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c 6e  har *)OBJ_nid2ln
128d0 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f  (SSL_CIPHER_get_
128e0 63 69 70 68 65 72 5f 6e 69 64 28 63 69 70 68 65  cipher_nid(ciphe
128f0 72 29 29 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45  r)), -1);..LAPPE
12900 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f  ND_STR(interp, o
12910 62 6a 50 74 72 2c 20 22 64 69 67 65 73 74 4e 49  bjPtr, "digestNI
12920 44 22 2c 20 28 63 68 61 72 20 2a 29 4f 42 4a 5f  D", (char *)OBJ_
12930 6e 69 64 32 6c 6e 28 53 53 4c 5f 43 49 50 48 45  nid2ln(SSL_CIPHE
12940 52 5f 67 65 74 5f 64 69 67 65 73 74 5f 6e 69 64  R_get_digest_nid
12950 28 63 69 70 68 65 72 29 29 2c 20 2d 31 29 3b 0a  (cipher)), -1);.
12960 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
12970 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 6b 65  erp, objPtr, "ke
12980 79 45 78 63 68 61 6e 67 65 4e 49 44 22 2c 20 28  yExchangeNID", (
12990 63 68 61 72 20 2a 29 4f 42 4a 5f 6e 69 64 32 6c  char *)OBJ_nid2l
129a0 6e 28 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74  n(SSL_CIPHER_get
129b0 5f 6b 78 5f 6e 69 64 28 63 69 70 68 65 72 29 29  _kx_nid(cipher))
129c0 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e 44 5f  , -1);..LAPPEND_
129d0 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50  STR(interp, objP
129e0 74 72 2c 20 22 61 75 74 68 65 6e 74 69 63 61 74  tr, "authenticat
129f0 69 6f 6e 4e 49 44 22 2c 20 28 63 68 61 72 20 2a  ionNID", (char *
12a00 29 4f 42 4a 5f 6e 69 64 32 6c 6e 28 53 53 4c 5f  )OBJ_nid2ln(SSL_
12a10 43 49 50 48 45 52 5f 67 65 74 5f 61 75 74 68 5f  CIPHER_get_auth_
12a20 6e 69 64 28 63 69 70 68 65 72 29 29 2c 20 2d 31  nid(cipher)), -1
12a30 29 3b 0a 0a 09 2f 2a 20 6d 65 73 73 61 67 65 20  );.../* message 
12a40 61 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 63  authentication c
12a50 6f 64 65 20 2d 20 43 69 70 68 65 72 20 69 73 20  ode - Cipher is 
12a60 41 45 41 44 20 28 65 2e 67 2e 20 47 43 4d 20 6f  AEAD (e.g. GCM o
12a70 72 20 43 68 61 43 68 61 32 30 2f 50 6f 6c 79 31  r ChaCha20/Poly1
12a80 33 30 35 29 20 6f 72 20 6e 6f 74 20 2a 2f 0a 09  305) or not */..
12a90 2f 2a 20 41 75 74 68 65 6e 74 69 63 61 74 65 64  /* Authenticated
12aa0 20 45 6e 63 72 79 70 74 69 6f 6e 20 77 69 74 68   Encryption with
12ab0 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74 61   associated data
12ac0 20 28 41 45 41 44 29 20 63 68 65 63 6b 20 2a 2f   (AEAD) check */
12ad0 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28 69  ..LAPPEND_BOOL(i
12ae0 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
12af0 63 69 70 68 65 72 5f 69 73 5f 61 65 61 64 22 2c  cipher_is_aead",
12b00 20 53 53 4c 5f 43 49 50 48 45 52 5f 69 73 5f 61   SSL_CIPHER_is_a
12b10 65 61 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09  ead(cipher));...
12b20 2f 2a 20 44 69 67 65 73 74 20 75 73 65 64 20 64  /* Digest used d
12b30 75 72 69 6e 67 20 74 68 65 20 53 53 4c 2f 54 4c  uring the SSL/TL
12b40 53 20 68 61 6e 64 73 68 61 6b 65 20 77 68 65 6e  S handshake when
12b50 20 75 73 69 6e 67 20 74 68 65 20 63 69 70 68 65   using the ciphe
12b60 72 2e 20 2a 2f 0a 09 6d 64 20 3d 20 53 53 4c 5f  r. */..md = SSL_
12b70 43 49 50 48 45 52 5f 67 65 74 5f 68 61 6e 64 73  CIPHER_get_hands
12b80 68 61 6b 65 5f 64 69 67 65 73 74 28 63 69 70 68  hake_digest(ciph
12b90 65 72 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54  er);..LAPPEND_ST
12ba0 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72  R(interp, objPtr
12bb0 2c 20 22 68 61 6e 64 73 68 61 6b 65 5f 64 69 67  , "handshake_dig
12bc0 65 73 74 22 2c 20 28 63 68 61 72 20 2a 29 45 56  est", (char *)EV
12bd0 50 5f 4d 44 5f 6e 61 6d 65 28 6d 64 29 2c 20 2d  P_MD_name(md), -
12be0 31 29 3b 0a 0a 09 2f 2a 20 47 65 74 20 4f 70 65  1);.../* Get Ope
12bf0 6e 53 53 4c 2d 73 70 65 63 69 66 69 63 20 49 44  nSSL-specific ID
12c00 2c 20 6e 6f 74 20 49 41 4e 41 20 49 44 20 2a 2f  , not IANA ID */
12c10 0a 09 4c 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e  ..LAPPEND_INT(in
12c20 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63  terp, objPtr, "c
12c30 69 70 68 65 72 5f 69 64 22 2c 20 28 69 6e 74 29  ipher_id", (int)
12c40 20 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f   SSL_CIPHER_get_
12c50 69 64 28 63 69 70 68 65 72 29 29 3b 0a 0a 09 2f  id(cipher));.../
12c60 2a 20 54 77 6f 2d 62 79 74 65 20 49 44 20 75 73  * Two-byte ID us
12c70 65 64 20 69 6e 20 74 68 65 20 54 4c 53 20 70 72  ed in the TLS pr
12c80 6f 74 6f 63 6f 6c 20 6f 66 20 74 68 65 20 67 69  otocol of the gi
12c90 76 65 6e 20 63 69 70 68 65 72 20 2a 2f 0a 09 4c  ven cipher */..L
12ca0 41 50 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72  APPEND_INT(inter
12cb0 70 2c 20 6f 62 6a 50 74 72 2c 20 22 70 72 6f 74  p, objPtr, "prot
12cc0 6f 63 6f 6c 5f 69 64 22 2c 20 28 69 6e 74 29 20  ocol_id", (int) 
12cd0 53 53 4c 5f 43 49 50 48 45 52 5f 67 65 74 5f 70  SSL_CIPHER_get_p
12ce0 72 6f 74 6f 63 6f 6c 5f 69 64 28 63 69 70 68 65  rotocol_id(ciphe
12cf0 72 29 29 3b 0a 0a 09 2f 2a 20 54 65 78 74 75 61  r));.../* Textua
12d00 6c 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  l description of
12d10 20 74 68 65 20 63 69 70 68 65 72 20 2a 2f 0a 09   the cipher */..
12d20 69 66 20 28 53 53 4c 5f 43 49 50 48 45 52 5f 64  if (SSL_CIPHER_d
12d30 65 73 63 72 69 70 74 69 6f 6e 28 63 69 70 68 65  escription(ciphe
12d40 72 2c 20 62 75 66 2c 20 73 69 7a 65 6f 66 28 62  r, buf, sizeof(b
12d50 75 66 29 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  uf)) != NULL) {.
12d60 09 20 20 20 20 4c 41 50 50 45 4e 44 5f 53 54 52  .    LAPPEND_STR
12d70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
12d80 20 22 64 65 73 63 72 69 70 74 69 6f 6e 22 2c 20   "description", 
12d90 62 75 66 2c 20 2d 31 29 3b 0a 09 7d 0a 20 20 20  buf, -1);..}.   
12da0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 73 73 69   }..    /* Sessi
12db0 6f 6e 20 69 6e 66 6f 20 2a 2f 0a 20 20 20 20 73  on info */.    s
12dc0 65 73 73 69 6f 6e 20 3d 20 53 53 4c 5f 67 65 74  ession = SSL_get
12dd0 5f 73 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 20  _session(ssl);. 
12de0 20 20 20 69 66 20 28 73 65 73 73 69 6f 6e 20 21     if (session !
12df0 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f 6e 73 74  = NULL) {..const
12e00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12e10 74 69 63 6b 65 74 3b 0a 09 73 69 7a 65 5f 74 20  ticket;..size_t 
12e20 6c 65 6e 32 3b 0a 09 75 6e 73 69 67 6e 65 64 20  len2;..unsigned 
12e30 69 6e 74 20 75 6c 65 6e 3b 0a 09 63 6f 6e 73 74  int ulen;..const
12e40 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
12e50 73 65 73 73 69 6f 6e 5f 69 64 2c 20 2a 70 72 6f  session_id, *pro
12e60 74 6f 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68  to;..unsigned ch
12e70 61 72 20 62 75 66 66 65 72 5b 53 53 4c 5f 4d 41  ar buffer[SSL_MA
12e80 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c 45 4e  X_MASTER_KEY_LEN
12e90 47 54 48 5d 3b 0a 0a 09 2f 2a 20 52 65 70 6f 72  GTH];.../* Repor
12ea0 74 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 70  t the selected p
12eb0 72 6f 74 6f 63 6f 6c 20 61 73 20 61 20 72 65 73  rotocol as a res
12ec0 75 6c 74 20 6f 66 20 74 68 65 20 41 4c 50 4e 20  ult of the ALPN 
12ed0 6e 65 67 6f 74 69 61 74 69 6f 6e 20 2a 2f 0a 09  negotiation */..
12ee0 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 30  SSL_SESSION_get0
12ef0 5f 61 6c 70 6e 5f 73 65 6c 65 63 74 65 64 28 73  _alpn_selected(s
12f00 65 73 73 69 6f 6e 2c 20 26 70 72 6f 74 6f 2c 20  ession, &proto, 
12f10 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e 44  &len2);..LAPPEND
12f20 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
12f30 50 74 72 2c 20 22 61 6c 70 6e 22 2c 20 28 63 68  Ptr, "alpn", (ch
12f40 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28 54 63  ar *) proto, (Tc
12f50 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a 0a  l_Size) len2);..
12f60 09 2f 2a 20 52 65 70 6f 72 74 20 74 68 65 20 73  ./* Report the s
12f70 65 6c 65 63 74 65 64 20 70 72 6f 74 6f 63 6f 6c  elected protocol
12f80 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
12f90 74 68 65 20 4e 50 4e 20 6e 65 67 6f 74 69 61 74  the NPN negotiat
12fa0 69 6f 6e 20 2a 2f 0a 23 69 66 64 65 66 20 55 53  ion */.#ifdef US
12fb0 45 5f 4e 50 4e 0a 09 53 53 4c 5f 67 65 74 30 5f  E_NPN..SSL_get0_
12fc0 6e 65 78 74 5f 70 72 6f 74 6f 5f 6e 65 67 6f 74  next_proto_negot
12fd0 69 61 74 65 64 28 73 73 6c 2c 20 26 70 72 6f 74  iated(ssl, &prot
12fe0 6f 2c 20 26 75 6c 65 6e 29 3b 0a 09 4c 41 50 50  o, &ulen);..LAPP
12ff0 45 4e 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20  END_STR(interp, 
13000 6f 62 6a 50 74 72 2c 20 22 6e 70 6e 22 2c 20 28  objPtr, "npn", (
13010 63 68 61 72 20 2a 29 20 70 72 6f 74 6f 2c 20 28  char *) proto, (
13020 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
13030 0a 23 65 6e 64 69 66 0a 0a 09 2f 2a 20 52 65 73  .#endif.../* Res
13040 75 6d 61 62 6c 65 20 73 65 73 73 69 6f 6e 20 2a  umable session *
13050 2f 0a 09 4c 41 50 50 45 4e 44 5f 42 4f 4f 4c 28  /..LAPPEND_BOOL(
13060 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
13070 22 72 65 73 75 6d 61 62 6c 65 22 2c 20 53 53 4c  "resumable", SSL
13080 5f 53 45 53 53 49 4f 4e 5f 69 73 5f 72 65 73 75  _SESSION_is_resu
13090 6d 61 62 6c 65 28 73 65 73 73 69 6f 6e 29 29 3b  mable(session));
130a0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 73 74  .../* Session st
130b0 61 72 74 20 74 69 6d 65 20 28 73 65 63 6f 6e 64  art time (second
130c0 73 20 73 69 6e 63 65 20 65 70 6f 63 68 29 20 2a  s since epoch) *
130d0 2f 0a 09 4c 41 50 50 45 4e 44 5f 4c 4f 4e 47 28  /..LAPPEND_LONG(
130e0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
130f0 22 73 74 61 72 74 5f 74 69 6d 65 22 2c 20 53 53  "start_time", SS
13100 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 74 69  L_SESSION_get_ti
13110 6d 65 28 73 65 73 73 69 6f 6e 29 29 3b 0a 0a 09  me(session));...
13120 2f 2a 20 54 69 6d 65 6f 75 74 20 76 61 6c 75 65  /* Timeout value
13130 20 2d 20 53 53 4c 5f 43 54 58 5f 67 65 74 5f 74   - SSL_CTX_get_t
13140 69 6d 65 6f 75 74 20 28 69 6e 20 73 65 63 6f 6e  imeout (in secon
13150 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
13160 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
13170 50 74 72 2c 20 22 74 69 6d 65 6f 75 74 22 2c 20  Ptr, "timeout", 
13180 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
13190 74 69 6d 65 6f 75 74 28 73 65 73 73 69 6f 6e 29  timeout(session)
131a0 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20  );.../* Session 
131b0 69 64 20 2d 20 54 4c 53 76 31 2e 32 20 61 6e 64  id - TLSv1.2 and
131c0 20 62 65 6c 6f 77 20 6f 6e 6c 79 20 2a 2f 0a 09   below only */..
131d0 73 65 73 73 69 6f 6e 5f 69 64 20 3d 20 53 53 4c  session_id = SSL
131e0 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f 69 64 28  _SESSION_get_id(
131f0 73 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b  session, &ulen);
13200 0a 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59  ..LAPPEND_BARRAY
13210 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c  (interp, objPtr,
13220 20 22 73 65 73 73 69 6f 6e 5f 69 64 22 2c 20 73   "session_id", s
13230 65 73 73 69 6f 6e 5f 69 64 2c 20 28 54 63 6c 5f  ession_id, (Tcl_
13240 53 69 7a 65 29 20 75 6c 65 6e 29 3b 0a 0a 09 2f  Size) ulen);.../
13250 2a 20 53 65 73 73 69 6f 6e 20 63 6f 6e 74 65 78  * Session contex
13260 74 20 2a 2f 0a 09 73 65 73 73 69 6f 6e 5f 69 64  t */..session_id
13270 20 3d 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67   = SSL_SESSION_g
13280 65 74 30 5f 69 64 5f 63 6f 6e 74 65 78 74 28 73  et0_id_context(s
13290 65 73 73 69 6f 6e 2c 20 26 75 6c 65 6e 29 3b 0a  ession, &ulen);.
132a0 09 4c 41 50 50 45 4e 44 5f 42 41 52 52 41 59 28  .LAPPEND_BARRAY(
132b0 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20  interp, objPtr, 
132c0 22 73 65 73 73 69 6f 6e 5f 63 6f 6e 74 65 78 74  "session_context
132d0 22 2c 20 73 65 73 73 69 6f 6e 5f 69 64 2c 20 28  ", session_id, (
132e0 54 63 6c 5f 53 69 7a 65 29 20 75 6c 65 6e 29 3b  Tcl_Size) ulen);
132f0 0a 0a 09 2f 2a 20 53 65 73 73 69 6f 6e 20 74 69  .../* Session ti
13300 63 6b 65 74 20 2d 20 63 6c 69 65 6e 74 20 6f 6e  cket - client on
13310 6c 79 20 2a 2f 0a 09 53 53 4c 5f 53 45 53 53 49  ly */..SSL_SESSI
13320 4f 4e 5f 67 65 74 30 5f 74 69 63 6b 65 74 28 73  ON_get0_ticket(s
13330 65 73 73 69 6f 6e 2c 20 26 74 69 63 6b 65 74 2c  ession, &ticket,
13340 20 26 6c 65 6e 32 29 3b 0a 09 4c 41 50 50 45 4e   &len2);..LAPPEN
13350 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c  D_BARRAY(interp,
13360 20 6f 62 6a 50 74 72 2c 20 22 73 65 73 73 69 6f   objPtr, "sessio
13370 6e 5f 74 69 63 6b 65 74 22 2c 20 74 69 63 6b 65  n_ticket", ticke
13380 74 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 6c 65  t, (Tcl_Size) le
13390 6e 32 29 3b 0a 0a 09 2f 2a 20 53 65 73 73 69 6f  n2);.../* Sessio
133a0 6e 20 74 69 63 6b 65 74 20 6c 69 66 65 74 69 6d  n ticket lifetim
133b0 65 20 68 69 6e 74 20 28 69 6e 20 73 65 63 6f 6e  e hint (in secon
133c0 64 73 29 20 2a 2f 0a 09 4c 41 50 50 45 4e 44 5f  ds) */..LAPPEND_
133d0 4c 4f 4e 47 28 69 6e 74 65 72 70 2c 20 6f 62 6a  LONG(interp, obj
133e0 50 74 72 2c 20 22 6c 69 66 65 74 69 6d 65 22 2c  Ptr, "lifetime",
133f0 20 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74   SSL_SESSION_get
13400 5f 74 69 63 6b 65 74 5f 6c 69 66 65 74 69 6d 65  _ticket_lifetime
13410 5f 68 69 6e 74 28 73 65 73 73 69 6f 6e 29 29 3b  _hint(session));
13420 0a 0a 09 2f 2a 20 54 69 63 6b 65 74 20 61 70 70  .../* Ticket app
13430 20 64 61 74 61 20 2a 2f 0a 23 69 66 20 4f 50 45   data */.#if OPE
13440 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
13450 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
13460 4c 0a 09 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67  L..SSL_SESSION_g
13470 65 74 30 5f 74 69 63 6b 65 74 5f 61 70 70 64 61  et0_ticket_appda
13480 74 61 28 28 53 53 4c 5f 53 45 53 53 49 4f 4e 20  ta((SSL_SESSION 
13490 2a 29 20 73 65 73 73 69 6f 6e 2c 20 26 74 69 63  *) session, &tic
134a0 6b 65 74 2c 20 26 6c 65 6e 32 29 3b 0a 09 4c 41  ket, &len2);..LA
134b0 50 50 45 4e 44 5f 42 41 52 52 41 59 28 69 6e 74  PPEND_BARRAY(int
134c0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 74 69  erp, objPtr, "ti
134d0 63 6b 65 74 5f 61 70 70 5f 64 61 74 61 22 2c 20  cket_app_data", 
134e0 74 69 63 6b 65 74 2c 20 28 54 63 6c 5f 53 69 7a  ticket, (Tcl_Siz
134f0 65 29 20 6c 65 6e 32 29 3b 0a 23 65 6e 64 69 66  e) len2);.#endif
13500 0a 0a 09 2f 2a 20 47 65 74 20 6d 61 73 74 65 72  .../* Get master
13510 20 6b 65 79 20 2a 2f 0a 09 6c 65 6e 32 20 3d 20   key */..len2 = 
13520 53 53 4c 5f 53 45 53 53 49 4f 4e 5f 67 65 74 5f  SSL_SESSION_get_
13530 6d 61 73 74 65 72 5f 6b 65 79 28 73 65 73 73 69  master_key(sessi
13540 6f 6e 2c 20 62 75 66 66 65 72 2c 20 53 53 4c 5f  on, buffer, SSL_
13550 4d 41 58 5f 4d 41 53 54 45 52 5f 4b 45 59 5f 4c  MAX_MASTER_KEY_L
13560 45 4e 47 54 48 29 3b 0a 09 4c 41 50 50 45 4e 44  ENGTH);..LAPPEND
13570 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20  _BARRAY(interp, 
13580 6f 62 6a 50 74 72 2c 20 22 6d 61 73 74 65 72 5f  objPtr, "master_
13590 6b 65 79 22 2c 20 62 75 66 66 65 72 2c 20 28 54  key", buffer, (T
135a0 63 6c 5f 53 69 7a 65 29 20 6c 65 6e 32 29 3b 0a  cl_Size) len2);.
135b0 0a 09 2f 2a 20 43 6f 6d 70 72 65 73 73 69 6f 6e  ../* Compression
135c0 20 69 64 20 2a 2f 0a 09 75 6e 73 69 67 6e 65 64   id */..unsigned
135d0 20 69 6e 74 20 69 64 20 3d 20 53 53 4c 5f 53 45   int id = SSL_SE
135e0 53 53 49 4f 4e 5f 67 65 74 5f 63 6f 6d 70 72 65  SSION_get_compre
135f0 73 73 5f 69 64 28 73 65 73 73 69 6f 6e 29 3b 0a  ss_id(session);.
13600 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
13610 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
13620 6d 70 72 65 73 73 69 6f 6e 5f 69 64 22 2c 20 69  mpression_id", i
13630 64 20 3d 3d 20 31 20 3f 20 22 7a 6c 69 62 22 20  d == 1 ? "zlib" 
13640 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a 20  : "none", -1);. 
13650 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6d     }..    /* Com
13660 70 72 65 73 73 69 6f 6e 20 69 6e 66 6f 20 2a 2f  pression info */
13670 0a 20 20 20 20 69 66 20 28 73 73 6c 20 21 3d 20  .    if (ssl != 
13680 4e 55 4c 4c 29 20 7b 0a 23 69 66 64 65 66 20 48  NULL) {.#ifdef H
13690 41 56 45 5f 53 53 4c 5f 43 4f 4d 50 52 45 53 53  AVE_SSL_COMPRESS
136a0 49 4f 4e 0a 09 63 6f 6e 73 74 20 43 4f 4d 50 5f  ION..const COMP_
136b0 4d 45 54 48 4f 44 20 2a 63 6f 6d 70 2c 20 2a 65  METHOD *comp, *e
136c0 78 70 6e 3b 0a 09 63 6f 6d 70 20 3d 20 53 53 4c  xpn;..comp = SSL
136d0 5f 67 65 74 5f 63 75 72 72 65 6e 74 5f 63 6f 6d  _get_current_com
136e0 70 72 65 73 73 69 6f 6e 28 73 73 6c 29 3b 0a 09  pression(ssl);..
136f0 65 78 70 6e 20 3d 20 53 53 4c 5f 67 65 74 5f 63  expn = SSL_get_c
13700 75 72 72 65 6e 74 5f 65 78 70 61 6e 73 69 6f 6e  urrent_expansion
13710 28 73 73 6c 29 3b 0a 0a 09 4c 41 50 50 45 4e 44  (ssl);...LAPPEND
13720 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _STR(interp, obj
13730 50 74 72 2c 20 22 63 6f 6d 70 72 65 73 73 69 6f  Ptr, "compressio
13740 6e 22 2c 20 63 6f 6d 70 20 3f 20 53 53 4c 5f 43  n", comp ? SSL_C
13750 4f 4d 50 5f 67 65 74 5f 6e 61 6d 65 28 63 6f 6d  OMP_get_name(com
13760 70 29 20 3a 20 22 6e 6f 6e 65 22 2c 20 2d 31 29  p) : "none", -1)
13770 3b 0a 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69  ;..LAPPEND_STR(i
13780 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22  nterp, objPtr, "
13790 65 78 70 61 6e 73 69 6f 6e 22 2c 20 65 78 70 6e  expansion", expn
137a0 20 3f 20 53 53 4c 5f 43 4f 4d 50 5f 67 65 74 5f   ? SSL_COMP_get_
137b0 6e 61 6d 65 28 65 78 70 6e 29 20 3a 20 22 6e 6f  name(expn) : "no
137c0 6e 65 22 2c 20 2d 31 29 3b 0a 23 65 6c 73 65 0a  ne", -1);.#else.
137d0 09 4c 41 50 50 45 4e 44 5f 53 54 52 28 69 6e 74  .LAPPEND_STR(int
137e0 65 72 70 2c 20 6f 62 6a 50 74 72 2c 20 22 63 6f  erp, objPtr, "co
137f0 6d 70 72 65 73 73 69 6f 6e 22 2c 20 22 6e 6f 6e  mpression", "non
13800 65 22 2c 20 2d 31 29 3b 0a 09 4c 41 50 50 45 4e  e", -1);..LAPPEN
13810 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
13820 6a 50 74 72 2c 20 22 65 78 70 61 6e 73 69 6f 6e  jPtr, "expansion
13830 22 2c 20 22 6e 6f 6e 65 22 2c 20 2d 31 29 3b 0a  ", "none", -1);.
13840 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
13850 20 20 2f 2a 20 53 65 72 76 65 72 20 69 6e 66 6f    /* Server info
13860 20 2a 2f 0a 20 20 20 20 7b 0a 09 6c 6f 6e 67 20   */.    {..long 
13870 6d 6f 64 65 20 3d 20 53 53 4c 5f 43 54 58 5f 67  mode = SSL_CTX_g
13880 65 74 5f 73 65 73 73 69 6f 6e 5f 63 61 63 68 65  et_session_cache
13890 5f 6d 6f 64 65 28 73 74 61 74 65 50 74 72 2d 3e  _mode(statePtr->
138a0 63 74 78 29 3b 0a 09 63 68 61 72 20 2a 6d 73 67  ctx);..char *msg
138b0 3b 0a 0a 09 69 66 20 28 6d 6f 64 65 20 26 20 53  ;...if (mode & S
138c0 53 4c 5f 53 45 53 53 5f 43 41 43 48 45 5f 4f 46  SL_SESS_CACHE_OF
138d0 46 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20  F) {..    msg = 
138e0 22 6f 66 66 22 3b 0a 09 7d 20 65 6c 73 65 20 69  "off";..} else i
138f0 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53 45  f (mode & SSL_SE
13900 53 53 5f 43 41 43 48 45 5f 43 4c 49 45 4e 54 29  SS_CACHE_CLIENT)
13910 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 63   {..    msg = "c
13920 6c 69 65 6e 74 22 3b 0a 09 7d 20 65 6c 73 65 20  lient";..} else 
13930 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f 53  if (mode & SSL_S
13940 45 53 53 5f 43 41 43 48 45 5f 53 45 52 56 45 52  ESS_CACHE_SERVER
13950 29 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22  ) {..    msg = "
13960 73 65 72 76 65 72 22 3b 0a 09 7d 20 65 6c 73 65  server";..} else
13970 20 69 66 20 28 6d 6f 64 65 20 26 20 53 53 4c 5f   if (mode & SSL_
13980 53 45 53 53 5f 43 41 43 48 45 5f 42 4f 54 48 29  SESS_CACHE_BOTH)
13990 20 7b 0a 09 20 20 20 20 6d 73 67 20 3d 20 22 62   {..    msg = "b
139a0 6f 74 68 22 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a  oth";..} else {.
139b0 09 20 20 20 20 6d 73 67 20 3d 20 22 75 6e 6b 6e  .    msg = "unkn
139c0 6f 77 6e 22 3b 0a 09 7d 0a 09 4c 41 50 50 45 4e  own";..}..LAPPEN
139d0 44 5f 53 54 52 28 69 6e 74 65 72 70 2c 20 6f 62  D_STR(interp, ob
139e0 6a 50 74 72 2c 20 22 73 65 73 73 69 6f 6e 5f 63  jPtr, "session_c
139f0 61 63 68 65 5f 6d 6f 64 65 22 2c 20 6d 73 67 2c  ache_mode", msg,
13a00 20 2d 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   -1);.    }..   
13a10 20 2f 2a 20 43 41 20 4c 69 73 74 20 2a 2f 0a 20   /* CA List */. 
13a20 20 20 20 2f 2a 20 49 46 20 6e 6f 74 20 61 20 73     /* IF not a s
13a30 65 72 76 65 72 2c 20 73 61 6d 65 20 61 73 20 53  erver, same as S
13a40 53 4c 5f 67 65 74 30 5f 70 65 65 72 5f 43 41 5f  SL_get0_peer_CA_
13a50 6c 69 73 74 2e 20 49 66 20 73 65 72 76 65 72 20  list. If server 
13a60 73 61 6d 65 20 61 73 20 53 53 4c 5f 43 54 58 5f  same as SSL_CTX_
13a70 67 65 74 5f 63 6c 69 65 6e 74 5f 43 41 5f 6c 69  get_client_CA_li
13a80 73 74 20 2a 2f 0a 20 20 20 20 6c 69 73 74 50 74  st */.    listPt
13a90 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
13aa0 62 6a 28 30 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  bj(0, NULL);.   
13ab0 20 53 54 41 43 4b 5f 4f 46 28 58 35 30 39 5f 4e   STACK_OF(X509_N
13ac0 41 4d 45 29 20 2a 63 61 5f 6c 69 73 74 3b 0a 20  AME) *ca_list;. 
13ad0 20 20 20 69 66 20 28 28 63 61 5f 6c 69 73 74 20     if ((ca_list 
13ae0 3d 20 53 53 4c 5f 67 65 74 5f 63 6c 69 65 6e 74  = SSL_get_client
13af0 5f 43 41 5f 6c 69 73 74 28 73 73 6c 29 29 20 21  _CA_list(ssl)) !
13b00 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 68 61 72 20  = NULL) {..char 
13b10 62 75 66 66 65 72 5b 42 55 46 53 49 5a 5d 3b 0a  buffer[BUFSIZ];.
13b20 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b  .for (int i = 0;
13b30 20 69 20 3c 20 73 6b 5f 58 35 30 39 5f 4e 41 4d   i < sk_X509_NAM
13b40 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74 29 3b 20  E_num(ca_list); 
13b50 69 2b 2b 29 20 7b 0a 09 20 20 20 20 58 35 30 39  i++) {..    X509
13b60 5f 4e 41 4d 45 20 2a 6e 61 6d 65 20 3d 20 73 6b  _NAME *name = sk
13b70 5f 58 35 30 39 5f 4e 41 4d 45 5f 76 61 6c 75 65  _X509_NAME_value
13b80 28 63 61 5f 6c 69 73 74 2c 20 69 29 3b 0a 09 20  (ca_list, i);.. 
13b90 20 20 20 69 66 20 28 6e 61 6d 65 29 20 7b 0a 09     if (name) {..
13ba0 09 58 35 30 39 5f 4e 41 4d 45 5f 6f 6e 65 6c 69  .X509_NAME_oneli
13bb0 6e 65 28 6e 61 6d 65 2c 20 62 75 66 66 65 72 2c  ne(name, buffer,
13bc0 20 42 55 46 53 49 5a 29 3b 0a 09 09 54 63 6c 5f   BUFSIZ);...Tcl_
13bd0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
13be0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
13bf0 74 50 74 72 2c 20 54 63 6c 5f 4e 65 77 53 74 72  tPtr, Tcl_NewStr
13c00 69 6e 67 4f 62 6a 28 62 75 66 66 65 72 2c 20 2d  ingObj(buffer, -
13c10 31 29 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20  1));..    }..}. 
13c20 20 20 20 7d 0a 20 20 20 20 4c 41 50 50 45 4e 44     }.    LAPPEND
13c30 5f 4f 42 4a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  _OBJ(interp, obj
13c40 50 74 72 2c 20 22 63 61 4c 69 73 74 22 2c 20 6c  Ptr, "caList", l
13c50 69 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 41 50  istPtr);.    LAP
13c60 50 45 4e 44 5f 49 4e 54 28 69 6e 74 65 72 70 2c  PEND_INT(interp,
13c70 20 6f 62 6a 50 74 72 2c 20 22 63 61 4c 69 73 74   objPtr, "caList
13c80 43 6f 75 6e 74 22 2c 20 73 6b 5f 58 35 30 39 5f  Count", sk_X509_
13c90 4e 41 4d 45 5f 6e 75 6d 28 63 61 5f 6c 69 73 74  NAME_num(ca_list
13ca0 29 29 3b 0a 0a 20 20 20 20 54 63 6c 5f 53 65 74  ));..    Tcl_Set
13cb0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
13cc0 2c 20 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 72  , objPtr);.    r
13cd0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
13ce0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13cf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
13d30 20 56 65 72 73 69 6f 6e 4f 62 6a 43 6d 64 20 2d   VersionObjCmd -
13d40 2d 20 72 65 74 75 72 6e 20 76 65 72 73 69 6f 6e  - return version
13d50 20 73 74 72 69 6e 67 20 66 72 6f 6d 20 4f 70 65   string from Ope
13d60 6e 53 53 4c 2e 0a 20 2a 0a 20 2a 20 52 65 73 75  nSSL.. *. * Resu
13d70 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61  lts:. *.A standa
13d80 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e 0a 20  rd Tcl result.. 
13d90 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
13da0 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20  s:. *.None.. *. 
13db0 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
13dc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13dd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13de0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13df0 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ----. */.static 
13e00 69 6e 74 0a 56 65 72 73 69 6f 6e 4f 62 6a 43 6d  int.VersionObjCm
13e10 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
13e20 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
13e30 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
13e40 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
13e50 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
13e60 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a      Tcl_Obj *obj
13e70 50 74 72 3b 0a 20 20 20 20 28 76 6f 69 64 29 20  Ptr;.    (void) 
13e80 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20  clientData;.    
13e90 28 76 6f 69 64 29 20 6f 62 6a 63 3b 0a 20 20 20  (void) objc;.   
13ea0 20 28 76 6f 69 64 29 20 6f 62 6a 76 3b 0a 0a 20   (void) objv;.. 
13eb0 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c     dprintf("Call
13ec0 65 64 22 29 3b 0a 0a 20 20 20 20 6f 62 6a 50 74  ed");..    objPt
13ed0 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  r = Tcl_NewStrin
13ee0 67 4f 62 6a 28 4f 50 45 4e 53 53 4c 5f 56 45 52  gObj(OPENSSL_VER
13ef0 53 49 4f 4e 5f 54 45 58 54 2c 20 2d 31 29 3b 0a  SION_TEXT, -1);.
13f00 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
13f10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a  sult(interp, obj
13f20 50 74 72 29 3b 0a 0a 20 20 20 20 72 65 74 75 72  Ptr);..    retur
13f30 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
13f40 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 4d 69 73  ------. *. * Mis
13f90 63 4f 62 6a 43 6d 64 20 2d 2d 20 6d 69 73 63 20  cObjCmd -- misc 
13fa0 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52  commands. *. * R
13fb0 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61  esults:. *.A sta
13fc0 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74  ndard Tcl result
13fd0 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
13fe0 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
13ff0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
14000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14030 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74  -------. */.stat
14040 69 63 20 69 6e 74 0a 4d 69 73 63 4f 62 6a 43 6d  ic int.MiscObjCm
14050 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69  d(ClientData cli
14060 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74  entData, Tcl_Int
14070 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
14080 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a   objc, Tcl_Obj *
14090 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a  const objv[]) {.
140a0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
140b0 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 73 20   char *commands 
140c0 5b 5d 20 3d 20 7b 20 22 72 65 71 22 2c 20 22 73  [] = { "req", "s
140d0 74 72 72 65 71 22 2c 20 4e 55 4c 4c 20 7d 3b 0a  trreq", NULL };.
140e0 20 20 20 20 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64      enum command
140f0 20 7b 20 43 5f 52 45 51 2c 20 43 5f 53 54 52 52   { C_REQ, C_STRR
14100 45 51 2c 20 43 5f 44 55 4d 4d 59 20 7d 3b 0a 20  EQ, C_DUMMY };. 
14110 20 20 20 54 63 6c 5f 53 69 7a 65 20 63 6d 64 3b     Tcl_Size cmd;
14120 0a 20 20 20 20 69 6e 74 20 69 73 53 74 72 3b 0a  .    int isStr;.
14130 20 20 20 20 63 68 61 72 20 62 75 66 66 65 72 5b      char buffer[
14140 31 36 33 38 34 5d 3b 0a 20 20 20 20 28 76 6f 69  16384];.    (voi
14150 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a  d) clientData;..
14160 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
14170 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69 66 20 28  led");..    if (
14180 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c  objc < 2) {..Tcl
14190 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
141a0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
141b0 73 75 62 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 73  subcommand ?args
141c0 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c  ?");..return TCL
141d0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
141e0 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64    if (Tcl_GetInd
141f0 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
14200 2c 20 6f 62 6a 76 5b 31 5d 2c 20 63 6f 6d 6d 61  , objv[1], comma
14210 6e 64 73 2c 20 22 63 6f 6d 6d 61 6e 64 22 2c 20  nds, "command", 
14220 30 2c 20 26 63 6d 64 29 20 21 3d 20 54 43 4c 5f  0, &cmd) != TCL_
14230 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43  OK) {..return TC
14240 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
14250 20 20 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72      ERR_clear_er
14260 72 6f 72 28 29 3b 0a 0a 20 20 20 20 69 73 53 74  ror();..    isSt
14270 72 20 3d 20 28 63 6d 64 20 3d 3d 20 43 5f 53 54  r = (cmd == C_ST
14280 52 52 45 51 29 3b 0a 20 20 20 20 73 77 69 74 63  RREQ);.    switc
14290 68 20 28 28 65 6e 75 6d 20 63 6f 6d 6d 61 6e 64  h ((enum command
142a0 29 20 63 6d 64 29 20 7b 0a 09 63 61 73 65 20 43  ) cmd) {..case C
142b0 5f 52 45 51 3a 0a 09 63 61 73 65 20 43 5f 53 54  _REQ:..case C_ST
142c0 52 52 45 51 3a 20 7b 0a 09 20 20 20 20 45 56 50  RREQ: {..    EVP
142d0 5f 50 4b 45 59 20 2a 70 6b 65 79 3d 4e 55 4c 4c  _PKEY *pkey=NULL
142e0 3b 0a 09 20 20 20 20 58 35 30 39 20 2a 63 65 72  ;..    X509 *cer
142f0 74 3d 4e 55 4c 4c 3b 0a 09 20 20 20 20 58 35 30  t=NULL;..    X50
14300 39 5f 4e 41 4d 45 20 2a 6e 61 6d 65 3d 4e 55 4c  9_NAME *name=NUL
14310 4c 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20  L;..    Tcl_Obj 
14320 2a 2a 6c 69 73 74 76 3b 0a 09 20 20 20 20 54 63  **listv;..    Tc
14330 6c 5f 53 69 7a 65 20 6c 69 73 74 63 3b 0a 09 20  l_Size listc;.. 
14340 20 20 20 69 6e 74 20 69 3b 0a 0a 09 20 20 20 20     int i;...    
14350 42 49 4f 20 2a 6f 75 74 3d 4e 55 4c 4c 3b 0a 0a  BIO *out=NULL;..
14360 09 20 20 20 20 63 68 61 72 20 2a 6b 5f 43 3d 22  .    char *k_C="
14370 22 2c 2a 6b 5f 53 54 3d 22 22 2c 2a 6b 5f 4c 3d  ",*k_ST="",*k_L=
14380 22 22 2c 2a 6b 5f 4f 3d 22 22 2c 2a 6b 5f 4f 55  "",*k_O="",*k_OU
14390 3d 22 22 2c 2a 6b 5f 43 4e 3d 22 22 2c 2a 6b 5f  ="",*k_CN="",*k_
143a0 45 6d 61 69 6c 3d 22 22 3b 0a 09 20 20 20 20 63  Email="";..    c
143b0 68 61 72 20 2a 6b 65 79 6f 75 74 2c 2a 70 65 6d  har *keyout,*pem
143c0 6f 75 74 2c 2a 73 74 72 3b 0a 09 20 20 20 20 69  out,*str;..    i
143d0 6e 74 20 6b 65 79 73 69 7a 65 2c 73 65 72 69 61  nt keysize,seria
143e0 6c 3d 30 2c 64 61 79 73 3d 33 36 35 3b 0a 0a 23  l=0,days=365;..#
143f0 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49  if OPENSSL_VERSI
14400 4f 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30  ON_NUMBER < 0x30
14410 30 30 30 30 30 30 4c 0a 09 20 20 20 20 42 49 47  000000L..    BIG
14420 4e 55 4d 20 2a 62 6e 65 20 3d 20 4e 55 4c 4c 3b  NUM *bne = NULL;
14430 0a 09 20 20 20 20 52 53 41 20 2a 72 73 61 20 3d  ..    RSA *rsa =
14440 20 4e 55 4c 4c 3b 0a 23 65 6c 73 65 0a 09 20 20   NULL;.#else..  
14450 20 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 20 2a    EVP_PKEY_CTX *
14460 63 74 78 20 3d 20 4e 55 4c 4c 3b 0a 23 65 6e 64  ctx = NULL;.#end
14470 69 66 0a 0a 09 20 20 20 20 69 66 20 28 28 6f 62  if...    if ((ob
14480 6a 63 3c 35 29 20 7c 7c 20 28 6f 62 6a 63 3e 36  jc<5) || (objc>6
14490 29 29 20 7b 0a 09 09 54 63 6c 5f 57 72 6f 6e 67  )) {...Tcl_Wrong
144a0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
144b0 32 2c 20 6f 62 6a 76 2c 20 22 6b 65 79 73 69 7a  2, objv, "keysiz
144c0 65 20 6b 65 79 66 69 6c 65 20 63 65 72 74 66 69  e keyfile certfi
144d0 6c 65 20 3f 69 6e 66 6f 3f 22 29 3b 0a 09 09 72  le ?info?");...r
144e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
144f0 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66  ..    }...    if
14500 20 28 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d   (Tcl_GetIntFrom
14510 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14520 5b 32 5d 2c 20 26 6b 65 79 73 69 7a 65 29 20 21  [2], &keysize) !
14530 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65  = TCL_OK) {...re
14540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14550 09 20 20 20 20 7d 0a 09 20 20 20 20 6b 65 79 6f  .    }..    keyo
14560 75 74 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ut=Tcl_GetString
14570 28 6f 62 6a 76 5b 33 5d 29 3b 0a 09 20 20 20 20  (objv[3]);..    
14580 70 65 6d 6f 75 74 3d 54 63 6c 5f 47 65 74 53 74  pemout=Tcl_GetSt
14590 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 09  ring(objv[4]);..
145a0 20 20 20 20 69 66 20 28 69 73 53 74 72 29 20 7b      if (isStr) {
145b0 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28 69 6e  ...Tcl_SetVar(in
145c0 74 65 72 70 2c 6b 65 79 6f 75 74 2c 22 22 2c 30  terp,keyout,"",0
145d0 29 3b 0a 09 09 54 63 6c 5f 53 65 74 56 61 72 28  );...Tcl_SetVar(
145e0 69 6e 74 65 72 70 2c 70 65 6d 6f 75 74 2c 22 22  interp,pemout,""
145f0 2c 30 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  ,0);..    }...  
14600 20 20 69 66 20 28 6f 62 6a 63 3e 3d 36 29 20 7b    if (objc>=6) {
14610 0a 09 09 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f  ...if (Tcl_ListO
14620 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
14630 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26  terp, objv[5], &
14640 6c 69 73 74 63 2c 20 26 6c 69 73 74 76 29 20 21  listc, &listv) !
14650 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 20 20  = TCL_OK) {...  
14660 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14670 4f 52 3b 0a 09 09 7d 0a 0a 09 09 69 66 20 28 28  OR;...}....if ((
14680 6c 69 73 74 63 25 32 29 20 21 3d 20 30 29 20 7b  listc%2) != 0) {
14690 0a 09 09 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ...    Tcl_SetRe
146a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 49 6e 66  sult(interp,"Inf
146b0 6f 72 6d 61 74 69 6f 6e 20 6c 69 73 74 20 6d 75  ormation list mu
146c0 73 74 20 68 61 76 65 20 65 76 65 6e 20 6e 75 6d  st have even num
146d0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
146e0 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
146f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
14700 0a 09 09 7d 0a 09 09 66 6f 72 20 28 69 3d 30 3b  ...}...for (i=0;
14710 20 69 3c 6c 69 73 74 63 3b 20 69 2b 3d 32 29 20   i<listc; i+=2) 
14720 7b 0a 09 09 20 20 20 20 73 74 72 3d 54 63 6c 5f  {...    str=Tcl_
14730 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14740 69 5d 29 3b 0a 09 09 20 20 20 20 69 66 20 28 73  i]);...    if (s
14750 74 72 63 6d 70 28 73 74 72 2c 22 64 61 79 73 22  trcmp(str,"days"
14760 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
14770 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14780 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
14790 31 5d 2c 26 64 61 79 73 29 21 3d 54 43 4c 5f 4f  1],&days)!=TCL_O
147a0 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75 72 6e  K)....    return
147b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 20 20   TCL_ERROR;...  
147c0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72    } else if (str
147d0 63 6d 70 28 73 74 72 2c 22 73 65 72 69 61 6c 22  cmp(str,"serial"
147e0 29 3d 3d 30 29 20 7b 0a 09 09 09 69 66 20 28 54  )==0) {....if (T
147f0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14800 28 69 6e 74 65 72 70 2c 6c 69 73 74 76 5b 69 2b  (interp,listv[i+
14810 31 5d 2c 26 73 65 72 69 61 6c 29 21 3d 54 43 4c  1],&serial)!=TCL
14820 5f 4f 4b 29 0a 09 09 09 20 20 20 20 72 65 74 75  _OK)....    retu
14830 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09  rn TCL_ERROR;...
14840 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73      } else if (s
14850 74 72 63 6d 70 28 73 74 72 2c 22 43 22 29 3d 3d  trcmp(str,"C")==
14860 30 29 20 7b 0a 09 09 09 6b 5f 43 3d 54 63 6c 5f  0) {....k_C=Tcl_
14870 47 65 74 53 74 72 69 6e 67 28 6c 69 73 74 76 5b  GetString(listv[
14880 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65  i+1]);...    } e
14890 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 28 73  lse if (strcmp(s
148a0 74 72 2c 22 53 54 22 29 3d 3d 30 29 20 7b 0a 09  tr,"ST")==0) {..
148b0 09 09 6b 5f 53 54 3d 54 63 6c 5f 47 65 74 53 74  ..k_ST=Tcl_GetSt
148c0 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29  ring(listv[i+1])
148d0 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65 20 69  ;...    } else i
148e0 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c 22 4c  f (strcmp(str,"L
148f0 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 4c 3d  ")==0) {....k_L=
14900 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14910 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14920 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63   } else if (strc
14930 6d 70 28 73 74 72 2c 22 4f 22 29 3d 3d 30 29 20  mp(str,"O")==0) 
14940 7b 0a 09 09 09 6b 5f 4f 3d 54 63 6c 5f 47 65 74  {....k_O=Tcl_Get
14950 53 74 72 69 6e 67 28 6c 69 73 74 76 5b 69 2b 31  String(listv[i+1
14960 5d 29 3b 0a 09 09 20 20 20 20 7d 20 65 6c 73 65  ]);...    } else
14970 20 69 66 20 28 73 74 72 63 6d 70 28 73 74 72 2c   if (strcmp(str,
14980 22 4f 55 22 29 3d 3d 30 29 20 7b 0a 09 09 09 6b  "OU")==0) {....k
14990 5f 4f 55 3d 54 63 6c 5f 47 65 74 53 74 72 69 6e  _OU=Tcl_GetStrin
149a0 67 28 6c 69 73 74 76 5b 69 2b 31 5d 29 3b 0a 09  g(listv[i+1]);..
149b0 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28  .    } else if (
149c0 73 74 72 63 6d 70 28 73 74 72 2c 22 43 4e 22 29  strcmp(str,"CN")
149d0 3d 3d 30 29 20 7b 0a 09 09 09 6b 5f 43 4e 3d 54  ==0) {....k_CN=T
149e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69 73  cl_GetString(lis
149f0 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20 20  tv[i+1]);...    
14a00 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d  } else if (strcm
14a10 70 28 73 74 72 2c 22 45 6d 61 69 6c 22 29 3d 3d  p(str,"Email")==
14a20 30 29 20 7b 0a 09 09 09 6b 5f 45 6d 61 69 6c 3d  0) {....k_Email=
14a30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6c 69  Tcl_GetString(li
14a40 73 74 76 5b 69 2b 31 5d 29 3b 0a 09 09 20 20 20  stv[i+1]);...   
14a50 20 7d 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c   } else {....Tcl
14a60 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
14a70 70 2c 22 55 6e 6b 6e 6f 77 6e 20 70 61 72 61 6d  p,"Unknown param
14a80 65 74 65 72 22 2c 4e 55 4c 4c 29 3b 0a 09 09 09  eter",NULL);....
14a90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14aa0 3b 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 20  ;...    }...}.. 
14ab0 20 20 20 7d 0a 0a 23 69 66 20 4f 50 45 4e 53 53     }..#if OPENSS
14ac0 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52  L_VERSION_NUMBER
14ad0 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a 09   < 0x30000000L..
14ae0 20 20 20 20 62 6e 65 20 3d 20 42 4e 5f 6e 65 77      bne = BN_new
14af0 28 29 3b 0a 09 20 20 20 20 72 73 61 20 3d 20 52  ();..    rsa = R
14b00 53 41 5f 6e 65 77 28 29 3b 0a 09 20 20 20 20 70  SA_new();..    p
14b10 6b 65 79 20 3d 20 45 56 50 5f 50 4b 45 59 5f 6e  key = EVP_PKEY_n
14b20 65 77 28 29 3b 0a 09 20 20 20 20 69 66 20 28 62  ew();..    if (b
14b30 6e 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 72 73  ne == NULL || rs
14b40 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 70 6b 65  a == NULL || pke
14b50 79 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 42 4e  y == NULL || !BN
14b60 5f 73 65 74 5f 77 6f 72 64 28 62 6e 65 2c 52 53  _set_word(bne,RS
14b70 41 5f 46 34 29 20 7c 7c 0a 09 09 21 52 53 41 5f  A_F4) ||...!RSA_
14b80 67 65 6e 65 72 61 74 65 5f 6b 65 79 5f 65 78 28  generate_key_ex(
14b90 72 73 61 2c 20 6b 65 79 73 69 7a 65 2c 20 62 6e  rsa, keysize, bn
14ba0 65 2c 20 4e 55 4c 4c 29 20 7c 7c 20 21 45 56 50  e, NULL) || !EVP
14bb0 5f 50 4b 45 59 5f 61 73 73 69 67 6e 5f 52 53 41  _PKEY_assign_RSA
14bc0 28 70 6b 65 79 2c 20 72 73 61 29 29 20 7b 0a 09  (pkey, rsa)) {..
14bd0 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70  .EVP_PKEY_free(p
14be0 6b 65 79 29 3b 0a 09 09 2f 2a 20 52 53 41 5f 66  key);.../* RSA_f
14bf0 72 65 65 28 72 73 61 29 3b 20 66 72 65 65 64 20  ree(rsa); freed 
14c00 62 79 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  by EVP_PKEY_free
14c10 20 2a 2f 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e   */...BN_free(bn
14c20 65 29 3b 0a 23 65 6c 73 65 0a 09 20 20 20 20 70  e);.#else..    p
14c30 6b 65 79 20 3d 20 45 56 50 5f 52 53 41 5f 67 65  key = EVP_RSA_ge
14c40 6e 28 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  n((unsigned int)
14c50 20 6b 65 79 73 69 7a 65 29 3b 0a 09 20 20 20 20   keysize);..    
14c60 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59 5f 43  ctx = EVP_PKEY_C
14c70 54 58 5f 6e 65 77 28 70 6b 65 79 2c 4e 55 4c 4c  TX_new(pkey,NULL
14c80 29 3b 0a 09 20 20 20 20 69 66 20 28 70 6b 65 79  );..    if (pkey
14c90 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 63 74 78 20   == NULL || ctx 
14ca0 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 21 45 56 50 5f  == NULL || !EVP_
14cb0 50 4b 45 59 5f 6b 65 79 67 65 6e 5f 69 6e 69 74  PKEY_keygen_init
14cc0 28 63 74 78 29 20 7c 7c 0a 09 09 21 45 56 50 5f  (ctx) ||...!EVP_
14cd0 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 72 73 61  PKEY_CTX_set_rsa
14ce0 5f 6b 65 79 67 65 6e 5f 62 69 74 73 28 63 74 78  _keygen_bits(ctx
14cf0 2c 20 6b 65 79 73 69 7a 65 29 20 7c 7c 20 21 45  , keysize) || !E
14d00 56 50 5f 50 4b 45 59 5f 6b 65 79 67 65 6e 28 63  VP_PKEY_keygen(c
14d10 74 78 2c 20 26 70 6b 65 79 29 29 20 7b 0a 09 09  tx, &pkey)) {...
14d20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28 70 6b  EVP_PKEY_free(pk
14d30 65 79 29 3b 0a 09 09 45 56 50 5f 50 4b 45 59 5f  ey);...EVP_PKEY_
14d40 43 54 58 5f 66 72 65 65 28 63 74 78 29 3b 0a 23  CTX_free(ctx);.#
14d50 65 6e 64 69 66 0a 09 09 54 63 6c 5f 53 65 74 52  endif...Tcl_SetR
14d60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 45 72  esult(interp,"Er
14d70 72 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 70  ror generating p
14d80 72 69 76 61 74 65 20 6b 65 79 22 2c 4e 55 4c 4c  rivate key",NULL
14d90 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
14da0 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 20 65 6c  ERROR;..    } el
14db0 73 65 20 7b 0a 09 09 69 66 20 28 69 73 53 74 72  se {...if (isStr
14dc0 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42 49  ) {...    out=BI
14dd0 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d 28  O_new(BIO_s_mem(
14de0 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77 72  ));...    PEM_wr
14df0 69 74 65 5f 62 69 6f 5f 50 72 69 76 61 74 65 4b  ite_bio_PrivateK
14e00 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e 55 4c 4c  ey(out,pkey,NULL
14e10 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c 4e 55 4c  ,NULL,0,NULL,NUL
14e20 4c 29 3b 0a 09 09 20 20 20 20 69 3d 42 49 4f 5f  L);...    i=BIO_
14e30 72 65 61 64 28 6f 75 74 2c 62 75 66 66 65 72 2c  read(out,buffer,
14e40 73 69 7a 65 6f 66 28 62 75 66 66 65 72 29 2d 31  sizeof(buffer)-1
14e50 29 3b 0a 09 09 20 20 20 20 69 3d 28 69 3c 30 29  );...    i=(i<0)
14e60 20 3f 20 30 20 3a 20 69 3b 0a 09 09 20 20 20 20   ? 0 : i;...    
14e70 62 75 66 66 65 72 5b 69 5d 3d 27 5c 30 27 3b 0a  buffer[i]='\0';.
14e80 09 09 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ..    Tcl_SetVar
14e90 28 69 6e 74 65 72 70 2c 6b 65 79 6f 75 74 2c 62  (interp,keyout,b
14ea0 75 66 66 65 72 2c 30 29 3b 0a 09 09 20 20 20 20  uffer,0);...    
14eb0 42 49 4f 5f 66 6c 75 73 68 28 6f 75 74 29 3b 0a  BIO_flush(out);.
14ec0 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 28 6f  ..    BIO_free(o
14ed0 75 74 29 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a  ut);...} else {.
14ee0 09 09 20 20 20 20 6f 75 74 3d 42 49 4f 5f 6e 65  ..    out=BIO_ne
14ef0 77 28 42 49 4f 5f 73 5f 66 69 6c 65 28 29 29 3b  w(BIO_s_file());
14f00 0a 09 09 20 20 20 20 42 49 4f 5f 77 72 69 74 65  ...    BIO_write
14f10 5f 66 69 6c 65 6e 61 6d 65 28 6f 75 74 2c 6b 65  _filename(out,ke
14f20 79 6f 75 74 29 3b 0a 09 09 20 20 20 20 50 45 4d  yout);...    PEM
14f30 5f 77 72 69 74 65 5f 62 69 6f 5f 50 72 69 76 61  _write_bio_Priva
14f40 74 65 4b 65 79 28 6f 75 74 2c 70 6b 65 79 2c 4e  teKey(out,pkey,N
14f50 55 4c 4c 2c 4e 55 4c 4c 2c 30 2c 4e 55 4c 4c 2c  ULL,NULL,0,NULL,
14f60 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 2f 2a 20  NULL);...    /* 
14f70 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f 52 53  PEM_write_bio_RS
14f80 41 50 72 69 76 61 74 65 4b 65 79 28 6f 75 74 2c  APrivateKey(out,
14f90 20 72 73 61 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c   rsa, NULL, NULL
14fa0 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  , 0, NULL, NULL)
14fb0 3b 20 2a 2f 0a 09 09 20 20 20 20 42 49 4f 5f 66  ; */...    BIO_f
14fc0 72 65 65 5f 61 6c 6c 28 6f 75 74 29 3b 0a 09 20  ree_all(out);.. 
14fd0 09 7d 0a 0a 09 09 69 66 20 28 28 63 65 72 74 3d  .}....if ((cert=
14fe0 58 35 30 39 5f 6e 65 77 28 29 29 3d 3d 4e 55 4c  X509_new())==NUL
14ff0 4c 29 20 7b 0a 09 09 20 20 20 20 54 63 6c 5f 53  L) {...    Tcl_S
15000 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
15010 22 45 72 72 6f 72 20 67 65 6e 65 72 61 74 69 6e  "Error generatin
15020 67 20 63 65 72 74 69 66 69 63 61 74 65 20 72 65  g certificate re
15030 71 75 65 73 74 22 2c 4e 55 4c 4c 29 3b 0a 09 09  quest",NULL);...
15040 20 20 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65      EVP_PKEY_fre
15050 65 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45  e(pkey);.#if OPE
15060 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d  NSSL_VERSION_NUM
15070 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30  BER < 0x30000000
15080 4c 0a 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28  L...    BN_free(
15090 62 6e 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20  bne);.#endif... 
150a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
150b0 52 4f 52 3b 0a 09 09 7d 0a 0a 09 09 58 35 30 39  ROR;...}....X509
150c0 5f 73 65 74 5f 76 65 72 73 69 6f 6e 28 63 65 72  _set_version(cer
150d0 74 2c 32 29 3b 0a 09 09 41 53 4e 31 5f 49 4e 54  t,2);...ASN1_INT
150e0 45 47 45 52 5f 73 65 74 28 58 35 30 39 5f 67 65  EGER_set(X509_ge
150f0 74 5f 73 65 72 69 61 6c 4e 75 6d 62 65 72 28 63  t_serialNumber(c
15100 65 72 74 29 2c 73 65 72 69 61 6c 29 3b 0a 09 09  ert),serial);...
15110 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
15120 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 42 65 66  X509_getm_notBef
15130 6f 72 65 28 63 65 72 74 29 2c 30 29 3b 0a 09 09  ore(cert),0);...
15140 58 35 30 39 5f 67 6d 74 69 6d 65 5f 61 64 6a 28  X509_gmtime_adj(
15150 58 35 30 39 5f 67 65 74 6d 5f 6e 6f 74 41 66 74  X509_getm_notAft
15160 65 72 28 63 65 72 74 29 2c 28 6c 6f 6e 67 29 36  er(cert),(long)6
15170 30 2a 36 30 2a 32 34 2a 64 61 79 73 29 3b 0a 09  0*60*24*days);..
15180 09 58 35 30 39 5f 73 65 74 5f 70 75 62 6b 65 79  .X509_set_pubkey
15190 28 63 65 72 74 2c 70 6b 65 79 29 3b 0a 0a 09 09  (cert,pkey);....
151a0 6e 61 6d 65 3d 58 35 30 39 5f 67 65 74 5f 73 75  name=X509_get_su
151b0 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74 29  bject_name(cert)
151c0 3b 0a 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61  ;....X509_NAME_a
151d0 64 64 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28  dd_entry_by_txt(
151e0 6e 61 6d 65 2c 22 43 22 2c 20 4d 42 53 54 52 49  name,"C", MBSTRI
151f0 4e 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75  NG_ASC, (const u
15200 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20  nsigned char *) 
15210 6b 5f 43 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  k_C, -1, -1, 0);
15220 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
15230 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
15240 6d 65 2c 22 53 54 22 2c 20 4d 42 53 54 52 49 4e  me,"ST", MBSTRIN
15250 47 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e  G_ASC, (const un
15260 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b  signed char *) k
15270 5f 53 54 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b  _ST, -1, -1, 0);
15280 0a 09 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64  ...X509_NAME_add
15290 5f 65 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61  _entry_by_txt(na
152a0 6d 65 2c 22 4c 22 2c 20 4d 42 53 54 52 49 4e 47  me,"L", MBSTRING
152b0 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
152c0 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
152d0 4c 2c 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09  L, -1, -1, 0);..
152e0 09 58 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65  .X509_NAME_add_e
152f0 6e 74 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65  ntry_by_txt(name
15300 2c 22 4f 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41  ,"O", MBSTRING_A
15310 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  SC, (const unsig
15320 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 2c  ned char *) k_O,
15330 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
15340 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
15350 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
15360 4f 55 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  OU", MBSTRING_AS
15370 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
15380 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 4f 55 2c  ed char *) k_OU,
15390 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
153a0 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
153b0 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
153c0 43 4e 22 2c 20 4d 42 53 54 52 49 4e 47 5f 41 53  CN", MBSTRING_AS
153d0 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  C, (const unsign
153e0 65 64 20 63 68 61 72 20 2a 29 20 6b 5f 43 4e 2c  ed char *) k_CN,
153f0 20 2d 31 2c 20 2d 31 2c 20 30 29 3b 0a 09 09 58   -1, -1, 0);...X
15400 35 30 39 5f 4e 41 4d 45 5f 61 64 64 5f 65 6e 74  509_NAME_add_ent
15410 72 79 5f 62 79 5f 74 78 74 28 6e 61 6d 65 2c 22  ry_by_txt(name,"
15420 45 6d 61 69 6c 22 2c 20 4d 42 53 54 52 49 4e 47  Email", MBSTRING
15430 5f 41 53 43 2c 20 28 63 6f 6e 73 74 20 75 6e 73  _ASC, (const uns
15440 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 6b 5f  igned char *) k_
15450 45 6d 61 69 6c 2c 20 2d 31 2c 20 2d 31 2c 20 30  Email, -1, -1, 0
15460 29 3b 0a 0a 09 09 58 35 30 39 5f 73 65 74 5f 73  );....X509_set_s
15470 75 62 6a 65 63 74 5f 6e 61 6d 65 28 63 65 72 74  ubject_name(cert
15480 2c 6e 61 6d 65 29 3b 0a 0a 09 09 69 66 20 28 21  ,name);....if (!
15490 58 35 30 39 5f 73 69 67 6e 28 63 65 72 74 2c 70  X509_sign(cert,p
154a0 6b 65 79 2c 45 56 50 5f 73 68 61 32 35 36 28 29  key,EVP_sha256()
154b0 29 29 20 7b 0a 09 09 20 20 20 20 58 35 30 39 5f  )) {...    X509_
154c0 66 72 65 65 28 63 65 72 74 29 3b 0a 09 09 20 20  free(cert);...  
154d0 20 20 45 56 50 5f 50 4b 45 59 5f 66 72 65 65 28    EVP_PKEY_free(
154e0 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e 53  pkey);.#if OPENS
154f0 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45  SL_VERSION_NUMBE
15500 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c 0a  R < 0x30000000L.
15510 09 09 20 20 20 20 42 4e 5f 66 72 65 65 28 62 6e  ..    BN_free(bn
15520 65 29 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  e);.#endif...   
15530 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
15540 6e 74 65 72 70 2c 22 45 72 72 6f 72 20 73 69 67  nterp,"Error sig
15550 6e 69 6e 67 20 63 65 72 74 69 66 69 63 61 74 65  ning certificate
15560 22 2c 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 72  ",NULL);...    r
15570 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15580 0a 09 09 7d 0a 0a 09 09 69 66 20 28 69 73 53 74  ...}....if (isSt
15590 72 29 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  r) {...    out=B
155a0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 6d 65 6d  IO_new(BIO_s_mem
155b0 28 29 29 3b 0a 09 09 20 20 20 20 50 45 4d 5f 77  ());...    PEM_w
155c0 72 69 74 65 5f 62 69 6f 5f 58 35 30 39 28 6f 75  rite_bio_X509(ou
155d0 74 2c 63 65 72 74 29 3b 0a 09 09 20 20 20 20 69  t,cert);...    i
155e0 3d 42 49 4f 5f 72 65 61 64 28 6f 75 74 2c 62 75  =BIO_read(out,bu
155f0 66 66 65 72 2c 73 69 7a 65 6f 66 28 62 75 66 66  ffer,sizeof(buff
15600 65 72 29 2d 31 29 3b 0a 09 09 20 20 20 20 69 3d  er)-1);...    i=
15610 28 69 3c 30 29 20 3f 20 30 20 3a 20 69 3b 0a 09  (i<0) ? 0 : i;..
15620 09 20 20 20 20 62 75 66 66 65 72 5b 69 5d 3d 27  .    buffer[i]='
15630 5c 30 27 3b 0a 09 09 20 20 20 20 54 63 6c 5f 53  \0';...    Tcl_S
15640 65 74 56 61 72 28 69 6e 74 65 72 70 2c 70 65 6d  etVar(interp,pem
15650 6f 75 74 2c 62 75 66 66 65 72 2c 30 29 3b 0a 09  out,buffer,0);..
15660 09 20 20 20 20 42 49 4f 5f 66 6c 75 73 68 28 6f  .    BIO_flush(o
15670 75 74 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f 66  ut);...    BIO_f
15680 72 65 65 28 6f 75 74 29 3b 0a 09 09 7d 20 65 6c  ree(out);...} el
15690 73 65 20 7b 0a 09 09 20 20 20 20 6f 75 74 3d 42  se {...    out=B
156a0 49 4f 5f 6e 65 77 28 42 49 4f 5f 73 5f 66 69 6c  IO_new(BIO_s_fil
156b0 65 28 29 29 3b 0a 09 09 20 20 20 20 42 49 4f 5f  e());...    BIO_
156c0 77 72 69 74 65 5f 66 69 6c 65 6e 61 6d 65 28 6f  write_filename(o
156d0 75 74 2c 70 65 6d 6f 75 74 29 3b 0a 09 09 20 20  ut,pemout);...  
156e0 20 20 50 45 4d 5f 77 72 69 74 65 5f 62 69 6f 5f    PEM_write_bio_
156f0 58 35 30 39 28 6f 75 74 2c 63 65 72 74 29 3b 0a  X509(out,cert);.
15700 09 09 20 20 20 20 42 49 4f 5f 66 72 65 65 5f 61  ..    BIO_free_a
15710 6c 6c 28 6f 75 74 29 3b 0a 09 09 7d 0a 0a 09 09  ll(out);...}....
15720 58 35 30 39 5f 66 72 65 65 28 63 65 72 74 29 3b  X509_free(cert);
15730 0a 09 09 45 56 50 5f 50 4b 45 59 5f 66 72 65 65  ...EVP_PKEY_free
15740 28 70 6b 65 79 29 3b 0a 23 69 66 20 4f 50 45 4e  (pkey);.#if OPEN
15750 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42  SSL_VERSION_NUMB
15760 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 30 4c  ER < 0x30000000L
15770 0a 09 09 42 4e 5f 66 72 65 65 28 62 6e 65 29 3b  ...BN_free(bne);
15780 0a 23 65 6e 64 69 66 0a 09 20 20 20 20 7d 0a 09  .#endif..    }..
15790 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 64 65  }..break;.    de
157a0 66 61 75 6c 74 3a 0a 09 62 72 65 61 6b 3b 0a 20  fault:..break;. 
157b0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
157c0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 2a 2a  TCL_OK;.}.../***
157d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
157e0 2a 2f 0a 2f 2a 20 49 6e 69 74 20 20 20 20 20 20  */./* Init      
157f0 20 20 20 20 20 20 20 2a 2f 0a 2f 2a 2a 2a 2a 2a         */./*****
15800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15810 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
15820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
15860 20 54 6c 73 5f 46 72 65 65 20 2d 2d 0a 20 2a 0a   Tls_Free --. *.
15870 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75 72   *.This procedur
15880 65 20 63 6c 65 61 6e 73 20 75 70 20 77 68 65 6e  e cleans up when
15890 20 61 20 53 53 4c 20 73 6f 63 6b 65 74 20 62 61   a SSL socket ba
158a0 73 65 64 20 63 68 61 6e 6e 65 6c 0a 20 2a 09 69  sed channel. *.i
158b0 73 20 63 6c 6f 73 65 64 20 61 6e 64 20 69 74 73  s closed and its
158c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
158d0 20 66 61 6c 6c 73 20 62 65 6c 6f 77 20 31 0a 20   falls below 1. 
158e0 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
158f0 09 6e 6f 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65  .none. *. * Side
15900 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 46 72 65   effects:. *.Fre
15910 65 73 20 61 6c 6c 20 74 68 65 20 73 74 61 74 65  es all the state
15920 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
15930 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15940 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15950 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15960 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f  ---------. */.vo
15970 69 64 0a 54 6c 73 5f 46 72 65 65 28 74 6c 73 5f  id.Tls_Free(tls_
15980 66 72 65 65 5f 74 79 70 65 20 2a 62 6c 6f 63 6b  free_type *block
15990 50 74 72 29 20 7b 0a 20 20 20 20 53 74 61 74 65  Ptr) {.    State
159a0 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 53 74   *statePtr = (St
159b0 61 74 65 20 2a 29 62 6c 6f 63 6b 50 74 72 3b 0a  ate *)blockPtr;.
159c0 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61  .    dprintf("Ca
159d0 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 54 6c 73  lled");..    Tls
159e0 5f 43 6c 65 61 6e 28 73 74 61 74 65 50 74 72 29  _Clean(statePtr)
159f0 3b 0a 20 20 20 20 63 6b 66 72 65 65 28 62 6c 6f  ;.    ckfree(blo
15a00 63 6b 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20  ckPtr);.}.../*. 
15a10 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
15a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15a50 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 43  ----. *. * Tls_C
15a60 6c 65 61 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68  lean --. *. *.Th
15a70 69 73 20 70 72 6f 63 65 64 75 72 65 20 63 6c 65  is procedure cle
15a80 61 6e 73 20 75 70 20 77 68 65 6e 20 61 20 53 53  ans up when a SS
15a90 4c 20 73 6f 63 6b 65 74 20 62 61 73 65 64 20 63  L socket based c
15aa0 68 61 6e 6e 65 6c 0a 20 2a 09 69 73 20 63 6c 6f  hannel. *.is clo
15ab0 73 65 64 20 61 6e 64 20 69 74 73 20 72 65 66 65  sed and its refe
15ac0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 61 6c 6c  rence count fall
15ad0 73 20 62 65 6c 6f 77 20 31 2e 20 20 54 68 69 73  s below 1.  This
15ae0 20 73 68 6f 75 6c 64 0a 20 2a 09 62 65 20 63 61   should. *.be ca
15af0 6c 6c 65 64 20 73 79 6e 63 68 72 6f 6e 6f 75 73  lled synchronous
15b00 6c 79 20 62 79 20 74 68 65 20 43 6c 6f 73 65 50  ly by the CloseP
15b10 72 6f 63 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  roc, not in the.
15b20 20 2a 09 45 76 65 6e 74 75 61 6c 6c 79 46 72 65   *.EventuallyFre
15b30 65 20 63 61 6c 6c 62 61 63 6b 2e 0a 20 2a 0a 20  e callback.. *. 
15b40 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 6e 6f  * Results:. *.no
15b50 6e 65 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ne. *. * Side ef
15b60 66 65 63 74 73 3a 0a 20 2a 09 46 72 65 65 73 20  fects:. *.Frees 
15b70 61 6c 6c 20 74 68 65 20 73 74 61 74 65 0a 20 2a  all the state. *
15b80 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
15b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 76 6f 69 64 20  ------. */.void 
15bd0 54 6c 73 5f 43 6c 65 61 6e 28 53 74 61 74 65 20  Tls_Clean(State 
15be0 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20  *statePtr) {.   
15bf0 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64   dprintf("Called
15c00 22 29 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61  ");..    if (sta
15c10 74 65 50 74 72 2d 3e 73 73 6c 29 20 7b 0a 09 2f  tePtr->ssl) {../
15c20 2a 20 53 65 6e 64 20 63 6c 6f 73 65 5f 6e 6f 74  * Send close_not
15c30 69 66 79 20 6d 65 73 73 61 67 65 20 2a 2f 0a 09  ify message */..
15c40 64 70 72 69 6e 74 66 28 22 53 53 4c 5f 73 68 75  dprintf("SSL_shu
15c50 74 64 6f 77 6e 28 25 70 29 22 2c 20 73 74 61 74  tdown(%p)", stat
15c60 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 2f 2a 20  ePtr->ssl);../* 
15c70 57 69 6c 6c 20 72 65 74 75 72 6e 20 72 65 74 75  Will return retu
15c80 72 6e 20 30 20 77 68 69 6c 65 20 73 68 75 74 64  rn 0 while shutd
15c90 6f 77 6e 20 69 6e 20 70 72 6f 63 65 73 73 2c 20  own in process, 
15ca0 74 68 65 6e 20 31 20 77 68 65 6e 20 63 6f 6d 70  then 1 when comp
15cb0 6c 65 74 65 20 2a 2f 0a 09 2f 2a 20 63 6c 6f 73  lete */../* clos
15cc0 65 73 20 74 68 65 20 77 72 69 74 65 20 64 69 72  es the write dir
15cd0 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 6f  ection of the co
15ce0 6e 6e 65 63 74 69 6f 6e 3b 20 74 68 65 20 72 65  nnection; the re
15cf0 61 64 20 64 69 72 65 63 74 69 6f 6e 20 69 73 20  ad direction is 
15d00 63 6c 6f 73 65 64 20 62 79 20 74 68 65 20 70 65  closed by the pe
15d10 65 72 2e 20 2a 2f 0a 09 2f 2a 20 44 6f 65 73 20  er. */../* Does 
15d20 6e 6f 74 20 61 66 66 65 63 74 20 73 6f 63 6b 65  not affect socke
15d30 74 20 2a 2f 0a 09 53 53 4c 5f 73 68 75 74 64 6f  t */..SSL_shutdo
15d40 77 6e 28 73 74 61 74 65 50 74 72 2d 3e 73 73 6c  wn(statePtr->ssl
15d50 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
15d60 0a 20 20 20 20 20 2a 20 77 65 27 72 65 20 61 73  .     * we're as
15d70 73 75 6d 69 6e 67 20 68 65 72 65 20 74 68 61 74  suming here that
15d80 20 77 65 27 72 65 20 73 69 6e 67 6c 65 2d 74 68   we're single-th
15d90 72 65 61 64 65 64 0a 20 20 20 20 20 2a 2f 0a 20  readed.     */. 
15da0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15db0 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54  >timer != (Tcl_T
15dc0 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29  imerToken) NULL)
15dd0 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69   {..Tcl_DeleteTi
15de0 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65  merHandler(state
15df0 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74  Ptr->timer);..st
15e00 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20  atePtr->timer = 
15e10 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  NULL;.    }..   
15e20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 61 6c 6c 62   /* Remove callb
15e30 61 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 20 28  acks */.    if (
15e40 73 74 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61  statePtr->callba
15e50 63 6b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52  ck) {..Tcl_DecrR
15e60 65 66 43 6f 75 6e 74 28 73 74 61 74 65 50 74 72  efCount(statePtr
15e70 2d 3e 63 61 6c 6c 62 61 63 6b 29 3b 0a 09 73 74  ->callback);..st
15e80 61 74 65 50 74 72 2d 3e 63 61 6c 6c 62 61 63 6b  atePtr->callback
15e90 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20   = NULL;.    }. 
15ea0 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d     if (statePtr-
15eb0 3e 70 61 73 73 77 6f 72 64 29 20 7b 0a 09 54 63  >password) {..Tc
15ec0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73  l_DecrRefCount(s
15ed0 74 61 74 65 50 74 72 2d 3e 70 61 73 73 77 6f 72  tatePtr->passwor
15ee0 64 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 70  d);..statePtr->p
15ef0 61 73 73 77 6f 72 64 20 3d 20 4e 55 4c 4c 3b 0a  assword = NULL;.
15f00 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74      }.    if (st
15f10 61 74 65 50 74 72 2d 3e 76 63 6d 64 29 20 7b 0a  atePtr->vcmd) {.
15f20 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e  .Tcl_DecrRefCoun
15f30 74 28 73 74 61 74 65 50 74 72 2d 3e 76 63 6d 64  t(statePtr->vcmd
15f40 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 76 63  );..statePtr->vc
15f50 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  md = NULL;.    }
15f60 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50  ..    if (stateP
15f70 74 72 2d 3e 70 72 6f 74 6f 73 29 20 7b 0a 09 63  tr->protos) {..c
15f80 6b 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e  kfree(statePtr->
15f90 70 72 6f 74 6f 73 29 3b 0a 09 73 74 61 74 65 50  protos);..stateP
15fa0 74 72 2d 3e 70 72 6f 74 6f 73 20 3d 20 4e 55 4c  tr->protos = NUL
15fb0 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  L;.    }..    if
15fc0 20 28 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29   (statePtr->bio)
15fd0 20 7b 0a 09 2f 2a 20 54 68 69 73 20 77 69 6c 6c   {../* This will
15fe0 20 63 61 6c 6c 20 53 53 4c 5f 73 68 75 74 64 6f   call SSL_shutdo
15ff0 77 6e 2e 20 42 75 67 20 31 34 31 34 30 34 35 20  wn. Bug 1414045 
16000 2a 2f 0a 09 64 70 72 69 6e 74 66 28 22 42 49 4f  */..dprintf("BIO
16010 5f 66 72 65 65 5f 61 6c 6c 28 25 70 29 22 2c 20  _free_all(%p)", 
16020 73 74 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a  statePtr->bio);.
16030 09 42 49 4f 5f 66 72 65 65 5f 61 6c 6c 28 73 74  .BIO_free_all(st
16040 61 74 65 50 74 72 2d 3e 62 69 6f 29 3b 0a 09 73  atePtr->bio);..s
16050 74 61 74 65 50 74 72 2d 3e 62 69 6f 20 3d 20 4e  tatePtr->bio = N
16060 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ULL;.    }..    
16070 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 73  if (statePtr->ss
16080 6c 29 20 7b 0a 09 64 70 72 69 6e 74 66 28 22 53  l) {..dprintf("S
16090 53 4c 5f 66 72 65 65 28 25 70 29 22 2c 20 73 74  SL_free(%p)", st
160a0 61 74 65 50 74 72 2d 3e 73 73 6c 29 3b 0a 09 53  atePtr->ssl);..S
160b0 53 4c 5f 66 72 65 65 28 73 74 61 74 65 50 74 72  SL_free(statePtr
160c0 2d 3e 73 73 6c 29 3b 0a 09 73 74 61 74 65 50 74  ->ssl);..statePt
160d0 72 2d 3e 73 73 6c 20 3d 20 4e 55 4c 4c 3b 0a 20  r->ssl = NULL;. 
160e0 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 73 74     }..    if (st
160f0 61 74 65 50 74 72 2d 3e 63 74 78 29 20 7b 0a 09  atePtr->ctx) {..
16100 53 53 4c 5f 43 54 58 5f 66 72 65 65 28 73 74 61  SSL_CTX_free(sta
16110 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 09 73 74  tePtr->ctx);..st
16120 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55  atePtr->ctx = NU
16130 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64  LL;.    }..    d
16140 70 72 69 6e 74 66 28 22 52 65 74 75 72 6e 69 6e  printf("Returnin
16150 67 22 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  g");.}.../*. *--
16160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
161a0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 69 6c 64  ----. *. * Build
161b0 20 49 6e 66 6f 20 43 6f 6d 6d 61 6e 64 20 2d 2d   Info Command --
161c0 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 63 6f  . *. *.Create co
161d0 6d 6d 61 6e 64 20 74 6f 20 72 65 74 75 72 6e 20  mmand to return 
161e0 62 75 69 6c 64 20 69 6e 66 6f 20 66 6f 72 20 70  build info for p
161f0 61 63 6b 61 67 65 2e 0a 20 2a 0a 20 2a 20 52 65  ackage.. *. * Re
16200 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e  sults:. *.A stan
16210 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 0a  dard Tcl result.
16220 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
16230 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 64 20 62  ts:. *.Created b
16240 75 69 6c 64 2d 69 6e 66 6f 20 63 6f 6d 6d 61 6e  uild-info comman
16250 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  d.. *. *--------
16260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16290 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
162a0 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 54 52 49  */..#ifndef STRI
162b0 4e 47 49 46 59 0a 23 20 20 64 65 66 69 6e 65 20  NGIFY.#  define 
162c0 53 54 52 49 4e 47 49 46 59 28 78 29 20 53 54 52  STRINGIFY(x) STR
162d0 49 4e 47 49 46 59 31 28 78 29 0a 23 20 20 64 65  INGIFY1(x).#  de
162e0 66 69 6e 65 20 53 54 52 49 4e 47 49 46 59 31 28  fine STRINGIFY1(
162f0 78 29 20 23 78 0a 23 65 6e 64 69 66 0a 0a 69 6e  x) #x.#endif..in
16300 74 0a 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61  t.BuildInfoComma
16310 6e 64 28 54 63 6c 5f 49 6e 74 65 72 70 2a 20 69  nd(Tcl_Interp* i
16320 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c  nterp) {.    Tcl
16330 5f 43 6d 64 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  _CmdInfo info;..
16340 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43      if (Tcl_GetC
16350 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72  ommandInfo(inter
16360 70 2c 20 22 3a 3a 74 63 6c 3a 3a 62 75 69 6c 64  p, "::tcl::build
16370 2d 69 6e 66 6f 22 2c 20 26 69 6e 66 6f 29 29 20  -info", &info)) 
16380 7b 0a 09 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a  {..Tcl_CreateObj
16390 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
163a0 22 3a 3a 74 6c 73 3a 3a 62 75 69 6c 64 2d 69 6e  "::tls::build-in
163b0 66 6f 22 2c 20 69 6e 66 6f 2e 6f 62 6a 50 72 6f  fo", info.objPro
163c0 63 2c 20 28 76 6f 69 64 20 2a 29 28 0a 09 09 50  c, (void *)(...P
163d0 41 43 4b 41 47 45 5f 56 45 52 53 49 4f 4e 20 22  ACKAGE_VERSION "
163e0 2b 22 20 53 54 52 49 4e 47 49 46 59 28 54 4c 53  +" STRINGIFY(TLS
163f0 5f 56 45 52 53 49 4f 4e 5f 55 55 49 44 29 0a 23  _VERSION_UUID).#
16400 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63 6c 61  if defined(__cla
16410 6e 67 5f 5f 29 20 26 26 20 64 65 66 69 6e 65 64  ng__) && defined
16420 28 5f 5f 63 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f  (__clang_major__
16430 29 0a 09 09 09 20 20 20 20 22 2e 63 6c 61 6e 67  )....    ".clang
16440 2d 22 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 63  -" STRINGIFY(__c
16450 6c 61 6e 67 5f 6d 61 6a 6f 72 5f 5f 29 0a 23 69  lang_major__).#i
16460 66 20 5f 5f 63 6c 61 6e 67 5f 6d 69 6e 6f 72 5f  f __clang_minor_
16470 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22 30  _ < 10....    "0
16480 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20 20  ".#endif....    
16490 53 54 52 49 4e 47 49 46 59 28 5f 5f 63 6c 61 6e  STRINGIFY(__clan
164a0 67 5f 6d 69 6e 6f 72 5f 5f 29 0a 23 65 6e 64 69  g_minor__).#endi
164b0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  f.#if defined(__
164c0 63 70 6c 75 73 70 6c 75 73 29 20 26 26 20 21 64  cplusplus) && !d
164d0 65 66 69 6e 65 64 28 5f 5f 4f 42 4a 43 5f 5f 29  efined(__OBJC__)
164e0 0a 09 09 09 20 20 20 20 22 2e 63 70 6c 75 73 70  ....    ".cplusp
164f0 6c 75 73 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e  lus".#endif.#ifn
16500 64 65 66 20 4e 44 45 42 55 47 0a 09 09 09 20 20  def NDEBUG....  
16510 20 20 22 2e 64 65 62 75 67 22 0a 23 65 6e 64 69    ".debug".#endi
16520 66 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  f.#if !defined(_
16530 5f 63 6c 61 6e 67 5f 5f 29 20 26 26 20 21 64 65  _clang__) && !de
16540 66 69 6e 65 64 28 5f 5f 49 4e 54 45 4c 5f 43 4f  fined(__INTEL_CO
16550 4d 50 49 4c 45 52 29 20 26 26 20 64 65 66 69 6e  MPILER) && defin
16560 65 64 28 5f 5f 47 4e 55 43 5f 5f 29 0a 09 09 09  ed(__GNUC__)....
16570 20 20 20 20 22 2e 67 63 63 2d 22 20 53 54 52 49      ".gcc-" STRI
16580 4e 47 49 46 59 28 5f 5f 47 4e 55 43 5f 5f 29 0a  NGIFY(__GNUC__).
16590 23 69 66 20 5f 5f 47 4e 55 43 5f 4d 49 4e 4f 52  #if __GNUC_MINOR
165a0 5f 5f 20 3c 20 31 30 0a 09 09 09 20 20 20 20 22  __ < 10....    "
165b0 30 22 0a 23 65 6e 64 69 66 0a 09 09 09 20 20 20  0".#endif....   
165c0 20 53 54 52 49 4e 47 49 46 59 28 5f 5f 47 4e 55   STRINGIFY(__GNU
165d0 43 5f 4d 49 4e 4f 52 5f 5f 29 0a 23 65 6e 64 69  C_MINOR__).#endi
165e0 66 0a 23 69 66 64 65 66 20 5f 5f 49 4e 54 45 4c  f.#ifdef __INTEL
165f0 5f 43 4f 4d 50 49 4c 45 52 0a 09 09 09 20 20 20  _COMPILER....   
16600 20 22 2e 69 63 63 2d 22 20 53 54 52 49 4e 47 49   ".icc-" STRINGI
16610 46 59 28 5f 5f 49 4e 54 45 4c 5f 43 4f 4d 50 49  FY(__INTEL_COMPI
16620 4c 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  LER).#endif.#ifd
16630 65 66 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47  ef TCL_MEM_DEBUG
16640 0a 09 09 09 20 20 20 20 22 2e 6d 65 6d 64 65 62  ....    ".memdeb
16650 75 67 22 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ug".#endif.#if d
16660 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
16670 0a 09 09 09 20 20 20 20 22 2e 6d 73 76 63 2d 22  ....    ".msvc-"
16680 20 53 54 52 49 4e 47 49 46 59 28 5f 4d 53 43 5f   STRINGIFY(_MSC_
16690 56 45 52 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  VER).#endif.#ifd
166a0 65 66 20 55 53 45 5f 4e 4d 41 4b 45 0a 09 09 09  ef USE_NMAKE....
166b0 20 20 20 20 22 2e 6e 6d 61 6b 65 22 0a 23 65 6e      ".nmake".#en
166c0 64 69 66 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f  dif.#ifndef TCL_
166d0 43 46 47 5f 4f 50 54 49 4d 49 5a 45 44 0a 09 09  CFG_OPTIMIZED...
166e0 09 20 20 20 20 22 2e 6e 6f 2d 6f 70 74 69 6d 69  .    ".no-optimi
166f0 7a 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ze".#endif.#ifde
16700 66 20 5f 5f 4f 42 4a 43 5f 5f 0a 09 09 09 20 20  f __OBJC__....  
16710 20 20 22 2e 6f 62 6a 65 63 74 69 76 65 2d 63 22    ".objective-c"
16720 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 63  .#if defined(__c
16730 70 6c 75 73 70 6c 75 73 29 0a 09 09 09 20 20 20  plusplus)....   
16740 20 22 70 6c 75 73 70 6c 75 73 22 0a 23 65 6e 64   "plusplus".#end
16750 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  if.#endif.#ifdef
16760 20 54 43 4c 5f 43 46 47 5f 50 52 4f 46 49 4c 45   TCL_CFG_PROFILE
16770 44 0a 09 09 09 20 20 20 20 22 2e 70 72 6f 66 69  D....    ".profi
16780 6c 65 22 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  le".#endif.#ifde
16790 66 20 50 55 52 49 46 59 0a 09 09 09 20 20 20 20  f PURIFY....    
167a0 22 2e 70 75 72 69 66 79 22 0a 23 65 6e 64 69 66  ".purify".#endif
167b0 0a 23 69 66 64 65 66 20 53 54 41 54 49 43 5f 42  .#ifdef STATIC_B
167c0 55 49 4c 44 0a 09 09 09 20 20 20 20 22 2e 73 74  UILD....    ".st
167d0 61 74 69 63 22 0a 23 65 6e 64 69 66 0a 09 09 29  atic".#endif...)
167e0 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20  , NULL);.    }. 
167f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
16800 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
16810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16840 2d 2a 0a 20 2a 0a 20 2a 20 54 6c 73 4c 69 62 53  -*. *. * TlsLibS
16850 68 75 74 64 6f 77 6e 20 2d 2d 0a 20 2a 0a 20 2a  hutdown --. *. *
16860 09 53 68 75 74 64 6f 77 6e 20 53 53 4c 20 6c 69  .Shutdown SSL li
16870 62 72 61 72 79 20 6f 6e 63 65 20 70 65 72 20 61  brary once per a
16880 70 70 6c 69 63 61 74 69 6f 6e 0a 20 2a 0a 20 2a  pplication. *. *
16890 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73   Results:. *.A s
168a0 74 61 6e 64 61 72 64 20 54 43 4c 20 72 65 73 75  tandard TCL resu
168b0 6c 74 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  lt. *. * Side ef
168c0 66 65 63 74 73 3a 0a 20 2a 09 53 68 75 74 64 6f  fects:. *.Shutdo
168d0 77 6e 20 53 53 4c 20 6c 69 62 72 61 72 79 0a 20  wn SSL library. 
168e0 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
168f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 2f 0a  ----------*. */.
16920 73 74 61 74 69 63 20 69 6e 74 20 54 6c 73 4c 69  static int TlsLi
16930 62 53 68 75 74 64 6f 77 6e 28 43 6c 69 65 6e 74  bShutdown(Client
16940 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29  Data clientData)
16950 20 7b 0a 20 20 20 20 42 49 4f 5f 63 6c 65 61 6e   {.    BIO_clean
16960 75 70 28 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  up();.    return
16970 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20   TCL_OK;.}../*. 
16980 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
16990 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
169b0 2d 2d 2d 2d 2d 2d 2d 2a 0a 20 2a 0a 20 2a 09 54  -------*. *. *.T
169c0 6c 73 4c 69 62 49 6e 69 74 20 2d 2d 0a 20 2a 0a  lsLibInit --. *.
169d0 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 53   *.Initializes S
169e0 53 4c 20 6c 69 62 72 61 72 79 20 6f 6e 63 65 20  SL library once 
169f0 70 65 72 20 61 70 70 6c 69 63 61 74 69 6f 6e 0a  per application.
16a00 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
16a10 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c  *.A standard Tcl
16a20 20 72 65 73 75 6c 74 0a 20 2a 0a 20 2a 20 53 69   result. *. * Si
16a30 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 49  de effects:. *.I
16a40 6e 69 74 69 61 6c 69 7a 65 73 20 53 53 4c 20 6c  nitializes SSL l
16a50 69 62 72 61 72 79 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ibrary. *. *----
16a60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16a90 2d 2d 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  --*. */.static i
16aa0 6e 74 20 54 6c 73 4c 69 62 49 6e 69 74 28 29 20  nt TlsLibInit() 
16ab0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e 74  {.    static int
16ac0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30   initialized = 0
16ad0 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  ;..    dprintf("
16ae0 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 69  Called");..    i
16af0 66 20 28 21 69 6e 69 74 69 61 6c 69 7a 65 64 29  f (!initialized)
16b00 20 7b 0a 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a   {../* Initializ
16b10 65 20 42 4f 54 48 20 6c 69 62 63 72 79 70 74 6f  e BOTH libcrypto
16b20 20 61 6e 64 20 6c 69 62 73 73 6c 2e 20 2a 2f 0a   and libssl. */.
16b30 09 69 66 20 28 21 4f 50 45 4e 53 53 4c 5f 69 6e  .if (!OPENSSL_in
16b40 69 74 5f 73 73 6c 28 4f 50 45 4e 53 53 4c 5f 49  it_ssl(OPENSSL_I
16b50 4e 49 54 5f 4c 4f 41 44 5f 53 53 4c 5f 53 54 52  NIT_LOAD_SSL_STR
16b60 49 4e 47 53 20 7c 20 4f 50 45 4e 53 53 4c 5f 49  INGS | OPENSSL_I
16b70 4e 49 54 5f 4c 4f 41 44 5f 43 52 59 50 54 4f 5f  NIT_LOAD_CRYPTO_
16b80 53 54 52 49 4e 47 53 0a 09 20 20 20 20 7c 20 4f  STRINGS..    | O
16b90 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f  PENSSL_INIT_ADD_
16ba0 41 4c 4c 5f 43 49 50 48 45 52 53 20 7c 20 4f 50  ALL_CIPHERS | OP
16bb0 45 4e 53 53 4c 5f 49 4e 49 54 5f 41 44 44 5f 41  ENSSL_INIT_ADD_A
16bc0 4c 4c 5f 44 49 47 45 53 54 53 0a 09 20 20 20 20  LL_DIGESTS..    
16bd0 7c 20 4f 50 45 4e 53 53 4c 5f 49 4e 49 54 5f 4c  | OPENSSL_INIT_L
16be0 4f 41 44 5f 43 4f 4e 46 49 47 20 7c 20 4f 50 45  OAD_CONFIG | OPE
16bf0 4e 53 53 4c 5f 49 4e 49 54 5f 41 53 59 4e 43 2c  NSSL_INIT_ASYNC,
16c00 20 4e 55 4c 4c 29 29 20 7b 0a 09 20 20 20 20 72   NULL)) {..    r
16c10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16c20 0a 09 7d 0a 0a 09 2f 2a 20 43 72 65 61 74 65 20  ..}.../* Create 
16c30 42 49 4f 20 68 61 6e 64 6c 65 72 73 20 2a 2f 0a  BIO handlers */.
16c40 09 42 49 4f 5f 6e 65 77 5f 74 63 6c 28 4e 55 4c  .BIO_new_tcl(NUL
16c50 4c 2c 20 30 29 3b 0a 09 0a 09 2f 2a 20 43 72 65  L, 0);..../* Cre
16c60 61 74 65 20 65 78 69 74 20 68 61 6e 64 6c 65 72  ate exit handler
16c70 20 2a 2f 0a 09 54 63 6c 5f 43 72 65 61 74 65 45   */..Tcl_CreateE
16c80 78 69 74 48 61 6e 64 6c 65 72 28 54 6c 73 4c 69  xitHandler(TlsLi
16c90 62 53 68 75 74 64 6f 77 6e 2c 20 4e 55 4c 4c 29  bShutdown, NULL)
16ca0 3b 0a 09 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d  ;..initialized =
16cb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   1;.    }.    re
16cc0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
16cd0 0a 2f 2a 20 49 6e 69 74 20 73 63 72 69 70 74 20  ./* Init script 
16ce0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
16cf0 63 68 61 72 20 74 6c 73 54 63 6c 49 6e 69 74 53  char tlsTclInitS
16d00 63 72 69 70 74 5b 5d 20 3d 20 7b 0a 23 69 6e 63  cript[] = {.#inc
16d10 6c 75 64 65 20 22 74 6c 73 2e 74 63 6c 2e 68 22  lude "tls.tcl.h"
16d20 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .};../*. *------
16d30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
16d70 0a 20 2a 20 54 6c 73 5f 49 6e 69 74 20 2d 2d 0a  . * Tls_Init --.
16d80 20 2a 0a 20 2a 09 54 68 69 73 20 69 73 20 61 20   *. *.This is a 
16d90 70 61 63 6b 61 67 65 20 69 6e 69 74 69 61 6c 69  package initiali
16da0 7a 61 74 69 6f 6e 20 70 72 6f 63 65 64 75 72 65  zation procedure
16db0 2c 20 77 68 69 63 68 20 69 73 20 63 61 6c 6c 65  , which is calle
16dc0 64 0a 20 2a 09 62 79 20 54 43 4c 20 77 68 65 6e  d. *.by TCL when
16dd0 20 74 68 69 73 20 70 61 63 6b 61 67 65 20 69 73   this package is
16de0 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
16df0 61 6e 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a  an interpreter..
16e00 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
16e10 2a 09 49 6e 69 74 69 61 6c 69 7a 65 73 20 73 74  *.Initializes st
16e20 72 75 63 74 75 72 65 73 20 61 6e 64 20 63 72 65  ructures and cre
16e30 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20  ates commands.. 
16e40 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74  *. * Side effect
16e50 73 3a 0a 20 2a 09 20 43 72 65 61 74 65 20 74 68  s:. *. Create th
16e60 65 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a  e commands. *. *
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 2d  ----------------
16e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16ea0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16eb0 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 20 54 43 4c  ---. */..#if TCL
16ec0 5f 4d 41 4a 4f 52 5f 56 45 52 53 49 4f 4e 20 3e  _MAJOR_VERSION >
16ed0 20 38 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56   8.#define MIN_V
16ee0 45 52 53 49 4f 4e 20 22 39 2e 30 22 0a 23 65 6c  ERSION "9.0".#el
16ef0 73 65 0a 23 64 65 66 69 6e 65 20 4d 49 4e 5f 56  se.#define MIN_V
16f00 45 52 53 49 4f 4e 20 22 38 2e 35 22 0a 23 65 6e  ERSION "8.5".#en
16f10 64 69 66 0a 0a 44 4c 4c 45 58 50 4f 52 54 20 69  dif..DLLEXPORT i
16f20 6e 74 20 54 6c 73 5f 49 6e 69 74 28 54 63 6c 5f  nt Tls_Init(Tcl_
16f30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20  Interp *interp) 
16f40 7b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22  {..    dprintf("
16f50 43 61 6c 6c 65 64 22 29 3b 0a 0a 23 69 66 64 65  Called");..#ifde
16f60 66 20 55 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a  f USE_TCL_STUBS.
16f70 20 20 20 20 69 66 20 28 54 63 6c 5f 49 6e 69 74      if (Tcl_Init
16f80 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 4d 49  Stubs(interp, MI
16f90 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d 3d  N_VERSION, 0) ==
16fa0 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
16fb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
16fc0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 20  }.#endif.    if 
16fd0 28 54 63 6c 5f 50 6b 67 52 65 71 75 69 72 65 28  (Tcl_PkgRequire(
16fe0 69 6e 74 65 72 70 2c 20 22 54 63 6c 22 2c 20 4d  interp, "Tcl", M
16ff0 49 4e 5f 56 45 52 53 49 4f 4e 2c 20 30 29 20 3d  IN_VERSION, 0) =
17000 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
17010 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
17020 20 7d 0a 0a 20 20 20 20 69 66 20 28 54 6c 73 4c   }..    if (TlsL
17030 69 62 49 6e 69 74 28 29 20 21 3d 20 54 43 4c 5f  ibInit() != TCL_
17040 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  OK) {..Tcl_Appen
17050 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
17060 22 63 6f 75 6c 64 20 6e 6f 74 20 69 6e 69 74 69  "could not initi
17070 61 6c 69 7a 65 20 53 53 4c 20 6c 69 62 72 61 72  alize SSL librar
17080 79 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c  y", (char *) NUL
17090 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f  L);..return TCL_
170a0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  ERROR;.    }..  
170b0 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43    Tcl_CreateObjC
170c0 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22  ommand(interp, "
170d0 3a 3a 74 6c 73 3a 3a 63 69 70 68 65 72 73 22 2c  ::tls::ciphers",
170e0 20 43 69 70 68 65 72 73 4f 62 6a 43 6d 64 2c 20   CiphersObjCmd, 
170f0 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c  (ClientData) NUL
17100 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74  L, (Tcl_CmdDelet
17110 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a  eProc *) NULL);.
17120 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62      Tcl_CreateOb
17130 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c  jCommand(interp,
17140 20 22 3a 3a 74 6c 73 3a 3a 63 6f 6e 6e 65 63 74   "::tls::connect
17150 69 6f 6e 22 2c 20 43 6f 6e 6e 65 63 74 69 6f 6e  ion", Connection
17160 49 6e 66 6f 4f 62 6a 43 6d 64 2c 20 28 43 6c 69  InfoObjCmd, (Cli
17170 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28  entData) NULL, (
17180 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f  Tcl_CmdDeletePro
17190 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20  c *) NULL);.    
171a0 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d  Tcl_CreateObjCom
171b0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a  mand(interp, "::
171c0 74 6c 73 3a 3a 68 61 6e 64 73 68 61 6b 65 22 2c  tls::handshake",
171d0 20 48 61 6e 64 73 68 61 6b 65 4f 62 6a 43 6d 64   HandshakeObjCmd
171e0 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
171f0 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
17200 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
17210 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
17220 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
17230 70 2c 20 22 3a 3a 74 6c 73 3a 3a 69 6d 70 6f 72  p, "::tls::impor
17240 74 22 2c 20 49 6d 70 6f 72 74 4f 62 6a 43 6d 64  t", ImportObjCmd
17250 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e  , (ClientData) N
17260 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c  ULL, (Tcl_CmdDel
17270 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29  eteProc *) NULL)
17280 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65  ;.    Tcl_Create
17290 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
172a0 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 69 6d 70  p, "::tls::unimp
172b0 6f 72 74 22 2c 20 55 6e 69 6d 70 6f 72 74 4f 62  ort", UnimportOb
172c0 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74  jCmd, (ClientDat
172d0 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d  a) NULL, (Tcl_Cm
172e0 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
172f0 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
17300 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
17310 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 75  nterp, "::tls::u
17320 6e 73 74 61 63 6b 22 2c 20 55 6e 69 6d 70 6f 72  nstack", Unimpor
17330 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  tObjCmd, (Client
17340 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
17350 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
17360 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
17370 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
17380 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
17390 3a 3a 73 74 61 74 75 73 22 2c 20 53 74 61 74 75  ::status", Statu
173a0 73 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74  sObjCmd, (Client
173b0 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c  Data) NULL, (Tcl
173c0 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a  _CmdDeleteProc *
173d0 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c  ) NULL);.    Tcl
173e0 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
173f0 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73  d(interp, "::tls
17400 3a 3a 76 65 72 73 69 6f 6e 22 2c 20 56 65 72 73  ::version", Vers
17410 69 6f 6e 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65  ionObjCmd, (Clie
17420 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54  ntData) NULL, (T
17430 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63  cl_CmdDeleteProc
17440 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54   *) NULL);.    T
17450 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d  cl_CreateObjComm
17460 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74  and(interp, "::t
17470 6c 73 3a 3a 6d 69 73 63 22 2c 20 4d 69 73 63 4f  ls::misc", MiscO
17480 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61  bjCmd, (ClientDa
17490 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43  ta) NULL, (Tcl_C
174a0 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20  mdDeleteProc *) 
174b0 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43  NULL);.    Tcl_C
174c0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
174d0 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a  interp, "::tls::
174e0 70 72 6f 74 6f 63 6f 6c 73 22 2c 20 50 72 6f 74  protocols", Prot
174f0 6f 63 6f 6c 73 4f 62 6a 43 6d 64 2c 20 28 43 6c  ocolsObjCmd, (Cl
17500 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20  ientData) NULL, 
17510 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
17520 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 0a 20 20  oc *) NULL);..  
17530 20 20 42 75 69 6c 64 49 6e 66 6f 43 6f 6d 6d 61    BuildInfoComma
17540 6e 64 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20  nd(interp);..   
17550 20 69 66 20 28 69 6e 74 65 72 70 20 26 26 20 54   if (interp && T
17560 63 6c 5f 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  cl_Eval(interp, 
17570 74 6c 73 54 63 6c 49 6e 69 74 53 63 72 69 70 74  tlsTclInitScript
17580 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  ) != TCL_OK) {..
17590 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
175a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
175b0 75 72 6e 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69  urn Tcl_PkgProvi
175c0 64 65 28 69 6e 74 65 72 70 2c 20 50 41 43 4b 41  de(interp, PACKA
175d0 47 45 5f 4e 41 4d 45 2c 20 50 41 43 4b 41 47 45  GE_NAME, PACKAGE
175e0 5f 56 45 52 53 49 4f 4e 29 3b 0a 7d 0a 0a 2f 2a  _VERSION);.}../*
175f0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
17600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17630 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 09 54 6c 73  ------. *. *.Tls
17640 5f 53 61 66 65 49 6e 69 74 20 2d 2d 0a 20 2a 0a  _SafeInit --. *.
17650 20 2a 09 54 68 69 73 20 69 73 20 61 20 70 61 63   *.This is a pac
17660 6b 61 67 65 20 69 6e 69 74 69 61 6c 69 7a 61 74  kage initializat
17670 69 6f 6e 20 70 72 6f 63 65 64 75 72 65 20 66 6f  ion procedure fo
17680 72 20 73 61 66 65 20 69 6e 74 65 72 70 73 2e 0a  r safe interps..
17690 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
176a0 2a 09 53 61 6d 65 20 61 73 20 6f 66 20 27 54 6c  *.Same as of 'Tl
176b0 73 5f 49 6e 69 74 27 0a 20 2a 0a 20 2a 20 53 69  s_Init'. *. * Si
176c0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53  de effects:. *.S
176d0 61 6d 65 20 61 73 20 6f 66 20 27 54 6c 73 5f 49  ame as of 'Tls_I
176e0 6e 69 74 27 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  nit'. *. *------
176f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17700 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17710 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
17730 2f 0a 44 4c 4c 45 58 50 4f 52 54 20 69 6e 74 20  /.DLLEXPORT int 
17740 54 6c 73 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  Tls_SafeInit(Tcl
17750 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
17760 20 7b 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22   {.    dprintf("
17770 43 61 6c 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  Called");.    re
17780 74 75 72 6e 20 54 6c 73 5f 49 6e 69 74 28 69 6e  turn Tls_Init(in
17790 74 65 72 70 29 3b 0a 7d 0a                       terp);.}.